31

一段时间以来,我一直想尝试编写自己的语言(表面上是为了学习经验),因此需要在解析器、解释器和编译器的构建方面相对扎实。所以:

  • 有谁知道有关构建解析器、解释器和编译器的任何好的资源?

编辑:我不是在寻找编译器编译器/解析器编译器,例如 Lex、Yacc 和 Bison ......

4

12 回答 12

14

我读过的关于编译器的最好的论文是Val Schorre 于1964 年发表 的“META II a syntax-oriented compiler writing language”。( http://doi.acm.org/10.1145/800257.808896 )

在 10 页中,他向您展示了如何构建一个非常简单但非常有效的编译器 - 编译器,为您提供编译器 - 编译器语法,并为您提供足够的细节让您在一个下午手动实现它(有一个惊人的 概念时刻当你意识到它是如何递归的),并且只是为了 grins 实现了一种类似 ALGOL 的语言。这篇论文是一篇完整的文章,任何使用编译器技术的人都应该阅读这篇论文。

这是一个链接,可以根据论文使用元编译的精彩教程。 http://www.bayfronttechnologies.com/mc_tutorial.html

于 2009-06-17T07:58:49.407 回答
9

这篇由 Steve Yegge( Rich Programmer Food )撰写的非常有趣的博客文章不会告诉您有关如何构建编译器所需了解的所有内容(尽管它确实包含了相当多的好见解),但它在以下方面做得很好解释为什么你想了解编译器。

哎呀,那篇文章几乎让我开始学习编译器,我有一份全职工作,家里有一个 3 岁的孩子,平均每天有大约 -1.5 小时的空闲时间。

于 2008-09-03T14:35:38.640 回答
8

Aho 的“Dragon book”是标准参考,但另一个不错的选择是 Andrew Appel 的Modern Compiler Implementation in Java(也可用于MLC风格)。它逐步引导您了解编译器/解释器的每个必要组件,并提供许多有用的源代码。

于 2008-09-03T14:32:34.950 回答
6

不是很容易,但很详尽:龙书

于 2008-09-03T14:27:41.980 回答
5

《编译器构造:原理与实践》是一本关于该主题的最佳书籍。

于 2008-09-03T14:28:06.787 回答
5

我发现“让我们构建一个编译器” ——Jack Crenshaw 的教程,非常容易理解。Jack 从头开始​​为 Pascal 构建了一个编译器,对每一步都有非常详细的解释。

于 2008-09-19T15:35:41.453 回答
4

MIT OpenCourseWare(OCW) 站点有一个类,其项目是建立一个编译器……他们参考了 Dragon 的书和 Appel 的书,但除此之外,还有课堂笔记和讲座。课程是6.035 - 计算机语言工程

我发现课堂笔记对于解释递归下降解析器非常有用。

于 2008-09-03T16:14:32.427 回答
3

我最近阅读了 Java 中的编程语言处理器,并会向您推荐它,因为它从基本概念开始,然后带您完成递归下降编译器的实现,包括代码生成以及对替代方法的大量讨论。不过,我还没有阅读此线程中的其他推荐书籍,因此无法与这些书籍进行比较。如果您不了解 Java,请不要被 In Java 部分推迟,因为这些概念及其实现已经得到很好的解释,您无需详细了解 Java 即可了解要点。

于 2008-09-03T15:57:34.620 回答
2

我推荐C 语言中的编译器设计,不幸的是,你必须在旧书网站上找到它。这本书唯一真正的问题是,它是在编译速度是一个重要因素时写回来的,所以编译器是用 C 编写的。这已经足够低级语言了,有时实现理论被埋在实现代码之下。

您提到了解释器和编译器。我实际上建议从解释器而不是编译器开始。开始使用口译员要容易得多,而且他们的工作往往更有趣,因为您可以立即获得有关您的工作方式的反馈。

于 2008-09-03T15:38:47.973 回答
2

以防万一你:

  • 愿意玩
  • 就像有机会更快地构建东西,然后更深入
  • 可以在底层平台上使用 .NET

...那么我建议您检查 Microsoft 的 Dynamic Language Runtime,它在整个 Dynamic Silverlight SDK 中作为源代码提供。

http://www.codeplex.com/sdlsdk

它的一些优点是它提供了许多现成的功能,如控制台、通用类型系统、通用抽象语法树等。该包包括三个实现:Python、Ruby 和 Javascript。

也许这是一个实现 DLR 之外的短语言的好机会,然后开始检查实际的 DLR 代码,然后开始自己构建基本的东西。

无论如何,祝另一个语言怪胎好运!

于 2008-09-03T16:06:47.080 回答
1

回复:lex、yacc、野牛

你的意思是你不需要指向它们的指针或者你对使用它们不感兴趣?我不建议手动编写词法分析器或解析器。

编辑:您可能对“编译器-编译器”可以完成的工作有一种夸大的感觉:编译的真正困难部分是在您构建 AST 之后开始的。Aho、Louden 和 Appel 的书都很好。

于 2008-09-03T14:34:20.233 回答
0

这是一本旧书,而且相当过时,但我发现在 Pascal Compilers 上的 Brinch Hansen是一本非常实用的关于创建语言和构建编译器元素的介绍。尽管有这个名字,但它并不特定于 Pascal。如果你能找到一份副本,那是非常值得的。

于 2008-09-19T17:16:05.300 回答