2012-01-19 67 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构建核心语法树可能在理论上是可能的,但这听起来非常痛苦,我会建议瞄准其他后端,你不一定要停止使用GHC ;使用unboxed类型的简单Haskell和unsafeCoerce可以让你得到非常接近的Core,所以你可以定义你自己的简单的“Core-ish”语言并编译它(实际上,你甚至可以编译GHC Core 本身 ,但这对我的口味来说太过分了。)

+1

您可能也有更好的运气编译为Haskell-that-is-essentially-already-Core。 –

9

请注意,Core是一种明确的类型化语言,它可能会使得从其他语言生成相当困难(GHC类型检查程序有i推荐所有类型,所以它没有问题)。例如,通常的恒等函数(id = \x -> x :: forall a. a -> a)变得

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

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

好的一面,可能只是生成Haskell - 如果你能以GHC总是能够确定它的类型的方式生成代码,那么你基本上只是使用Haskell的一个小子集。不过,这是否可以正常工作取决于您的源语言。