阅读 GHC 核心
Posted
技术标签:
【中文标题】阅读 GHC 核心【英文标题】:Reading GHC Core 【发布时间】:2011-09-01 13:04:12 【问题描述】:Core 是 GHC 的中间语言。 Reading Core 可以帮助您更好地了解程序的性能。有人向我索要有关阅读 Core 的文档或教程,但我找不到太多。
哪些文档可用于阅读 GHC Core?
这是我目前发现的:
Write Haskell as fast as C: exploiting strictness, laziness and recursion Haskell as fast as C: working at a high altitude for low level performance RWH: Chapter 25. Profiling and optimization High-Performance Haskell talk at CUFP(幻灯片 65-80)【问题讨论】:
另见***.com/questions/6048194/… skillsmatter.com/skillscasts/… 也可能有用。 【参考方案1】:GHC Core 是所有 Haskell 都被翻译成的 System FC 语言。 Core 的(近似)语法由下式给出:
Core 与更简单且广为人知的System F 密切相关。所有transformations GHC does on the Core level 都是此Core 表示的类型保留重构,以提高性能。而且,不太为人所知,您可以直接在 Core 中编写 GHC 程序。
GHC Core 适合编译器管道(就像 2002 年一样,无 LLVM 和 CMM):
了解 GHC Core 的主要文档有:
An External Representation for the GHC Core Language,托尔马赫,2001 年 ghc/compiler/CoreSyn,GHC 定义本身 Secrets of the Glasgow Haskell Compiler inliner,Peyton Jones 和 Marlow,1999 年。第 2.3 节描述了核心,包括有关出现分析注释的详细信息。 A transformation-based optimiser for Haskell,Peyton Jones 和 Santos,1998 年。在 S3 中描述了 Core,包括对 Core 的多态性和操作读数的讨论。有助于理解的相关材料:
GHC -fext-core output 我花了很多时间通过阅读 GHC 源码来学习 Core。我在 2002 年的 undergraduate thesis 中描述了一些内容,从第 16 页开始。 从使用ghc-core 工具,到生成我喜欢的格式的Core。Core 又被翻译成 STG 代码,如下所示:
Core 中的搞笑名字是用“Z-encoding”编码的:
GHC Core 的类型和种类(来自 Tolmach 的论文):
最后,当您将 Haskell 优化到 GHC 知道的基本指令时,GHC 的 primops 会定期出现在 GHC 核心输出中。 primop 集在a pre-processed file. 中作为一组核心函数给出
【讨论】:
你给出的每一个答案总是非常完整。再进行一次投票并保持下去;我正在倾斜。 Don 和一般 Haskell 社区通过 SO 发布的 CC-wiki 文档数量惊人。保持良好的 Q 和 A,大家! 我知道有人提到过,但我认为ghc-core的用处应该在答案中强调。【参考方案2】:提示:如果您不关心类型注释和强制转换,请使用 -ddump-simpl
和 -dsuppress-all
选项。核心输出应该更具可读性。
【讨论】:
-dsuppress-all
真的很有用。如果您只想摆脱演员表,也可以使用-dsuppress-coercions
(当周围有很多新类型时很有用)。【参考方案3】:
虽然不完全是 GHC 核心语言,但正如 Don 提到的,STG 语言非常相似。最近做了一个证明STG语言+机器类型安全性的练习,后来发现自己可以轻松理解Core了。
我用来学习 STG 的文本很容易理解:Implementing Lazy Functional Languages on Stock Hardware: The Spineless Tagless G-machine,作者 Simon Peyton-Jones。这篇论文的大部分内容都与实现细节有关,但我特别推荐第 4 节作为对 STG 语言的自上而下的解释,它为一些违反直觉的设计决策提供了动机,并提供了熟悉示例的翻译,例如 @987654322 @。
【讨论】:
STG 比 Core 低很多。编译流水线为:Haskell -> Core -> STG -> C-- -> Machine Code【参考方案4】:“An External Representation for the GHC Core Language”是一个文档,可以在安装 ghc (share/doc/ghc/core.pdf
) 或 on the internet 中找到。
【讨论】:
以上是关于阅读 GHC 核心的主要内容,如果未能解决你的问题,请参考以下文章