我在哪里可以获得一些描述 Haskell 编译器实际工作原理的论文/文档/任何内容?我阅读了很多 GHC 的文档,但在头痛后停止了。因此,不需要博士学位即可理解它并且不是以“您应该已经熟悉它”的风格编写的东西会更可取。如果它真的很长并且需要一些时间来理解它,这不是问题。
PS:最有趣的是关于 GHC 的事情,但任何事情都可以。
我在哪里可以获得一些描述 Haskell 编译器实际工作原理的论文/文档/任何内容?我阅读了很多 GHC 的文档,但在头痛后停止了。因此,不需要博士学位即可理解它并且不是以“您应该已经熟悉它”的风格编写的东西会更可取。如果它真的很长并且需要一些时间来理解它,这不是问题。
PS:最有趣的是关于 GHC 的事情,但任何事情都可以。
你可以从马的嘴里得到答案!Simon Peyton Jones(GHC 向导)写了一本书,解释如何实现函数式编程语言。它现已绝版,可在线免费获取:http ://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/
当然,自本书编写以来,GHC 已经继续前进,但它仍然非常重要。
您是否正在寻找有关编译惰性评估的详细信息?Max Bolingbroke 提到了 Simon Peyton-Jones 的书,详细介绍 Clean 实现的书也在网上:
http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting
如果你有大学附属机构并且想要更小的东西,你可以尝试购买这些书(Henderson & Diller 肯定已经绝版):
Antoni Diller “编译函数语言” ISBN 0 471 92027 4
Peter Henderson“函数式编程应用与实现”ISBN 0-13-331579-7
AJT Davie “使用 Haskell 的函数式编程系统简介” ISBN 0 521 27724 8
Diller 通过组合子约简为惰性语言(在 Pascal 中实现)提供了完整的编译器。这是 David Turner 为 SASL 发明的实现技术。Henderson 为 LISPkit 提供了许多编译器部分,LISPkit 是 Lisp 的微型、惰性变体。Davie 详细介绍了编译惰性语言的许多机制,例如,对 STG 的描述比 Simon Peyton-Jones 的书要短得多(STG 是用于 Haskell 的抽象机器 SPJ)。
如果您查看他们的出版物列表,Clean 开发人员有很多关于实现 SAPL(一种简单应用语言)的信息:
https://clean.cs.ru.nl/Publications
最后,有相当多的论文记录了 Utrecht Haskell Compiler UHC(和 EHC)的各个方面。我认为大部分信息是编译器是如何组织的(使用属性语法和“Shuffle”)以及类型系统(EHC 中有不同级别的类型系统)是如何实现的,而不是后端如何“编译”作品。
编译器是一个巨大的主题,在这里不可能完整地解释它们。但这里是通用编译器的概述。希望这会给您一些理解,这可能会使阅读有关 GHC 的内容更容易理解。
编译器通常通过前端和后端两部分的一系列转换来工作。
第一个转换是将纯文本变成更容易遍历的东西。这本身通常分为两部分:
词法分析或标记化- 将纯文本转换为小块(通常是运算符、标识符、文字等)的行为。
句法分析或解析- 将这些小块变成树结构。(通常是AST,抽象语法树)
下一阶段是语义分析。在这个阶段,编译器通常会向 AST 添加信息(如类型信息)并构建符号表。前端到此结束。
下一个转换将 AST 转换为IR,即中间表示。现在,这通常是一种 SSA 形式,即单一静态分配。
然后通过常量传播、死代码分析、向量化等对其进行优化。
最后一个转换是代码生成。将 IR 转换为机器代码。这可能非常复杂。它有时也被称为降低。
有关更多信息,我推荐此维基百科页面。
不幸的是,我怀疑您要查找的内容不存在。编译器理论和形式语言理论是计算机科学中相当复杂的主题,而 Haskell 绝不是起点。
首先,您可能应该在以下方面打下良好的基础:
我怀疑任何解释 Haskell 内部的任何东西都需要对上述主题有更好的理解,而不是 C 语言。
到目前为止,我已经上了一门关于这个主题的课程,所以我没有正式的文献可以推荐,但我确信有很多好的资源。
维基百科对 GHC 的内部有很好的可读性概述(类似于@dan_waterworth 的解释,但特定于 Haskell 和 GHC):
http://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler#Architecture
我读过的关于该主题的最佳论文之一是: