阅读GHC核心


193

核心是GHC的中间语言。Reading Core可以帮助您更好地了解程序的性能。有人要求我提供有关阅读Core的文档或教程,但找不到很多。

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

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



Answers:


272

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

在此处输入图片说明

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

GHC Core适用于编译器管道(与2002年一样,为sans-LLVM和CMM):

在此处输入图片说明

了解GHC Core的主要文档是:

可以帮助理解的相关材料:

  • GHC -fext核心输出
  • 我花了很多时间通过阅读GHC资料来学习Core。在2002年我的本科论文第16页中对此进行了描述。
  • 通过使用ghc-core工具,以令人愉悦的格式生成Core。

依次将核心翻译成STG代码,如下所示:

在此处输入图片说明

Core中的有趣名称以“ Z编码”编码:

在此处输入图片说明

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

在此处输入图片说明

最后,将Haskell优化为GHC所了解的基本说明后,GHC的primops会定期出现在GHC Core输出中。primop集作为预处理文件一组Core函数给出


61
您给出的每个答案总是非常荒谬。再次投票并保持投票;我在堆。
罗伯特·马赛利

3
Don和一般的Haskell社区通过SO发布的CC-wiki文档数量惊人。大家保持良好的Q和A!
丹·伯顿

4
我知道提到了它,但是我认为ghc-core的有用性应该在答案中强调。
Nikita Volkov

24

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


5
-dsuppress-all真的很有用 您也可以使用-dsuppress-coercions,如果你只是想摆脱铸件(有用的,当有很多newtypes左右)。
tibbe 2011年

8

正如Don所提到的,尽管不完全是GHC Core语言,但STG语言却非常相似。最近,我进行了证明STG语言+机器的类型安全性的练习,之后我发现我可以轻松理解Core。

我用来学习STG的文字非常容易理解:在库存硬件上实现惰性功能语言: Simon Peyton-Jones 编写的无刺无标签G机。本文中的大部分内容都与实现细节有关,但我特别推荐第4节,作为对STG语言的从上到下的解释,它为某些违反直觉的设计决策提供了动力,并提供了类似的示例的翻译map


STG的级别比Core低得多。编译管道为:
Haskell-

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.