Haskell编译器如何工作?

fuz*_*fuz 21 compiler-construction haskell language-implementation

我在哪里可以得到一些论文/ doc /描述Haskell编译器实际工作方式的内容?我阅读了很多GHC的文档,但在头痛之后就停止了.因此,不需要博士学位来理解它并且不是用你应该已经熟悉的那种方式写的东西会更好.如果它真的很长并且需要一些时间来理解它,这不是问题.

PS:最有趣的是关于GHC,但一切都很好.

Max*_*oke 29

你可以从马的口中得到答案!Simon Peyton Jones(GHC向导)写了一本书,解释了如何实现函数式编程语言.它现在已经绝版,因此可以免费在线获取:http://research.microsoft.com/en-us/um/people/simonpj/papers/pj-lester-book/

当然,GHC自书写之后就已经开始了,但它仍然非常重要.

  • 并且不要忘记这篇论文 - "在股票硬件上实现懒惰的功能语言":http://research.microsoft.com/apps/pubs/default.aspx?id = 67083 (4认同)

ste*_*ley 16

您是否正在寻找有关编译延迟评估的详细信息?Max Bolingbroke提到了Simon Peyton-Jones的书,也详细介绍了Clean的实施在线:

http://wiki.clean.cs.ru.nl/Functional_Programming_and_Parallel_Graph_Rewriting

如果你有一个大学联盟,想要一些小的东西你可以尝试获得这些书(亨德森和迪勒肯定绝版):

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编写了许多编译器,它是Lisp的一个缩小,懒惰的变体.戴维详细介绍了编写懒惰语言的机制,例如,有一篇关于STG的描述比Simon Peyton-Jones的书(STG是用于Haskell的抽象机器SPJ)短得多.

如果您浏览他们的出版物列表,Clean开发人员可以获得有关实施SAPL(简单应用语言)的大量信息:

https://clean.cs.ru.nl/Publications

最后,有相当多的论文记录了Utrecht Haskell编译器UHC(和EHC)的各个方面.我认为大部分信息是编译器的组织方式(使用属性语法和"Shuffle")以及如何实现类型系统(EHC中有各种级别的类型系统),而不是后端"编译"如何作品.


dan*_*rth 5

编译器是一个巨大的主题,在这里不可能完整地解释它们。但这里是通用编译器的概述。希望这会给您一些理解,使阅读有关 GHC 的具体内容更容易理解。

编译器通常通过前端和后端两部分的一系列转换来工作。

第一个转换是将纯文本转换为更容易遍历的内容。这本身通常分为两部分:

词法分析或标记化- 将纯文本转换为小块(通常是运算符、标识符、文字等)的行为。

句法分析或解析- 将这些小块变成树状结构。(通常是AST,抽象语法树

下一阶段是语义分析。在这个阶段,编译器通常会向 AST 添加信息(如类型信息)并构建符号表。前端到此结束。

下一个转换将 AST 转换为一个IR,一个中间表示。这通常是当今的 SSA 形式,即单一静态分配

然后通过恒定传播、死代码分析、矢量化等对其进行优化。

最后一个转换是代码生成。将 IR 转换为机器代码。这可能非常复杂。它有时也被称为降低。

有关更多信息,我推荐这个维基百科页面

  • 感谢您的评论。请注意,我特意向 Haskell 询问,其中这些步骤更复杂一些,例如。Haskell 允许具有任意优先级的新运算符,这些运算符将解析转变为猜测、类型推断和类,恕我直言,它们正在对正在发生的事情进行分析,并且进行大量优化以摆脱懒惰。但感谢您的明确答复! (2认同)