有一个更现代的OO版本的“让我们build立一个编译器”?
有没有更现代的,也许是面向对象的,相当于Jack Crenshaw的“ Let's Build a Compiler ”系列?
前段时间,我偶然发现了“ 让我们编译一个编译器 ”,并不能拒绝写一些代码。 我在C#中编写了一个输出.NET CIL的recursion下降C编译器。 “写一次,到处漏”是我的口号。
太糟糕了,我一直没有意识到parsingC是一个噩梦。
我现在感兴趣的是用Java编写Java编译器,输出.NET CIL或程序集,目标是自引导。 我希望有一些更新的教程可以踢。
顺便说一句,你会花更多的时间进行前期devise,还是只是写一大堆testing来支持无情重构的能力。 回想起来,我倾向于后者。 编译器工作,但代码真的很糟糕。
听起来你完全错过了Crenshaw教程的重点。 LBC不是要写出漂亮,干净或高效的代码。 这就是把那些沉浸在forms理论中的东西降低到偶然的编码者可以轻易快速地破解一个基本的(但是工作)的编译器的水平。
当我读完LBC的时候,我重写了C#中的例子。 我相信课堂布局不是最好的,或者任务分离得恰到好处,但是和他的帕斯卡相比。 如果您愿意,我会很乐意与您分享这些代码 – 请告诉我,我可以在线发布并分享链接。
在业余时间,我一直在写一些写作,目的是把LBC的理论和编译器devise的基础统一起来 – 在每个单元/章节的末尾用实际的工作代码走走,还讨论一些理论在探索了想法之后,读者理解为什么事情是这样的。 但是克伦肖花了好几年才写出了他的不完整的系列文章,所以我把自己当成了一个梦想……而我使用C(正是因为它不是C ++或者Java)。
看看Terence Parr的“语言实施模式” 。 他写了ANTLR – Java的parsing器生成器 – 所以知道他的东西。 它很好地解释了编译器devise的原则并逐渐build立起来。
马丁·福勒的“领域特定语言”也不错。 它与纯粹的编译器课程略有不同,但它是语言devise的关键概念的一个很好的参考。
我是“MiniJava”的粉丝,以及基于“Java现代编译器实现”系列书籍的相关工作。 这并不完全符合你提到的所有要求,因为MiniJava实现通常会生成本地代码 – 但后端可以很容易地被改变为发出MSIL或其他东西。
你看了一下PyPy项目吗? 这是Python语言的Python实现。 也许它可以为自我引导Java的目标提供一些启发?
我最近在我的公司使用BNFC构build了一个编译器,起初我被指示使用Flex和Bison(C / C ++),但是我发现它们很痛苦,所以我用BNFC生成了Flex和Bison文件。
不能说我喜欢代码,我的语法很大,生成的访问者也是如此,但是我从来没有办法处理,我从一开始就TDDed,所以我总是有足够的testing来重构,但我也保留了一个UML图帮助我思考我写的额外课程。
实际上有一本名为“ 实施编程语言 ”的书,自称为“自学手册,在某种程度上是BNFC工具的手册”,我读过它,可能在执行决定上挣扎较less,但总的来说,我发现BNFC要足够直观,只需阅读手册和教程即可使用它
最后但并非最不重要的,它也可以用于其他语言,包括Java(与杯和JLex)
关于写作编译器和口译员:麦当劳的软件工程方法 ?
当想到学习这些东西的时候,你应该看看书的语言实现模式和反参考
如果你喜欢通过例子来学习,我的一个小编程语言Finch的代码:
- 是用面向对象的C ++编写的。
- 很干净。
- 包含一个字节码编译器。
瓦特和布朗的Java编程语言处理器如何? 它演示了在简单编译器devise中使用的OO模式。 我成功地使用了C#。
这是一个老话题,但我想分享在很多情况下,人们通过谷歌find这个职位。
我读过Jack Crenshaw的书,并使用Easy68K摩托罗拉68K仿真器应用了这些技术。 文中的编译器是针对摩托罗拉68K处理器的,所以你需要有一个带有该处理器或模拟器的系统。
之后,我决定用我通过这个经验学到的技巧来写一个口译员。 我的口译员的名字是Contra,这里是它的github回购 。
我已经写在Java中。 因此,任何懂得java,c#或类似编程语言的程序员都很容易阅读。
你可以下载源代码并从中学习。 其代码基础干净整洁。
穆罕默德。