当我听说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
答案 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代码所涉及的整个编译管道。