7

我想为一种可以产生 GHC Core 的简单语言创建一个前端。然后我想获取这个输出并通过正常的 GHC 管道运行它。根据这个页面,不能直接从 ghc 命令。我想知道是否有任何方法可以做到这一点。

理想情况下,我期望对 ghc-api 进行一些函数调用,但我也愿意接受任何建议,包括(不那么广泛)在 GHC 源中进行黑客攻击。任何指针都会有所帮助!

4

2 回答 2

11

请注意,Core 是一种显式类型的语言,因此很难从其他语言生成(GHC 类型检查器已推断出所有类型,因此在那里没有问题)。例如,通常的恒等函数(id = \x -> x :: forall a. a -> a)变为

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

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

从好的方面来说,有可能只生成 Haskell——如果你能以 GHC 总是能够确定其类型的方式生成代码,那么你基本上只是使用 Haskell 的一小部分。不过,这是否可行在很大程度上取决于您的源语言。

于 2012-01-19T22:37:59.910 回答
5

仍然无法通过ghc命令或 API 读取外部核心文件。对不起 :(

从理论上讲,使用 GHC API 从您的表示构建核心语法树可能是可能的,但这听起来很痛苦。我建议针对其他一些后端。您不一定要停止使用 GHC;直截了当的 Haskell 带有未装箱的类型,unsafeCoerce让您非常接近最终的 Core,因此您可以定义自己的简单“Core-ish”语言并将其编译为该语言。(实际上,您甚至可以编译 GHC Core本身,但这对我来说有点过于元了。)

于 2012-01-19T14:02:59.783 回答