我有关于编译器短语的经验,我对编程语言&编译器领域,我希望有人能给我一些解释,从一开始就为新的编程语言编写一个新编译器的好方法是什么? (我的意思是STEPS )。
答案 0 :(得分:9)
第一步是阅读Dragon Book。
它提供了对编译器构建的整个领域的良好介绍,但也详细介绍了实际构建自己的编译器。
至于以下步骤,我建议按照本书的章节进行操作。它不是作为教程编写的,但提供了许多实用的建议,使其成为您自己的想法和研究的理想中心。
答案 1 :(得分:5)
请不要使用龙书,它已经过时且过时(并且大部分内容使用了奇怪的名称)。
对于书籍,我建议使用Apple的Tiger Book或Cooper's Engineering编译器。我强烈建议你使用像llvm这样的框架,这样你就不必为代码生成等重新实现一堆东西了。
以下是使用llvm构建语言的教程:http://llvm.org/docs/tutorial/
答案 2 :(得分:3)
我会考虑将你的langauge /前端与GNU编译器框架集成。
这样你只需要(仅!)需要将解析器和翻译器编写为gcc的可移植对象格式。您可以免费获得所选芯片的优化器,目标代码生成,链接器等。
另一个替代方案是以Java JVM为目标,虚拟机具有良好的文档记录,并且JVM指令集比x86机器代码更加稳定。
答案 3 :(得分:2)
我设法编写了一个没有任何特定书籍的编译器(虽然我过去曾阅读过一些编译器书籍,但没有真正的细节)。
你应该做的第一件事是使用任何“编译器编译器”类型工具(flex,bison,antlr,javacc)并使你的语法有效。语法大多是直截了当的,但总有一些东西会阻碍并破坏一切。特别是表达,优先等等。
一些较旧的简单语言因某种原因而更简单。它使解析器“Just Work”。考虑一个Pascal变种,只能通过递归体面处理。
我提到这一点是因为没有你的语法,你就没有语言。如果你不能正确地解析和诠释它,你就无处可去。在你的新语言中观看十几行示例代码,转入一系列令牌和语法节点实际上真的很棒。在“哇,它确实有效”的方式。它实际上几乎是“它全部工作”或“没有任何工作”的东西,特别是在开始时。一旦它真正起作用,你觉得你可能真的能够把它拉下来。
并且在某种程度上这是真的,因为一旦你完成了那部分,你必须得到你的基本运行时间。一旦你得到“a = 1 + 1”编译,大部分新工作都在你的后面,现在你只需要实现其余的操作符。它基本上变成了管理查找表和引用的练习,并且在过程中的任何时候都可以了解您的位置。
你可以凭借全新的语法,创新的运行时间等自行运行。但如果你有时间,最好做一个已经完成的语言,只是为了理解和实现所有步骤,并考虑一下你是否正在编写你真正想要的语言,你将如何以不同的方式对现有的语言进行处理。
编译器编写有很多机制,只是成功完成这个过程,当你想要回来并用你自己的新语言再做一次时,你会更有信心。