在Haskell中无法使用GHC从.hs输出到.hc

时间:2013-08-13 11:00:05

标签: haskell functional-programming ghc haskell-platform

当我听说GHC可以将文件输出到C时,我很感兴趣。

  

Glasgow Haskell编译器(GHC)在许多不同的体系结构上编译为本机代码 - 以及使用C--作为中间语言的ANSI C。

所以我安装了Haskell平台并创建了一个简单的.hs文件。

main = putStrLn "Hello, World!"

根据手册。

  

-C生成C(.hc文件)后停止

现在我运行命令。

ghc -C test.hs

但它不会创建.hc文件,也不会停止编译中。

$ ls
test.exe  test.hi  test.hs  test.o

1 个答案:

答案 0 :(得分:7)

如果你想了解Haskell程序如何在低级别执行,最好是研究Core(-ddump-simpl)。在那之后,即使是专家,代码也变得非常难以阅读。主要原因是GHC的堆栈和堆管理得到了硬编码。因此,低级生成的Haskell代码基本上是一个巨大的小程序混乱,在完成间接跳转到未知位置之前执行复杂的指针运算。最糟糕的意大利面条代码。

提供一些实际答案 - 你可以通过遍历LLVM后端生成C:

ghc -ddump-llvm -ddump-to-file hello_world.hs
opt -O2 hello_world.dump-llvm | llc -O2 -march c -o hello_world.c

但结果只是说明了这一点。即使是一个简单的fib函数也需要大约80行代码。

如果您真的对血腥细节感兴趣,我建议您阅读Edward Z. Yang的this blog post。他基本上遍历了翻译一小段Haskell代码所涉及的整个编译管道。