【问题标题】:What is the good approach to build a new compiler?构建新编译器的好方法是什么?
【发布时间】:2009-10-12 09:34:35
【问题描述】:

我有关于编译器短语的经验,我对编程语言和编译器领域感兴趣,我希望有人能给我一些解释,说明从头开始为新编程语言编写新编译器的好方法是什么? (我的意思是步骤)。

【问题讨论】:

    标签: c compiler-construction programming-languages


    【解决方案1】:

    第一步是阅读Dragon Book

    它很好地介绍了编译器构建的整个领域,但也提供了足够的细节来实际构建您自己的。

    至于以下步骤,我建议按照本书的章节进行。它不是作为教程编写的,但提供了许多实用的建议,这使它成为您自己的想法和研究的理想中心。

    【讨论】:

    • 拜托各位,你应该真的停止引用龙书......这是最糟糕的编译器书籍之一。您可以引用 Appel、Cooper 等。但不要引用 Dragon Book。
    • “Modern Compiler Implementation”(Appel)写得很糟糕,“Engineering a Compiler”(Cooper)不太适合初学者。
    • 不能比奥术龙书差。我个人没有觉得老虎书写得不好,虽然我从来没有从头到尾读过,但我发现它有很多非常好的见解。
    • “工程编译器”是一本非常适合初学者的书(尽管它在中级水平上也有自己的特色),远远超过 Dragon 的书。 《龙之书》确实是对编译器的糟糕介绍。
    • 我喜欢《龙书》... ^_^
    【解决方案2】:

    请不要使用《龙之书》,它很旧而且大部分都过时了(并且大多数东西都使用奇怪的名字)。

    对于书籍,我推荐 Apple 的 Tiger Book 或 Cooper 的 Engineering 编译器。我强烈建议你使用像llvm 这样的框架,这样你就不必重新实现一堆代码生成等东西。

    这里是使用 llvm 构建语言的教程:http://llvm.org/docs/tutorial/

    【讨论】:

      【解决方案3】:

      我会考虑将您的语言/前端与 GNU 编译器框架集成。

      这样,您只需(仅!)将解析器和翻译器编写为 gcc 的可移植对象格式。您可以免费获得优化器、所选芯片的目标代码生成、链接器等。

      另一种选择是以 Java JVM 为目标,该虚拟机有很好的文档记录,并且 JVM 指令集比 x86 机器代码更直接。

      【讨论】:

      • 取决于你想做什么。如果你真的想知道一切是如何从头开始工作的,GCC 是一种非常令人困惑的方式。
      【解决方案4】:

      我设法在没有任何特定书籍的情况下编写了一个编译器(尽管我过去读过一些编译器书籍,只是没有任何真正的细节)。

      您应该做的第一件事是使用任何“编译器编译器”类型的工具(flex、bison、antlr、javacc)并让您的语法正常工作。语法大多是直截了当的,但总有一些细节会妨碍并破坏一切。尤其是表达式、优先级等。

      一些较旧的简单语言更简单是有原因的。它使解析器“正常工作”。考虑一个可以仅通过递归体面处理的 Pascal 变体。

      我提到这一点是因为没有你的语法,你就没有语言。如果您无法正确解析和使用它,那么您将无法快速获得任何结果。看着你的新语言中的十几行示例代码变成了大量的标记和语法节点,实际上真的很神奇。以一种“哇,它真的有效”的方式。从字面上看,它几乎是一种“一切正常”或“都不起作用”之类的东西,尤其是在开始时。一旦它真正发挥作用,你就会觉得你可能真的能够成功。

      在某种程度上确实如此,因为一旦你完成了那部分,你就必须让你的基本运行时运行起来。一旦你编译了“a = 1 + 1”,大部分新工作就在你身后,现在你只需要实现其余的运算符。它基本上变成了一种管理查找表和引用的练习,并且在此过程中的任何时候都知道你在哪里。

      您可以使用全新的语法、创新的运行时等自行完成。但如果您有时间,最好使用已经完成的语言,只需了解并实施所有步骤,并想一想,如果您正在编写您真正想要的语言,您将如何以不同的方式使用现有的语言来做您正在做的事情。

      编译器编写有很多技巧,只要成功地完成这个过程一次,当你想回来用你自己的新语言再做一次时,你就会更有信心。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-27
        • 1970-01-01
        • 2017-04-21
        • 2017-03-23
        • 2010-10-08
        • 2011-02-25
        • 2013-08-19
        相关资源
        最近更新 更多