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

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)

Pet*_*ann 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
Run Code Online (Sandbox Code Playgroud)

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

如果您真的对血腥细节感兴趣,我建议您阅读Edward Z. Yang撰写的这篇博客文章.他基本上完成了翻译一个简单的Haskell代码所涉及的整个编译管道.