请注意,Core是一种显式类型语言,这使得从其他语言生成起来非常困难(GHC类型检查器已经推断出所有类型,因此它没有问题).例如,通常的身份功能(id = \x -> x :: forall a. a -> a)变为
id = \(a :: *) (x :: a) -> a
where a类型变量*.它是类型级forall绑定的术语级占位符.类似地,在调用时id你需要给它一个类型作为它的第一个参数,所以Haskell表达式(id 42)被转换成了(id Int 42).此类型绑定和类型应用程序将不会出现在生成的机器代码中,但它们对于验证编译器转换是否正确非常有用.
从好的方面来说,可能只生成Haskell - 如果你能够生成代码以使GHC始终能够确定其类型,那么你基本上只使用Haskell的一小部分.但是,这是否可行取决于您的源语言.
无论是通过ghc命令还是API ,仍然无法读取外部核心文件.对不起:(
理论上可能使用GHC API从您的表示中构建Core语法树,但这听起来非常痛苦.我建议针对其他一些后端.您不一定要停止使用GHC; 直观的Haskell带有未装箱的类型,unsafeCoerce让你非常接近生成的Core,所以你可以定义你自己的简单"Core-ish"语言并将其编译成它.(实际上,你甚至可以自己编译GHC Core ,但这对我的口味来说有点过分了.)