상황에 맞는 문법 및 유형


25

1) 정적 타이핑과 공식 문법 사이의 관계는 무엇입니까?

2) 특히, 선형 바운드 오토 마톤이 C ++ 또는 SML 프로그램의 유형이 올바른지 확인할 수 있습니까? 중첩 된 스택 오토 마톤?

3) 정식 문법 용어로 정적 타이핑 규칙을 표현하는 자연스러운 방법이 있습니까?

답변:


20

선형 경계 오토마타가 C ++ 프로그램인지 여부를 확인하는 것은 불가능하며 LBA가 SML 프로그램의 유형이 올바른지 여부를 확인하는 것은 불가능합니다. C ++에는 임의의 프로그램을 템플릿 메타 프로그램으로 코딩 할 수 있으므로 Turing-complete 유형 시스템이 있습니다.

SML이 더 흥미 롭습니다. 결정 가능한 유형 검사가 있지만 문제는 EXPTIME 완료입니다. 따라서 복잡성 계층 구조에서 매우 놀라운 붕괴가 없다면 LBA가이를 확인하지는 못할 것입니다. 그 이유는 SML에 형식 유추가 필요하고 유형이 프로그램의 크기보다 훨씬 빠르게 증가하는 프로그램 계열이 있기 때문입니다. 예를 들어 다음 프로그램을 고려하십시오.

fun delta x = (x, x)        (* this has type 'a -> ('a * 'a), so its return value
                               has a type double the size of its argument *)

fun f1 x = delta (delta x)  (* Now we use functions to iterate this process *)
fun f2 x = f1 (f1 x)        
fun f3 x = f2 (f2 x)        (* This function has a HUGE type *)

C 또는 Pascal과 같은 더 간단한 유형의 시스템의 경우 LBA가이를 확인할 수 있다고 생각합니다.

프로그래밍 언어 연구 초기에 사람들은 종종 van Wingaarden 문법 (일명 2 단계 문법)을 사용하여 프로그래밍 언어의 유형 시스템을 지정했습니다. Algol 68이 이런 식으로 지정되었다고 생각합니다. 그러나 나는이 기법이 실질적으로 실용적인 이유로 포기되었다고 들었습니다. (일반적으로 사람들이 쓴 문법은 의도 한 것보다 더 큰 언어를 생성했습니다.)

요즘 사람들은 개략적 인 추론 규칙을 사용하여 유형 시스템을 지정합니다. 이는 기본적으로 술어를 Horn 절 컬렉션의 최소 고정 소수점으로 지정하는 방법입니다. 1 차 혼 이론에 대한 만족도는 일반적으로 결정하기 어렵 기 때문에, 유형 이론가들이하는 모든 것을 포착하고자한다면, 선택한 문법 형식이 실제로 편리한 것보다 강할 것입니다.

속성 문법사용하여 유형 시스템을 구현 하는 작업 이 있다는 것을 알고 있습니다. 그들은이 선택에 대한 몇 가지 소프트웨어 엔지니어링 이점이 있다고 주장합니다. 즉, 속성 문법은 정보 흐름을 매우 엄격하게 제어하므로 프로그램 이해가 쉬워집니다.


4

내가 아는 한 흥미로운 경우에는 유형 정확성이 결정하기 어려운 경향이 있으므로 공식 문법은 생각할 수있는 모든 유형 시스템을 포착 할 수 없습니다.

나는 주요 컴파일러 발전기는 술어가되지 않는 경우 실행되는 규칙을 방지 규칙에 대한 임의의 술어가 평가 할 수 있음을 알고 true예를 들어, { type(e1) == type(e2) } (expression e1) '+' (expression e2). 이 개념은 쉽게 공식화 될 수 있습니다. 허용 된 술어에 대한 적절한 제한은 LBA에 의한 결정 가능성을 산출 할 수 있습니다.

케이케이+1

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.