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

Jus*_*tin 37 java compiler-construction oop recursion refactoring

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

不久前,我偶然发现了" 让我们编写一个编译器 ",并且无法拒绝编写一些代码.我在C#中编写了一个递归下降的C编译器,输出.NET CIL."写一次,到处泄漏"是我的口号.

太糟糕了,直到太晚才发现解析C是一场噩梦.

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

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

Tim*_*thy 6

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

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

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


Mar*_*Dow 5

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

Martin Fowler 的“领域特定语言”也不错。它与纯编译器课程的议程略有不同,但它是语言设计关键概念的很好参考。


Esc*_*alo 2

您看过PyPy项目吗?它是 Python 语言的 Python 实现。或许它能为你自举Java的目标提供一些启发?