我应该使用什么编译器作为自学编译器原理技术的案例研究
what compiler should I use as case study for self studying compiler principles techniques
我决定开始研究编译器理论,但问题是我想要一个适用于任何语言的编译器,以便跟踪每个
- 词法分析器输出。
- 语法树。
- 中间表示。
- 代码生成。
- 我现在不关心优化
我知道一些与我类似的关于 clang 和 gcc 的问题,我知道它们都在进行词法和语法分析
我只想要任何语言的任何编译器,只要编译器本身是用 C 和 运行 在 ubuntu x64
上编写的
要探索这片领土,可以从很多很多地方开始。许多语言都包含编译功能或方面,例如 Lisp 和 Forth.
要了解 C 编译器,有一本关于 LCC 编译器的书,其中包含编译器的源代码。 The Unix History Society archive (tuhs.org) 中也有旧 C 编译器的存储库。
您还可以从另一个角度研究语言 False(更著名的 Brainfuck 的祖先),它旨在只需很少的代码即可实现。
与您对复杂性理论的兴趣相关的另一个角度是了解乔姆斯基语言层次结构以及可以解析它们的相关抽象机器。这将告诉您为什么 Lex 和 Yacc 是独立的工具以及它们各自的优点(以及如何自己做而不需要它们)。
实际上我自己也在进行同样的探索。我目前正在阅读 1979 年的旧书 Lisp 剖析,其中当然包含 Lisp 中的编译器代码。但这没关系,因为我已经有了自己的自制程序 lisp interpreter 来执行它。
如果您愿意专门学习 C 的编译技术,我不确定您的方法是否正确。而且 C 不是编写 compiler in (if you start from scratch, Ocaml is better suited for that task). BTW, recent Clang/LLVM or GCC 的最佳语言,而是用 C++ 编码(不再用 C)。
C 语言现在需要优化,正如我解释的here,因此跳过优化部分不是很有用。请注意,优化过程构成了现实世界编译器的大部分和最困难的部分。
lexing and parsing parts of compiler are now well understood. And there are several code generator tools for them (yacc
or bison
, lex
or flex
, ANTLR...). For several pragmatical reasons,像 GCC 这样的真正的编译器不使用这些工具。
如果你想深入了解 非优化 玩具 C 编译器,你可以查看 tinycc, nwcc, or 8cc。
您还可以查看真实编译器的中间表示,例如GIMPLE for GCC (BTW, try to compile with gcc -fdump-tree-all -O2 -c
some simple C code with a few loops; you'll be surprized by the hundreds of dump files showing the many internal compiler representations from many passes). You'll learn a lot by customizing GCC with MELT, and the MELT documentation page contains several very useful references. This answer 还应该帮助并包含或引用 GCC 的一些图片。
免责声明:我是MELT的主要作者
PS。 bootstrap compilers 有很好的理由。因此,用于 C 语言以外的语言的编译器不太可能用 C 编码(通常是为该语言本身编码),因为 C 不是一种从头开始编写编译器的好编程语言。
PPS。如果您只会 C 语言而不会其他编程语言,我建议您学习其他一些编程语言(例如 SICP, Ocaml, or Haskell or Scala or Clojure or Common Lisp) before diving into compilers! Read also something about Programming Language Pragmatics. If you know a bit of Scheme or Lisp, Queinnec's book Lisp In Small Pieces 的 Scheme 会教给您很多东西。
Tiger language 是由教授设计的。 Andrew Appel 正是有意逐步说明完整的编译器构建过程。
您可以 google 'tiger language' 并阅读一些在线资源,SO 上也有一些 questions/answers,但更好的选择是获得这本书的副本对于您喜欢的语言,并实现您最感兴趣的部分。
我决定开始研究编译器理论,但问题是我想要一个适用于任何语言的编译器,以便跟踪每个
- 词法分析器输出。
- 语法树。
- 中间表示。
- 代码生成。
- 我现在不关心优化
我知道一些与我类似的关于 clang 和 gcc 的问题,我知道它们都在进行词法和语法分析 我只想要任何语言的任何编译器,只要编译器本身是用 C 和 运行 在 ubuntu x64
上编写的要探索这片领土,可以从很多很多地方开始。许多语言都包含编译功能或方面,例如 Lisp 和 Forth.
要了解 C 编译器,有一本关于 LCC 编译器的书,其中包含编译器的源代码。 The Unix History Society archive (tuhs.org) 中也有旧 C 编译器的存储库。
您还可以从另一个角度研究语言 False(更著名的 Brainfuck 的祖先),它旨在只需很少的代码即可实现。
与您对复杂性理论的兴趣相关的另一个角度是了解乔姆斯基语言层次结构以及可以解析它们的相关抽象机器。这将告诉您为什么 Lex 和 Yacc 是独立的工具以及它们各自的优点(以及如何自己做而不需要它们)。
实际上我自己也在进行同样的探索。我目前正在阅读 1979 年的旧书 Lisp 剖析,其中当然包含 Lisp 中的编译器代码。但这没关系,因为我已经有了自己的自制程序 lisp interpreter 来执行它。
如果您愿意专门学习 C 的编译技术,我不确定您的方法是否正确。而且 C 不是编写 compiler in (if you start from scratch, Ocaml is better suited for that task). BTW, recent Clang/LLVM or GCC 的最佳语言,而是用 C++ 编码(不再用 C)。
C 语言现在需要优化,正如我解释的here,因此跳过优化部分不是很有用。请注意,优化过程构成了现实世界编译器的大部分和最困难的部分。
lexing and parsing parts of compiler are now well understood. And there are several code generator tools for them (yacc
or bison
, lex
or flex
, ANTLR...). For several pragmatical reasons,像 GCC 这样的真正的编译器不使用这些工具。
如果你想深入了解 非优化 玩具 C 编译器,你可以查看 tinycc, nwcc, or 8cc。
您还可以查看真实编译器的中间表示,例如GIMPLE for GCC (BTW, try to compile with gcc -fdump-tree-all -O2 -c
some simple C code with a few loops; you'll be surprized by the hundreds of dump files showing the many internal compiler representations from many passes). You'll learn a lot by customizing GCC with MELT, and the MELT documentation page contains several very useful references. This answer 还应该帮助并包含或引用 GCC 的一些图片。
免责声明:我是MELT的主要作者
PS。 bootstrap compilers 有很好的理由。因此,用于 C 语言以外的语言的编译器不太可能用 C 编码(通常是为该语言本身编码),因为 C 不是一种从头开始编写编译器的好编程语言。
PPS。如果您只会 C 语言而不会其他编程语言,我建议您学习其他一些编程语言(例如 SICP, Ocaml, or Haskell or Scala or Clojure or Common Lisp) before diving into compilers! Read also something about Programming Language Pragmatics. If you know a bit of Scheme or Lisp, Queinnec's book Lisp In Small Pieces 的 Scheme 会教给您很多东西。
Tiger language 是由教授设计的。 Andrew Appel 正是有意逐步说明完整的编译器构建过程。
您可以 google 'tiger language' 并阅读一些在线资源,SO 上也有一些 questions/answers,但更好的选择是获得这本书的副本对于您喜欢的语言,并实现您最感兴趣的部分。