의존형에 대한 컴파일러는 정수기보다 훨씬 더 어렵습니까?


12

이 튜토리얼 과 같이 종속 유형 구현에 대해 배우고 있지만 대부분은 통역사를 구현하고 있습니다. 내 질문은 의존 유형에 대한 컴파일러를 구현하는 것이 컴파일러보다 훨씬 어렵다는 것입니다. 유형 확인을 위해 종속 유형 인수를 실제로 평가할 수 있기 때문입니다.

그래서

  • 순진한 인상이 맞습니까?
  • 맞다면 의존 유형을 지원하는 정적으로 검사 된 언어를 구현하는 것에 대한 예제 / 리소스가 있습니까?

아니오, 종속 유형 컴파일 문제점을 알려진 문제점으로 줄일 수 있으므로 다음을 수행하십시오. (1) 인터프리터를 사용하여 프로그램을 유형 점검하십시오. (2) 프로그램을 OCaml / Haskell / 무엇으로 추출; (3) ocamlopt또는 GHC를 사용하여 컴파일 :-) (이것은 Coq and Agda 접근법입니다.)
xrq

답변:


13

이것은 흥미로운 질문입니다! Anthony의 대답에서 알 수 있듯이 유형 검사에 대한 용어를 평가할 통역사가 이미 있다면 비 종속 기능 언어를 컴파일하는 일반적인 방법을 사용할 수 있습니다 .

이것이 Edwin Brady가 취한 접근법입니다. 이제 이것은 개념적으로 간단하지만 형식 검사를 수행 할 때 컴파일의 속도 이점을 잃습니다. 이것은 여러 가지 방식으로 해결되었습니다.

먼저 변환 검사를 수행하기 위해 항을 바이트 코드로 컴파일하는 가상 머신을 구현할 수 있습니다. 이것은 Benjamin Gregoirevm_compute 가 Coq에서 구현 한 아이디어 입니다. 명백하게도 이 정확한 주제에 더크 Kleeblatt에 의해 논문하지만 실제 기계 코드가 아닌 가상 머신 다운.

둘째,보다 전통적인 언어로 코드를 생성 할 수 있으며, 실행시 의존적으로 유형이 지정된 프로그램을 타입 검사하는 데 필요한 모든 변환을 검사한다. 즉, Haskell을 사용하여 Agda 모듈을 유형 검사 할 수 있습니다. 코드를 컴파일하고 실행할 수 있으며, 허용되는 경우 종속 형식 언어의 코드는 형식이 잘 설정된 것으로 가정 할 수 있습니다 (구현 및 컴파일러 오류 제외). 나는 Mathieu Boesflug가 제안한이 접근법을 처음 들었습니다 .


1
약간의 혀를 내밀기 : 타입 검사를하는 인터프리터가 있다면 왜 컴파일러를 작성해야합니까? 결국, 의존적으로 유형이 지정된 프로그래밍 언어를 사용하는 대부분의 (모든?) 진지한 사용자는 언어를 증거 보조자로 사용하여 유형 검사기에 대해서만 관심을 갖습니다. 나는 실제로 내 Agda 또는 Coq 프로그램을 실행 한 적이 없다. 속도에 관심이 있다면 타입 변환을 컴파일하고 싶지 않습니까?
Martin Berger

2
솔루션 2와 3은이 문제를 해결합니다. 형식이 올바른지 확인하고 특히 형식 변환을 수행하는 코드를 컴파일합니다. 두 번째는 실제로 어떤 상황에서는 의존적으로 유형이 지정된 코드를 실행하고 싶다는 것입니다 (Idris, Ur / Web 참조).
코디

1
또한 어느 정도 솔루션 1은 인터프리터와 컴파일러 사이의 경계를 흐리게하여 해결합니다.
코디

1
futurama 프로젝션 기술을 사용하여 인터프리터 속도를 높이고 컴파일러로 효과적으로 끝낼 수 있는지 궁금합니다 .
Steven Shaw

1
내가 본 유일한 것은 Unison unisonweb.org/2017-10-13/scala-world.html
Steven Shaw

10

Edwin Brady의 PhD 논문 은 의존적으로 유형이 지정된 프로그래밍 언어를위한 컴파일러를 구성하는 방법을 간략하게 설명합니다. 나는 전문가는 아니지만 System F와 같은 컴파일러를 구현하는 것보다별로 어렵지 않다고 말하고 싶습니다. 많은 원칙들이 매우 유사하고 일부는 동일합니다 (예 : 수퍼 콤비 네이터 컴파일).

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