是否有更现代的,可能是面向对象的,相当于Jack Crenshaw的“Let's Build a Compiler”系列?
前一阵子我偶然发现了“Let's Build a Compiler”并且无法抗拒写一些代码。我在C#中编写了一个递归下降的C编译器,输出.NET CIL。 “写一次,无处不在”是我的口号。
太糟糕了,直到太晚才意识到解析C是一场噩梦。
我现在有兴趣用Java编写Java编译器,输出.NET CIL或程序集,目的是自引导。我希望可能会有更新的教程。
顺便说一句,您是否会花更多时间进行前期设计,或者只是编写大量测试来支持无情重构的能力。回想起来,我倾向于后者。编译器工作但代码非常糟糕。
答案 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足够直观,只能通过阅读manual和tutorial
来使用它最后但并非最不重要的是,它也可以与其他语言一起使用,包括Java(使用Cup和JLex)
答案 4 :(得分:1)
您是否看过PyPy项目?它是Python语言的Python实现。也许它可以为你自我引导Java的目标提供一些灵感?
答案 5 :(得分:1)
答案 6 :(得分:0)
在考虑学习这些内容时,你应该看一下书language-implementation-patterns和antlr-reference
答案 7 :(得分:0)
如果您想通过示例学习Finch的代码,我的一点编程语言:
答案 8 :(得分:0)
Watt&用Java编写的Brown编程语言处理器。它演示了(简单)编译器设计中使用的OO模式。我成功地将它用于C#。