我想创建一个生成GHC Core的简单语言的前端。我想接受这个输出并通过正常的GHC管道运行它。根据{{3}},ghc命令无法直接实现。我想知道是否有任何方式来做它。
我理想地期望对ghc-api进行一些函数调用,但我也对包含(不那么广泛)GHC源代码中的任何建议持开放态度。任何指针都会有所帮助!
答案 0 :(得分:9)
请注意,Core是一种显式类型语言,这使得从其他语言生成起来非常困难(GHC类型检查器已经推断出所有类型,因此它没有问题)。例如,通常的身份函数(id = \x -> x :: forall a. a -> a)
变为
id = \(a :: *) (x :: a) -> a
其中a
是类型*
的类型变量。它是类型级forall
绑定的术语级占位符。类似地,当调用id
时,你需要给它一个类型作为它的第一个参数,所以Haskell表达式(id 42)
被转换为(id Int 42)
。这样的类型绑定和类型应用程序将不会出现在生成的机器代码中,但它们对于验证编译器转换是否正确非常有用。
从好的方面来说,可能只生成Haskell - 如果你能够生成代码以使GHC始终能够确定其类型,那么你基本上只使用Haskell的一小部分。但是,这是否可行取决于你的源语言。
答案 1 :(得分:5)
无论是通过ghc
命令还是API,都无法读取外部核心文件。对不起:(
理论上可能使用GHC API从您的表示中构建Core语法树,但这听起来非常痛苦。我建议针对其他一些后端。您不一定要停止使用GHC;直接使用未装箱类型的Haskell和unsafeCoerce
可以让您非常接近生成的Core,因此您可以定义自己的简单“Core-ish”语言并将其编译为该语言。 (实际上,你甚至可以编译GHC Core 本身,但这对我的口味来说有点过分。)