使用GHC在Haskell中不能从.hs输出到.hc
当我听说GHC可以向C输出文件时,我很感兴趣。
格拉斯哥Haskell编译器(GHC)在许多不同的体系结构上编译为本地代码 - 以及ANSI C--使用C--作为中间语言。
所以我安装了Haskell平台并创建了一个简单的.hs文件。
main = putStrLn "Hello, World!"
并根据手册。
-C生成C(.hc文件)后停止
现在我运行命令。
ghc -C test.hs
但它不会创建.hc文件,也不会停止中间编译。
$ ls
test.exe test.hi test.hs test.o
如果您想了解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的博客文章。 他基本上遍历整个编译流程,涉及翻译一段简单的Haskell代码。
链接地址: http://www.djcxy.com/p/5695.html