读GHC核心
核心是GHC的中间语言。 阅读核心可以帮助你更好地理解你的程序的性能。 有人问我阅读Core的文档或教程,但我找不到太多。
什么文件可用于阅读GHC核心?
这是我到目前为止发现的:
- 写Haskell跟C一样快:利用严格性,懒惰和recursion
- 哈斯克尔和C一样快:在高空工作以降低性能
- RWH:第25章。分析和优化
- CUFP高性能Haskell讲座 (幻灯片65-80)
GHC Core是所有Haskell翻译成的系统FC语言。 Core的(近似)语法由下式给出:
核心与更简单,更好的系统F密切相关。 GHC在核心级别上进行的所有转换都是对此核心表示进行types保留的重构,以提高性能。 而且,还不是很清楚,你可以直接在Core编写GHC程序。
GHC Core适用于编译器stream水线(与2002年一样,sans-LLVM和CMM):
了解GHC Core的主要文件是:
- GHC核心语言的外部表示 ,Tolmach,2001
- ghc / compiler / CoreSyn ,GHC定义本身
- 格拉斯哥Haskell编译器内联的秘密 ,Peyton Jones和Marlow,1999。核心在2.3节中描述,包括关于事件分析注释的细节。
- 一个基于变换的优化器Haskell ,Peyton Jones和Santos,1998。核心在S3中被描述,包括关于Core的多态性和操作性阅读的讨论。
有助于理解的相关材料:
- GHC -fext-core输出
- 通过阅读GHC的源代码,我花了很多时间学习Core。 在我的本科gradle论文 (从第16页起)中介绍了一些。
- 从使用ghc核心工具,以一种格式生成核心,我觉得愉快。
核心又被翻译成STG代码,看起来像这样:
Core中有趣的名字是用“Z-encoding”编码的:
GHC Core的types和种类(来自Tolmach的论文):
最后,当GHC优化你的Haskell到GHC知道的基本指令时,GHC的primops会定期出现在GHC核心输出中。 primop集在一个预处理文件中作为一组核函数给出。
提示:如果您不关心types注释和强制,请使用-ddump-simpl
-dsuppress-all
和-dsuppress-all
选项。 核心输出应该更可读。
虽然不完全是GHC核心语言,但唐提到STG语言是非常相似的。 我最近经历了STG语言+机器的certificatetypes安全的运行,之后我发现我可以很容易地理解Core。
我用来学习STG的文本是相当方便的: 在库存硬件上实现懒惰的函数式语言: Simon Peyton-Jones提供的无骨头无标记的G-machine 。 大部分论文都关注实现的细节,但是我特别推荐第4部分作为STG语言的一个自顶向底的解释,它给出了一些违反直觉的devise决定的动机,并提供了像map
这样的熟悉的例子的翻译。
“GHC核心语言的外部表示”是可以在安装ghc( share/doc/ghc/core.pdf
)或在互联网上find的文件 。