Core是GHC的中间语言。阅读Core可以帮助您更好地理解程序的性能。有人问我关于阅读Core的文档或教程,但我找不到太多。
有哪些文档可用于阅读GHC核心?
以下是我目前的发现:
“GHC核心语言的外部表示”是一个可以在GHC (share/doc/ghc/core.pdf)或在互联网上安装中找到的文档。
share/doc/ghc/core.pdf
GHC Core是系统FC语言,所有Haskell都被翻译成这种语言。Core的(近似)语法如下:
Core与更简单、更广为人知的系统F密切相关。所有GHC在核心层面所做的转换都是这个Core表示的类型保持重构,以提高性能。而且,不太为人所知的是,你可以直接在Core中编写程序来编写GHC。
GHC核心适合编译器管道(就像2002年的sans-LLVM和CMM一样):
了解GHC核心的主要文件有:
GHC.Core.Expr
有助于理解的相关材料:
Core依次被转换成STG代码,看起来像这样:
Core中有趣的名字是用“Z-encoding"”编码的:
GHC Core的类型和种类(摘自Tolmach的论文):
最后,GHC的primops会定期出现在GHC核心输出中,当你优化Haskell到GHC知道的基本指令时。primop集是在一个预处理文件。中作为Core函数集给出的
虽然不完全是GHC核心语言,但正如Don提到的STG语言非常相似。我最近经历了证明STG语言+机器的类型安全性的练习,之后我发现我可以很容易地理解Core。
我用来学习STG的文本很容易理解:Simon Peyton-Jones的在普通硬件上实现惰性函数语言:无骨气无标签的G-machine。本文的大部分内容都涉及实现细节,但我特别推荐第4节从头到尾地解释STG语言,它为一些反直觉的设计决策提供了动机,并提供了熟悉的示例(如map)的翻译。
map
提示:如果你不关心类型注释和强制,可以使用-ddump-simpl和-dsuppress-all选项。核心输出应该更具可读性。
-ddump-simpl
-dsuppress-all