繁体   English   中英

阅读 GHC 核心

[英]Reading GHC Core

Core 是 GHC 的中间语言。 Reading Core 可以帮助您更好地了解程序的性能。 有人向我询问有关阅读 Core 的文档或教程,但我找不到太多。

哪些文档可用于阅读 GHC Core?

这是我到目前为止发现的:

GHC Core 是系统 FC语言,所有 Haskell 都被翻译成该语言。 Core 的(近似)语法由下式给出:

在此处输入图像描述

Core 与更简单、更广为人知的System F密切相关。 GHC 在核心级别所做的所有转换都是此核心表示的类型保留重构,以提高性能。 而且,不太为人所知,您可以直接在 Core 中编写 GHC 程序。

GHC Core 适合编译器管道(就像 2002 年一样,sans-LLVM 和 CMM):

在此处输入图像描述

了解 GHC Core 的主要文件是:

有助于理解的相关材料:

  • GHC -fext-core output
  • 我花了很多时间通过阅读 GHC 源码来学习 Core。 有些在我 2002 年的本科论文中有所描述,从第 16 页开始。
  • 从使用ghc-core工具,到生成我喜欢的格式的 Core。

核心又被翻译成 STG 代码,看起来像:

在此处输入图像描述

Core 中有趣的名字被编码在“Z 编码”中:

在此处输入图像描述

GHC Core 的类型和种类(来自 Tolmach 的论文):

在此处输入图像描述

最后,当您将 Haskell 优化到 GHC 知道的基本指令时,GHC 的primops会定期出现在 GHC Core output 中。 primop 集作为预处理文件中的一组核心函数给出。

提示:如果您不关心类型注释和强制,请使用-ddump-simpl simpl 和-dsuppress-all选项。 核心 output 应该更具可读性。

虽然不完全是 GHC 核心语言,但正如 Don 提到的 STG 语言非常相似。 最近做了一个证明STG语言+机器类型安全的练习,后来发现自己可以轻松理解Core了。

我用来学习 STG 的文本很容易理解:在 Stock Hardware 上实现惰性函数式语言:Simon Peyton-Jones 的 Spineless Tagless G-machine 这篇论文的大部分内容都与实现细节有关,但我特别推荐第 4 节作为对 STG 语言的自上而下的解释,它为一些违反直觉的设计决策提供了动机,并提供了map等熟悉示例的翻译。

“GHC 核心语言的外部表示”是一个文档,可以在 ghc 的安装 ( share/doc/ghc/core.pdf ) 或互联网上找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM