编译为GHC Core

ael*_*ndy 6 haskell ghc ghc-api

我想创建一个简单语言的前端,生成GHC Core.我想接受这个输出并通过正常的GHC管道运行它.根据这个页面,ghc命令无法直接实现.我想知道是否有任何的方式来做到这一点.

我期待最好几个函数调用的GHC-API,但我也很开放,其中包括(不那么广泛)在GHC的源黑客的任何建议.任何指针都会有所帮助!

nom*_*olo 9

请注意,Core是一种显式类型语言,这使得从其他语言生成起来非常困难(GHC类型检查器已经推断出所有类型,因此它没有问题).例如,通常的身份功能(id = \x -> x :: forall a. a -> a)变为

id = \(a :: *) (x :: a) -> a
Run Code Online (Sandbox Code Playgroud)

where a类型变量*.它是类型级forall绑定的术语级占位符.类似地,在调用时id你需要给它一个类型作为它的第一个参数,所以Haskell表达式(id 42)被转换成了(id Int 42).此类型绑定和类型应用程序将不会出现在生成的机器代码中,但它们对于验证编译器转换是否正确非常有用.

从好的方面来说,可能只生成Haskell - 如果你能够生成代码以使GHC始终能够确定其类型,那么你基本上只使用Haskell的一小部分.但是,这是否可行取决于您的源语言.


ehi*_*ird 5

无论是通过ghc命令还是API ,仍然无法读取外部核心文件.对不起:(

理论上可能使用GHC API从您的表示中构建Core语法树,但这听起来非常痛苦.我建议针对其他一些后端.您不一定要停止使用GHC; 直观的Haskell带有未装箱的类型,unsafeCoerce让你非常接近生成的Core,所以你可以定义你自己的简单"Core-ish"语言并将其编译成它.(实际上,你甚至可以自己编译GHC Core ,但这对我的口味来说有点过分了.)