学习parsing器,解释器和编译器资源
我一直想玩一段时间写自己的语言(表面上是为了学习经验),因此需要相对build立parsing器,解释器和编译器。 所以:
- 有没有人知道构buildparsing器,解释器和编译器有什么好的资源?
编辑:我不在寻找编译器/编译器/parsing器编译器,如Lex,Yacc和野牛…
我曾阅读过的最好的论文是由Val Schorre于1964年撰写的“META II一种面向语法的编译器编写语言”。 ( http://doi.acm.org/10.1145/800257.808896 )
在10页中,他向您展示了如何构build一个非常简单但非常有效的编译器 – 编译器,为您提供了编译器 – 编译器语法,并为您提供了足够的细节,让您能够在一个下午(一个令人惊讶的概念时刻当你意识到它是如何recursion的),只是为了微笑实现一个类似ALGOL的语言。 本文是一个完整的气体,真的应该需要阅读任何使用编译器技术的人。
在这篇文章的基础上,这里有一个关于元编译优秀教程的链接。 http://www.bayfronttechnologies.com/mc_tutorial.html
Aho的“龙书”是标准参考书,但另一个不错的select是Andrew Appel 在Java中的现代编译器实现 (也可用于ML和C风格)。 它逐步介绍了编译器/解释器的每个必需组件,并提供了许多有用的源代码。
这个由Steve Yegge( Rich Programmer Food )撰写的高度有趣的博客文章不会告诉你关于如何构build编译器的所有知识(尽pipe它包含了大量的好的洞察力),但是它的确很出色解释你为什么想了解执行者。
哎呀,那个post几乎让我开始学习编译器,我有一个全职的工作,一个3岁的家庭,平均每天约1.5个空闲时间。
不是很容易,但详尽: 龙书
编译器构build:原理和实践是关于这个问题的最好的书。
麻省理工学院开放式课程网站(OCW)有一个课程,其目标是build立一个编译器…他们提到龙书和阿佩尔的书,但此外,还有课堂笔记和讲座。 课程是6.035 – 计算机语言工程 。
我发现类注释对解释recursion下降parsing器非常有用。
我发现“让我们build立一个编译器” – Jack Crenshaw的教程,非常容易理解。 Jack从头开始为Pascal编译一个编译器,并对每一步都做了非常详细的解释。
我推荐C编译器devise,不幸的是你必须在旧书网站上find它。 本书唯一真正的问题是,编译速度是一个重要的因素,因此编译器是用C语言编写的,这被写回来。这就足够了低级语言,有时实现理论被埋在实现代码之下。
你提到了口译员和编译器。 我实际上build议从解释器开始,而不是编译器。 开始使用口译员要容易得多,他们往往会更有趣,因为您可以立即得到有关您的工作的反馈。
我最近阅读了Java中的编程语言处理器,并从基本概念开始向您推荐它,然后带您完成一个recursion下降编译器的实现,包括代码生成和大量其他方法的讨论。 我还没有看到这个线程中的其他build议书,所以不能提供与这些线索的比较。 不要被Java中的部分所忽略,如果你不了解java,那么概念和它们的实现已经足够好的解释了,你不需要对Java有一个详细的了解就可以了。
RE:lex,yacc,野牛
你的意思是你不需要指向他们,或者你不想使用它们? 我不build议手动编写词法分析器或parsing器。
编辑:你可能夸大了什么是“编译器 – 编译器”可以完成的感觉:编译真正困难的部分开始后,你已经build立了AST。 Aho,Louden和Appel的书都很好。
以防万一你:
- 愿意玩
- 就像更快build立一些东西的机会一样,然后再深入一点
- 在底层平台上使用.NET是可以的
…然后,我build议您检查微软的dynamic语言运行时,这是在整个dynamicSilverlight SDK内提供的源代码。
http://www.codeplex.com/sdlsdk
关于它的一些好的事情是它提供了许多随时可用的function,如控制台,通用types系统,通用抽象语法树等。包包括三个实现:Python,Ruby和Javascript。
也许这是一个很好的机会来实现DLR的简短语言,然后开始检查实际的DLR代码,然后开始自己构build基本的东西。
在任何情况下,从另一个语言怪胎最好的运气!
这是一本旧书,而且相当过时,但是我发现Brinch Hansen关于Pascal编译器是创build语言和编译器元素的非常实用的介绍。 尽pipe名字,这不是特定于帕斯卡。 如果你能find一个副本,这是非常值得的。