Gee*_*_SO 5 haskell functional-programming ghc haskell-platform
当我听说GHC可以将文件输出到C时,我很感兴趣.
Glasgow Haskell编译器(GHC)编译为许多不同体系结构上的本机代码 - 以及使用C--作为中间语言的ANSI C.
所以我安装了Haskell平台并创建了一个简单的.hs文件.
main = putStrLn "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
并根据手册.
-C生成C(.hc文件)后停止
现在我运行命令.
ghc -C test.hs
Run Code Online (Sandbox Code Playgroud)
但它不会创建.hc文件,也不会停止编译中.
$ ls
test.exe test.hi test.hs test.o
Run Code Online (Sandbox Code Playgroud)
如果你想了解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
Run Code Online (Sandbox Code Playgroud)
但结果只是说明了这一点.即使是一个简单的fib函数也需要大约80行代码.
如果您真的对血腥细节感兴趣,我建议您阅读Edward Z. Yang撰写的这篇博客文章.他基本上完成了翻译一个简单的Haskell代码所涉及的整个编译管道.