Core是GHC的中间语言。阅读Core可以帮助您更好地理解程序的性能。有人问我关于阅读Core的文档或教程,但我找不到太多。
有哪些文档可用于阅读GHC核心?
以下是我目前的发现:
编写Haskell就像编写C一样快:利用严格性、惰性和递归 Haskell和C一样快:在高海拔工作,低水平的性能 第25章。分析和优化 在CUFP的高性能Haskell演讲(幻灯片65-80)
Core是GHC的中间语言。阅读Core可以帮助您更好地理解程序的性能。有人问我关于阅读Core的文档或教程,但我找不到太多。
有哪些文档可用于阅读GHC核心?
以下是我目前的发现:
编写Haskell就像编写C一样快:利用严格性、惰性和递归 Haskell和C一样快:在高海拔工作,低水平的性能 第25章。分析和优化 在CUFP的高性能Haskell演讲(幻灯片65-80)
GHC核心是系统FC语言,所有Haskell都被翻译成这种语言。Core的(近似)语法如下:
Core与更简单、更广为人知的System f密切相关。GHC在Core级别上所做的所有转换都是对这个Core表示的类型保持重构,以提高性能。而且,不太为人所知的是,你可以直接在Core中编写程序来编写GHC。
GHC核心适合编译器管道(就像2002年的sans-LLVM和CMM一样):
了解GHC核心的主要文件有:
GHC核心语言的外部表示,Tolmach, 2001 GHC.Core。即GHC定义本身 格拉斯哥Haskell编译器内联程序的秘密,Peyton Jones和Marlow, 1999。Core在2.3节中描述,包括发生分析注释的详细信息。 Haskell, Peyton Jones和Santos的基于转换的优化器,1998年。Core在S3中进行了描述,包括对Core的多态性和操作读数的讨论。
有助于理解的相关材料:
GHC -fext-core输出 我花了很多时间通过阅读GHC源代码来学习Core。有些在我2002年的本科论文第16页里有描述。 从使用ghc-core工具,以一种我喜欢的格式生成Core。
Core依次被转换成STG代码,看起来像这样:
Core中有趣的名字是用“z编码”编码的:
GHC Core的类型和种类(摘自Tolmach的论文):
最后,GHC的primops会定期出现在GHC核心输出中,当你优化Haskell到GHC知道的基本指令时。primop集是作为预处理文件中的核心函数集给出的。
虽然不完全是GHC核心语言,但正如Don提到的STG语言非常相似。我最近经历了证明STG语言+机器的类型安全性的练习,之后我发现我可以很容易地理解Core。
我曾经用来学习STG的文本很容易理解:在库存硬件上实现惰性函数语言:Simon Peyton-Jones的无标签G-machine。本文的大部分内容都涉及实现细节,但我特别推荐第4节从头到尾地解释STG语言,它为一些反直觉的设计决策提供了动机,并提供了熟悉示例(如map)的翻译。