Compiler construction 学习编写编译器

Compiler construction 学习编写编译器,compiler-construction,language-agnostic,Compiler Construction,Language Agnostic,首选语言:C/C++、Java和Ruby 我正在寻找一些关于如何编写自己的编译器的有用书籍/教程,仅供教育之用。我最熟悉C/C++、Java和Ruby,因此我更喜欢这三种资源中的一种,但任何好的资源都是可以接受的。资源清单: ¨ $ ¨ $ $ $ [C语言中的编译器设计] $-aka;被广泛认为是编写编译器的“书” $ (请看“Jan Niestadt实现脚本引擎”) $ ¨ (在$中描述)指定一种评估语言中句子的方法 $ Jack Crenshaw-版本(示例为Pasca

首选语言:C/C++、Java和Ruby

我正在寻找一些关于如何编写自己的编译器的有用书籍/教程,仅供教育之用。我最熟悉C/C++、Java和Ruby,因此我更喜欢这三种资源中的一种,但任何好的资源都是可以接受的。

资源清单:
  • ¨
  • $
  • ¨
  • $
  • $
  • $
  • [C语言中的编译器设计]
  • $-aka;被广泛认为是编写编译器的“书”
  • $
  • (请看“Jan Niestadt实现脚本引擎”)
  • $
  • ¨
  • (在$中描述)指定一种评估语言中句子的方法
  • $
  • Jack Crenshaw-版本(示例为Pascal,但信息通常适用)
  • $(谷歌图书)
  • $
  • $-还有$和$版本-被广泛认为是一本非常好的书
  • $
  • -看第13章
  • $
  • ¨
  • -快速指南
  • -来自MSDN的快速教程
  • -快速指南
  • -直接编译到x86-64
图例:

  • ¨链接到PDF文件
  • $Link到一本印刷书籍
    • 非常棒,但有点过时。(我并不是说这会让它的有效性降低一点。)


      或者退房。这类似于“让我们构建一个编译器”,但对于初学者来说是一个更好的资源。这是一个pdf教程,它采用7步的方法教你一个编译器。添加QuoLink链接,因为它有链接到所有不同的俚语端口,在C++、java和JS中,还有Python和java的解释器,最初使用C和.NET平台编写。在我看来,它是编译器构造的权威指南。不过,还是要准备一些核心理论

      如果你想要一本理论性较轻的书,也许对你来说是一本更好的书。如果你是一个编译器理论的新手,它提供了一个更温和的介绍。它没有涵盖更实际的解析方法(选择非预测递归下降,而不讨论LL或LR解析),而且我记得,它甚至没有讨论任何类型的优化理论。另外,它不是编译成机器代码,而是编译成一个字节码,该字节码应该在您也编写的VM上运行


      这仍然是一本不错的书,特别是如果你能在亚马逊上买到便宜的话。如果您只想简单地介绍一下编译器,那么掌握游戏脚本并不是一个好办法。如果你想成为铁杆高手,那么你应该满足于龙之书。

      如果你想使用强大、更高级的工具,而不是自己构建一切,那么浏览的项目和阅读资料是一个不错的选择。这是一门语言课程,由Java解析器引擎ANTLR的作者编写。您可以从以下网站获得本课程的PDF格式书籍

      本课程将介绍您在其他地方看到的标准编译器内容:解析、类型和类型检查、多态性、符号表和代码生成。几乎唯一没有涉及的是优化。最后一个项目是一个项目。因为您使用像ANTLR和LLVM这样的工具,所以在一天内编写整个编译器是可行的(我有一个存在的证据,尽管我的意思是24小时)。它重于使用现代工具的实际工程,轻一点理论

      顺便说一下,LLVM简直太棒了。在许多情况下,您通常可以编译为汇编,但最好是编译为汇编。它是更高层次、跨平台的,LLVM非常擅长从中生成优化的汇编。

      无疑是“构建编译器”一书,但是如果您的语言没有当前一代语言那么复杂,您可能需要从中查看解释器模式

      书中的例子设计了一种类似正则表达式的语言,并且经过了很好的思考,但正如他们在书中所说的,它有助于思考整个过程,但实际上只对小型语言有效。然而,使用这种模式为一种小型语言编写解释器要比学习所有不同类型的解析器、yacc和lex等快得多……

      我认为这是编写文本的最好的入门编译器。还有a和a,考虑到您的语言背景,这两个选项中的任何一个都可能更容易访问。这本书将大量有用的基础材料(扫描和解析、语义分析、激活记录、指令选择、RISC和x86本机代码生成)和各种“高级”主题(编译OO和函数式语言、多态性、垃圾收集、优化和单个静态赋值形式)打包到相对较小的空间中(约500页)

      与《龙之书》相比,我更喜欢《现代编译器实现》,因为《现代编译器实现》所涉及的领域较少——相反,它确实涵盖了编写一个严肃、体面的编译器所需的所有主题。读完这本书后,如果需要的话,您将准备直接处理研究论文,以获得更深入的内容。


      我必须承认,我对Niklaus Wirth的《它是PDF格式》有一个严重的偏爱。我觉得Wirth的编程美学非常漂亮,但是有些人觉得他的风格太简单了(例如,Wirth喜欢递归下降解析器,但大多数CS课程侧重于解析器生成器工具;Wirth的语言设计相当保守。)编译器构造是对沃思基本思想的一种非常简洁的提炼,因此无论您是否喜欢他的风格,我都强烈建议您阅读这本书。

      Python附带了Python compi
      public String maxAsString(int a, int b) {
          if (a > b) {
              return Integer.valueOf(a).toString();
          } else if (a < b) {
              return Integer.valueOf(b).toString();
          } else {
              return "equals";
          }
      }
      
      BCELifier bcelifier = new BCELifier("MyClass", System.out);
      bcelifier.start();
      
      private void createMethod_1() {
        InstructionList il = new InstructionList();
        MethodGen method = new MethodGen(ACC_PUBLIC, Type.STRING, new Type[] { Type.INT, Type.INT }, new String[] { "arg0", "arg1" }, "maxAsString", "MyClass", il, _cp);
      
        il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load first parameter to address 1
        il.append(InstructionFactory.createLoad(Type.INT, 2)); // Load second parameter to adress 2
          BranchInstruction if_icmple_2 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPLE, null); // Do if condition (compare a > b)
        il.append(if_icmple_2);
        il.append(InstructionFactory.createLoad(Type.INT, 1)); // Load value from address 1 into the stack
        il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
        il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
        il.append(InstructionFactory.createReturn(Type.OBJECT));
        InstructionHandle ih_13 = il.append(InstructionFactory.createLoad(Type.INT, 1));
        il.append(InstructionFactory.createLoad(Type.INT, 2));
          BranchInstruction if_icmpge_15 = InstructionFactory.createBranchInstruction(Constants.IF_ICMPGE, null); // Do if condition (compare a < b)
        il.append(if_icmpge_15);
        il.append(InstructionFactory.createLoad(Type.INT, 2));
        il.append(_factory.createInvoke("java.lang.Integer", "valueOf", new ObjectType("java.lang.Integer"), new Type[] { Type.INT }, Constants.INVOKESTATIC));
        il.append(_factory.createInvoke("java.lang.Integer", "toString", Type.STRING, Type.NO_ARGS, Constants.INVOKEVIRTUAL));
        il.append(InstructionFactory.createReturn(Type.OBJECT));
        InstructionHandle ih_26 = il.append(new PUSH(_cp, "equals")); // Return "equals" string
        il.append(InstructionFactory.createReturn(Type.OBJECT));
        if_icmple_2.setTarget(ih_13);
        if_icmpge_15.setTarget(ih_26);
        method.setMaxStack();
        method.setMaxLocals();
        _cg.addMethod(method.getMethod());
        il.dispose();
      }