2012-01-19 2 views
5

GHC 코어를 생성하는 간단한 언어에 대한 프론트 엔드를 만들고 싶습니다. 그런 다음이 출력을 받아 정상적인 GHC 파이프 라인을 통해 실행하고 싶습니다. this page에 따르면 ghc 명령으로 직접 가능하지 않습니다. 나는 어떤 방법이 있는지 궁금합니다.GHC 코어로 컴파일

ghc-api에 대한 몇 가지 함수 호출이 이상적이지만 GHC 소스에 (너무 광범위하지 않은) 해킹을 포함하는 제안이 열려 있습니다. 모든 포인터가 도움이 될 것입니다!

+0

"현재 (버전 6.8.2 현재) GHC는 외부 코어 파일을 소스로 읽을 수 없습니다." _internal_ core에서 표현을 만들어 GHC로 전달해야 할 것입니다. 당신의 기대를 위해 지나치게 비관적 이길 바래지만 ghc-api에 대한 전화가 많이 필요합니다. –

답변

5

ghc 명령이나 API를 통해 외부 코어 파일을 읽을 수있는 방법은 아직 없습니다. 죄송합니다 : (

GHC API를 사용하여 표현에서 Core 구문 트리를 작성하는 것이 이론적으로 가능하지만 매우 어려울 것 같아요. 다른 백엔드를 타겟팅하는 것이 좋습니다 .GHC 사용을 반드시 중단 할 필요는 없습니다. ; unboxed 타입을 가진 간단한 Haskell과 unsafeCoerce을 사용하면 결과 코어에 매우 가깝게 접근 할 수 있으므로 자신 만의 간단한 "Core-ish"언어를 정의하고 컴파일 할 수있다. (실제로 GHC 코어 자체를 컴파일 할 수도있다. 하지만 그건 내 취향에 비해 약간 메타이다.)

+1

Haskell에서 컴파일하는 것이 더 좋을 수도 있습니다. 즉, 기본적으로 이미 코어입니다. –

9

코어는 명시 적으로 입력 된 언어이므로 다른 언어에서 생성하기가 매우 어려울 수 있습니다 (GHC 유형 검사기는 그래서 모든 문제가 없다.) 예를 들어, 통상의 항등 함수 (id = \x -> x :: forall a. a -> a)a* 종류의 입력 변수 인

id = \(a :: *) (x :: a) -> a 

된다. 유형 수준 forall 바인딩의 용어 수준 자리 표시 자입니다. 마찬가지로 id을 호출 할 때 첫 번째 인수로 형식을 지정해야하므로 Haskell 식 (id 42)(id Int 42)으로 변환됩니다. 이러한 형식 바인딩 및 형식 응용 프로그램은 생성 된 컴퓨터 코드에 존재하지 않지만 컴파일러 변환이 올바른지 확인하는 데 유용합니다.

밝은면에서 단지 Haskell을 생성하는 것이 가능할 수 있습니다 - GHC가 항상 그 유형을 결정할 수있는 방식으로 코드를 생성 할 수 있다면 본질적으로 하스켈의 작은 하위 집합을 사용합니다 . 그러나 이것이 작동 할 수 있는지 여부는 소스 언어에 따라 다릅니다.