有没有更现代的OO版本的“让我们构建一个编译器”?[已关闭]

有没有一个更现代的,也许是面向对象的,相当于杰克·克伦肖(Jack Crenshaw)的“让我们构建编译器”系列?

不久前,我偶然发现了“让我们构建一个编译器”,并且无法抗拒编写一些代码。我用C#编写了一个递归下降C编译器,输出.NET CIL。“写一次,到处漏”是我的口号。

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

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

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


答案 1

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

当我多年前通读LBC时,我重写了C#中的示例。我确信班级布局不是最好的,或者任务隔离得当,但它可以与他的Pascal相媲美。如果您愿意,我很乐意与您分享代码 - 请告诉我,我可以将其发布到网上并分享链接。

在业余时间,我一直在编写一些文章,目的是将LBC和编译器设计基础的哲学统一在一起 - 在每个单元/章节的末尾使用实用的工作代码,并在探索想法后讨论一些理论内容,以便读者理解为什么事情是这样的。但是克伦肖花了好几年的时间才写出他不完整的系列,所以我是一个白日梦......我使用C(正是因为它不是C++或Java)。


答案 2

看看Terence Parr的“语言实现模式”。他写了ANTLR - Java的解析器生成器 - 所以知道他的东西。它很好地解释了编译器设计的原理,并逐渐建立起来。

Martin Fowler的“Domain Specific Languages”也很好。它的议程与纯粹的编译器课程略有不同,但它是语言设计关键概念的良好参考。