5

当我听说 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
4

1 回答 1

8

如果你想了解 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 代码所涉及的整个编译管道。

于 2013-08-13T18:07:17.507 回答