我一直想要在一段时间内编写自己的语言(表面上是为了学习经验),因此需要在构建解析器,解释器和编译器时相对基础。所以:
答案 0 :(得分:12)
我在编译器上读过的最好的论文是 1964 “META II是一种面向语法的编译器编写语言”,作者是Val Schorre。 (http://doi.acm.org/10.1145/800257.808896)
在10页中,他向您展示了如何构建一个令人惊讶的简单但是 非常有效的编译器编译器,提供 你使用编译器编译器语法并为你提供足够的 你可以在一个下午手动实现它的细节(一个令人惊讶 当你意识到它如何递归时的概念时刻),只是为了实现一个咧嘴笑 类似ALGOL的语言。这纸是一种完全的气体,真的应该 对于使用编译器技术的任何人来说都是必读的。
这是一个链接,可以播放关于元编译的精彩教程, 基于论文。 http://www.bayfronttechnologies.com/mc_tutorial.html
答案 1 :(得分:8)
Aho的“龙书”是 标准参考,但另一个不错的选择是Andrew Appel的Modern Compiler Implementation in Java(也有ML和C种类)。它逐步引导您逐步完成编译器/解释器的每个必要组件,并提供许多有用的源代码。
答案 2 :(得分:8)
Steve Yegge撰写的这篇极具娱乐性的博客文章(Rich Programmer Food)不会告诉您关于如何构建编译器的所有信息(虽然它确实包含了相当数量)很好的见解),但它很好地解释为什么你想要理解编码器。
哎呀,这篇文章几乎让我开始学习编译器,我有一份全职工作,一个3岁的家庭,平均每天约1.5小时。
答案 3 :(得分:6)
不是很容易,但详尽无遗:the dragon book
答案 4 :(得分:4)
Compiler Construction: Principles and Practice是关于此主题的最佳书籍。
答案 5 :(得分:4)
麻省理工学院开放式课件(OCW)网站有一个课程,其项目是建立一个编辑器...他们参考龙书和Appel的书,但此外,还有课堂笔记和讲座。该课程为6.035 - Computer Language Engineering。
我发现课堂笔记非常适用于解释递归下降解析器。
答案 6 :(得分:4)
我找到了"Let's build a compiler" - Jack Crenshaw的教程,很容易理解和理解。 Jack从头开始为Pascal构建编译器,并对每个步骤进行非常详细的解释。
答案 7 :(得分:3)
我最近阅读Programming Language Processors in Java并向您推荐它,因为它从基本概念开始,然后引导您完成递归下降编译器的实现,包括代码生成以及对替代方法的大量讨论。我没有读过这个帖子中的其他推荐书籍,所以无法与这些书籍进行比较。如果您不了解Java,请不要被In Java部分推迟,因为概念和它们的实现已经很好地解释了您在不需要详细了解Java的情况下获得要点。
答案 8 :(得分:2)
我建议你遗憾地在二手书网站上找到Compiler Design in C。本书唯一真正的问题是,当编译速度是一个重要因素时,它被写回来,因此编译器是用C语言编写的。这就足够了一种低级语言,有时实现理论隐藏在实现代码之下。
您提到了口译员和编译器。我实际上建议从解释器而不是编译器开始。开始使用口译员要容易得多,因为你可以立即获得有关你如何做的反馈,因此他们往往更有乐趣。
答案 9 :(得分:2)
以防你:
...然后我建议您查看Microsoft的动态语言运行时,它在整个Dynamic Silverlight SDK中作为源代码提供。
http://www.codeplex.com/sdlsdk
它的一些好处是它提供了许多现成的功能,如控制台,通用类型系统,通用抽象语法树等。该软件包包括三个实现:Python,Ruby和Javascript。
也许这是一个很好的机会在DLR之外实现一种简短的语言,然后开始检查实际的DLR代码,然后开始自己构建基本的东西。
无论如何,从另一种语言怪胎中获得好运!
答案 10 :(得分:1)
RE:lex,yacc,bison
你的意思是你不需要指向它们或者你不想使用它们吗?我不建议手工编写词法分析器或解析器。
编辑:你可能夸大了“编译器 - 编译器”可以完成的事情:在构建AST之后,编译的真正困难部分就开始了。 Aho,Louden和Appel的书都很好。答案 11 :(得分:0)
这是一本旧书,相当陈旧,但我发现 Brinch Hansen在Pascal编译器上是一个非常实用的介绍,用于创建语言和构建编译器的元素。尽管有这个名字,但它并不是特定于Pascal的。如果你能找到副本,这是非常值得的。