【发布时间】:2009-10-12 09:34:35
【问题描述】:
我有关于编译器短语的经验,我对编程语言和编译器领域感兴趣,我希望有人能给我一些解释,说明从头开始为新编程语言编写新编译器的好方法是什么? (我的意思是步骤)。
【问题讨论】:
标签: c compiler-construction programming-languages
我有关于编译器短语的经验,我对编程语言和编译器领域感兴趣,我希望有人能给我一些解释,说明从头开始为新编程语言编写新编译器的好方法是什么? (我的意思是步骤)。
【问题讨论】:
标签: c compiler-construction programming-languages
第一步是阅读Dragon Book。
它很好地介绍了编译器构建的整个领域,但也提供了足够的细节来实际构建您自己的。
至于以下步骤,我建议按照本书的章节进行。它不是作为教程编写的,但提供了许多实用的建议,这使它成为您自己的想法和研究的理想中心。
【讨论】:
请不要使用《龙之书》,它很旧而且大部分都过时了(并且大多数东西都使用奇怪的名字)。
对于书籍,我推荐 Apple 的 Tiger Book 或 Cooper 的 Engineering 编译器。我强烈建议你使用像llvm 这样的框架,这样你就不必重新实现一堆代码生成等东西。
这里是使用 llvm 构建语言的教程:http://llvm.org/docs/tutorial/
【讨论】:
我会考虑将您的语言/前端与 GNU 编译器框架集成。
这样,您只需(仅!)将解析器和翻译器编写为 gcc 的可移植对象格式。您可以免费获得优化器、所选芯片的目标代码生成、链接器等。
另一种选择是以 Java JVM 为目标,该虚拟机有很好的文档记录,并且 JVM 指令集比 x86 机器代码更直接。
【讨论】:
我设法在没有任何特定书籍的情况下编写了一个编译器(尽管我过去读过一些编译器书籍,只是没有任何真正的细节)。
您应该做的第一件事是使用任何“编译器编译器”类型的工具(flex、bison、antlr、javacc)并让您的语法正常工作。语法大多是直截了当的,但总有一些细节会妨碍并破坏一切。尤其是表达式、优先级等。
一些较旧的简单语言更简单是有原因的。它使解析器“正常工作”。考虑一个可以仅通过递归体面处理的 Pascal 变体。
我提到这一点是因为没有你的语法,你就没有语言。如果您无法正确解析和使用它,那么您将无法快速获得任何结果。看着你的新语言中的十几行示例代码变成了大量的标记和语法节点,实际上真的很神奇。以一种“哇,它真的有效”的方式。从字面上看,它几乎是一种“一切正常”或“都不起作用”之类的东西,尤其是在开始时。一旦它真正发挥作用,你就会觉得你可能真的能够成功。
在某种程度上确实如此,因为一旦你完成了那部分,你就必须让你的基本运行时运行起来。一旦你编译了“a = 1 + 1”,大部分新工作就在你身后,现在你只需要实现其余的运算符。它基本上变成了一种管理查找表和引用的练习,并且在此过程中的任何时候都知道你在哪里。
您可以使用全新的语法、创新的运行时等自行完成。但如果您有时间,最好使用已经完成的语言,只需了解并实施所有步骤,并想一想,如果您正在编写您真正想要的语言,您将如何以不同的方式使用现有的语言来做您正在做的事情。
编译器编写有很多技巧,只要成功地完成这个过程一次,当你想回来用你自己的新语言再做一次时,你就会更有信心。
【讨论】: