读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的文件 。