是否有更现代的OO版“让我们构建一个编译器”?

时间:2010-09-16 04:30:10

标签: java compiler-construction oop refactoring recursion

是否有更现代的,可能是面向对象的,相当于Jack Crenshaw的“Let's Build a Compiler”系列?

前一阵子我偶然发现了“Let's Build a Compiler”并且无法抗拒写一些代码。我在C#中编写了一个递归下降的C编译器,输出.NET CIL。 “写一次,无处不在”是我的口号。

太糟糕了,直到太晚才意识到解析C是一场噩梦。

我现在有兴趣用Java编写Java编译器,输出.NET CIL或程序集,目的是自引导。我希望可能会有更新的教程。

顺便说一句,您是否会花更多时间进行前期设计,或者只是编写大量测试来支持无情重构的能力。回想起来,我倾向于后者。编译器工作但代码非常糟糕。

9 个答案:

答案 0 :(得分:6)

听起来你完全错过了Crenshaw的教程。 LBC不是要编写漂亮,干净或高效的代码。所有这一切都是为了将​​一些沉浸在形式理论中的东西降低到一个水平,在这个水平上,随意的编码器可以轻松快速地破解一个基本的(但工作!)编译器。

当我几年前阅读LBC时,我用C#重写了这些例子。我确定课程布局不是最好的,或者任务分开正确,但它与他的Pascal相当。如果您愿意,我很乐意与您分享代码 - 让我知道,我可以在线发布并分享链接。

在业余时间,我一直在讨论一些写作,目的是将LBC和编译器设计基础的哲学统一起来 - 在每个单元/章的末尾用实用的工作代码走开,同时也在探索这些想法之后讨论一些理论上的东西,以便读者理解为什么事情就是这样。但是,Crenshaw花了很多年才写出他不完整的系列,所以我的我是个梦想......而且我使用C(完全是因为它不是C ++或Java)。

答案 1 :(得分:4)

看看Terence Parr's "Language Implementation Patterns"。他写了一个ANTLR - 一个用于Java的解析器生成器 - 所以他知道他的东西。它很好地解释了编译器设计的原理并逐渐建立起来。

Martin Fowler's "Domain Specific Languages"也很好。它与纯粹的编译器课程略有不同,但是对语言设计的关键概念是一个很好的参考。

答案 2 :(得分:2)

我是"MiniJava"的粉丝以及基于“Java中的现代编译器实现”系列书籍的相关工作。这并不完全符合您提到的所有要求,因为MiniJava实现通常会生成本机代码 - 但后端可以轻松更改为发出MSIL或其他任何内容。

答案 3 :(得分:2)

我最近在我的公司使用BNFC构建了一个编译器,起初我被指示使用Flex和Bison(C / C ++),但我发现它们很痛苦所以我使用BNFC来生成Flex和野牛档案。

不能说我喜欢这些代码,我的语法非常大,生成的访问者也是如此,但我无法处理,我从头开始TDDed所以我总是有足够的测试来重构,但我也保留了UML图可以帮助我思考我编写的其他类。

实际上有一本名为Implementing Programming Languages的书被自称为“自学书,在某种程度上,是BNFC工具的手册”,如果我读到它,我可能会对实施决策的努力减少但是总的来说,我发现BNFC足够直观,只能通过阅读manualtutorial

来使用它

最后但并非最不重要的是,它也可以与其他语言一起使用,包括Java(使用Cup和JLex)

答案 4 :(得分:1)

您是否看过PyPy项目?它是Python语言的Python实现。也许它可以为你自我引导Java的目标提供一些灵感?

答案 5 :(得分:1)

答案 6 :(得分:0)

在考虑学习这些内容时,你应该看一下书language-implementation-patternsantlr-reference

答案 7 :(得分:0)

如果您想通过示例学习Finch的代码,我的一点编程语言:

  1. 用面向对象的C ++编写。
  2. 非常干净。
  3. 包含字节码编译器。

答案 8 :(得分:0)

Watt&用Java编写的Brown编程语言处理器。它演示了(简单)编译器设计中使用的OO模式。我成功地将它用于C#。

相关问题