学习编写编译器

首选语言:C/C++,Java和Ruby。

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

349432 次浏览

资源大列表:

图例:

  • ☆链接到PDF文件
  • $链接到印刷书籍

“让我们构建一个编译器”很棒,但它有点过时了。(我不是说它让它变得不那么有效。)

或者查看SLANG。这类似于“让我们构建一个编译器”,但这是一个更好的资源,特别是对于初学者来说。这附带了一个pdf教程,它采用7步方法教你编译器。添加quora链接,因为它链接到SLANG的所有不同端口,C++,Java和JS,还有python和java的解释器,最初使用C#和. NET平台编写。

我同意龙书参考;IMO,它是编译器构建的权威指南。不过,准备好一些核心理论。

如果你想要一本理论性更强的书,游戏脚本精通可能是一本更好的书。如果你是编译器理论的新手,它提供了更温和的介绍。它没有涵盖更实用的解析方法(选择非预测递归下降,而不讨论LL或LR解析),而且据我回忆,它甚至没有讨论任何类型的优化理论。此外,它不是编译成机器代码,而是编译成应该在你编写的虚拟机上运行的字节码。

这仍然是一本不错的读物,特别是如果你能在亚马逊上以便宜的价格买到它。如果你只想简单地介绍编译器,游戏脚本精通是一个不错的选择。如果你想在前面硬核,那么你应该满足于龙书。

如果您希望使用功能强大的高级工具而不是自己构建一切,那么浏览本课程的项目和阅读是一个非常好的选择。这是Java解析器引擎ANTLR作者的语言课程。您可以从务实的程序员以PDF形式获取该课程的书籍。

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

顺便说一句,LLVM简直太棒了。在许多情况下,你通常可以编译为汇编,你最好编译为LLVM的中间表示。它是更高级别的,跨平台的,LLVM非常擅长从中生成优化的汇编。

龙之书绝对是“构建编译器”的书,但如果您的语言没有当前一代语言那么复杂,您可能需要查看设计模式中的解释器模式。

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

我认为ML中的现代编译器实现是最好的入门编译器。还有一个Java版本和一个c版,考虑到你的语言背景,这两个都可能更容易理解。这本书在相对较小的空间(约500页)中包含了许多有用的基础材料(扫描和解析、语义分析、激活记录、指令选择、RISC和x86本机代码生成)和各种“高级”主题(编译OO和函数式语言、多态、垃圾回收机制、优化和单个静态赋值表单)。

我更喜欢《现代编译器实现》而不是《龙》这本书,因为《现代编译器实现》对该领域的调查较少——相反,它对编写一个严肃、体面的编译器所需的所有主题都有非常扎实的覆盖。读完这本书后,如果你需要,你将准备好直接处理研究论文以获得更多深度。

我必须承认,我非常喜欢Niklaus Wirth的编译器构造。 It is可在线 as a PDF。我发现Wirth的编程美学简直太美了,但是有些人觉得他的风格太小了(例如Wirth喜欢递归下降解析器,但大多数CS课程都专注于解析器生成器工具;Wirth的语言设计相当保守。)编译器构造是Wirth基本思想的一个非常简洁的提炼,所以不管你是否喜欢他的风格,我强烈推荐阅读这本书。

Python与用Python编写的python编译器捆绑在一起。您可以看到源代码,它包括所有阶段,从解析、抽象语法树、发出代码等。 点击这里

John Levine写的一本书《"接头和装载机"》虽然还没有推荐,但非常重要。如果你不使用外部汇编器,你需要一种方法来输出一个可以链接到最终程序中的目标文件。即使你使用的是外部汇编器,你也可能需要了解重定位以及整个程序加载过程是如何工作的,才能制作一个工作工具。这本书收集了许多关于各种系统的这个过程的随机知识,包括Win32和Linux。

创建编译器的一个简单方法是使用bison和flex(或类似的),构建树(AST)并在C中生成代码。生成C代码是最重要的一步。通过生成C代码,你的语言将自动工作在所有具有C编译器的平台上。

生成C代码与生成超文本标记语言(只需使用print或等效语言)一样简单,这反过来比编写C解析器或超文本标记语言解析器要容易得多。

如果您愿意使用LLVM,请查看:http://llvm.org/docs/tutorial/。它教您如何使用LLVM的框架从头开始编写编译器,并且不假设您对该主题有任何了解。

本教程建议您编写自己的解析器和词法分析器等,但我建议您在获得想法后再研究bison和flex。它们让生活变得更加轻松。

首先,最好创建一个递归下降解析器(RDP)(假设您想创建自己的BASIC风格并构建一个BASIC解释器)来了解如何编写编译器。 我在赫伯特·希尔德的《C超级用户》第7章中找到了最好的信息。这一章引用了H.希尔德的另一本书《C完整参考》,他在书中解释了如何创建计算器(一个简单的表达式解析器)。我在eBay上发现这两本书都很便宜。 如果您转到www.osborne.com或签入www.HerbSchildt.com,您可以检查本书的代码 我在他的新书中找到了相同的代码,但对于C#

“……让我们构建一个编译器……”

我第二个http://compilers.iecc.com/crenshaw/@陈志立。暂时忘记买更多的书。

为什么?工具和语言。

所需的语言是Pascal,如果我没记错的话是基于Turbo-Pascal的。如果您转到http://www.freepascal.org/并下载Pascal编译器,所有示例都可以直接从页面工作〜http://www.freepascal.org/download.var Free Pascal的优点是您几乎可以使用任何您可以关心的处理器或操作系统。

一旦你掌握了课程,然后尝试更高级的"龙书"~http://en.wikipedia.org/wiki/Dragon_book

我也喜欢Crenshaw教程,因为它非常清楚地表明编译器只是另一个读取一些输入并写入一些输出的程序。

读一读。

如果您愿意,可以使用它,但是请查看另一个关于如何真正编写更大和更完整的编译器的参考。

阅读论信任,了解在这个领域可以做的不明显的事情。

Fraser和Hanson的LCC编译器(wikipedia)(项目主页)(github.com/drh/lcc)在他们的书“可重定向C编译器:设计和实现”中进行了描述。它非常具有可读性,并解释了整个编译器,一直到代码生成。

这里有很多很好的答案,所以我想我只是在列表中添加一个:

十多年前,我得到了一本名为Project Oberon的书,其中有一些关于编译器的很好的文字。这本书在源代码和解释非常实用和可读性方面非常突出。完整的文本(2005年版)已经以pdf格式提供,所以你现在可以下载。编译器在第12章中讨论:

http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf

尼克劳斯·沃思

(这种处理不像他关于编译器的书那样广泛)

我读过几本关于编译器的书,我可以第二次龙书,花在这本书上的时间是非常值得的。

如果您有兴趣为函数式语言(而不是过程式语言)编写编译器,Simon Peyton-Jones和David Lester的“实现函数式语言:教程”是一个很好的指南。

函数式评估如何工作的概念基础由一种名为“Core”的简单但功能强大的函数式语言中的示例指导。此外,Core语言编译器的每个部分都使用Miranda(一种与Haskell非常相似的纯函数式语言)中的代码示例进行解释。

描述了几种不同类型的编译器,但即使您只遵循所谓的Core模板编译器,您也将对函数式编程的原因有很好的理解。

龙书太复杂了。所以忽略它作为一个起点。一旦你已经有了一个起点,它会让你思考很多,但是对于初学者来说,也许你应该简单地尝试使用RD、LL或LR解析技术编写一个数学/逻辑表达式评估器,使用也许是C/Java手写的所有东西(词法分析/解析)。这本身很有趣,并让你了解编译器中涉及的问题。然后你可以使用一些脚本语言跳转到自己的DSL(因为处理文本通常更容易),并像有人说的那样,用脚本语言本身或C生成代码。如果您要在c/java中执行,您可能应该使用flex/bison/antlr等来执行词法分析/解析。

你应该去看看达里乌斯·培根的“ichbins”,这是一个针对C语言的小型Lisp方言的编译器,只用了6页多的代码。它比大多数玩具编译器的优势在于语言足够完整,编译器是用它编写的。(tarball还包括一个解释器来引导这个东西。)

还有更多关于我在学习在我的ur-plan网页上编写编译器时发现有用的东西。

我正在研究同样的概念,并发现了Joel Pobar的这篇充满希望的文章,

为. NET Framework创建语言编译器-不确定它去了哪里

为. NET Framework创建语言编译器-原始文档的pdf副本

他讨论了编译器的高级概念,并继续为. Net框架发明自己的语言。虽然它的目标是. Net框架,但许多概念应该能够被复制。文章包括:

  1. Langauge定义
  2. 扫描仪
  3. 解析器(我主要感兴趣的部分)
  4. 针对. Net框架
  5. 代码生成器

还有其他话题,但你得到了公正。

它的目标是开始的人,用C#编写(不太Java)

HTH

骨头

如果你像我一样,没有受过正规的计算机科学教育,并且对 构建/想知道编译器是如何工作的:

我推荐“Java中的编程语言处理器:编译器和解释器”, 对于自学成才的计算机程序员来说,这是一本很棒的书。

在我看来,理解那些基础语言理论、自动化机器、集合论都不是大问题。问题是如何把那些东西变成代码。上面这本书告诉了你如何编写解析器、分析上下文、生成代码。如果你看不懂这本书,那么我不得不说,放弃构建编译器吧。这本书是我读过的最好的编程书籍。

还有一本书,也很好,C语言中的编译器设计。有很多代码,它告诉你如何构建编译器和词法分析器工具的一切。

构建编译器是一种有趣的编程实践,可以教你大量的编程技能。

不要购买龙书。这是浪费金钱和时间,不适合从业者。

对不起,这是西班牙语的,但这是阿根廷一门名为“Compiladore e Intérpretes”(编译器和口译员)的课程的参考书目。

课程从形式语言理论到编译器构造,这些是你需要构建的主题,至少,一个简单的编译器:

  • C.编译器设计
    Allen I. Holub

    普伦蒂斯-霍尔。1990年。

  • 编译器。Teoría和Construcción。
    桑奇 Llorca, F. J., Galán Pascual, C.编辑Paraninfo.1988年。

  • 编译器结构。
    Niklaus Wirth

    艾迪生-韦斯利。1996年。

  • 《宪法》、《语法》和《自治法》,不适用于实际工作。
    佩德罗 帕洛玛·马丁内斯 Fernández, Daniel Borrajo Milán. Addison-Wesley伊比利亚美洲 (西班牙)。1997年。

  • 编译器设计的艺术。理论与实践。
    托马斯 詹姆斯·彼得斯·皮特曼。

    Prentice-Hall,1992年。

  • 面向对象的编译器构造。
    JimHolmes。
    普伦蒂斯·霍尔,恩格尔伍德 1995年新泽西州克利夫斯

  • 编纂者。基本概念。
    B. Teufel,S. T. Teufel.

    艾迪生-韦斯利伊比利亚美洲。1995年。

  • 自动机理论、语言和计算简介。

    John E. Hopcroft Jeffref D. Ullman
    艾迪生-韦斯利。1979年。

  • 正式语言简介。
    György E. Révész。

    麦克·格劳·希尔,1983年。

  • 解析技巧,实用指南
    Jacobs.
    印象 autores.1995
    http://www.cs.vu.nl/~dick/PTAPG.html

  • Yacc:又一个编译器-编译器。
    斯蒂芬 C. Johnson
    计算机科学 1975年第32号技术报告,贝尔 实验室。默里山,新
    新泽西州。

  • Lex:词法分析器生成器。
    M. E. Lesk,E. Schmidt。计算科学技术 贝尔实验室1975年第39号报告。 新泽西州默里山。

  • lex&yacc。
    约翰·R·莱文,托尼·梅森,道格·布朗。
    O'Reilly&Associates,1995年。

  • 计算理论的元素。
    Harry R. Lewis, Christos H. Papadimitriou Segunda Edición。普伦蒂斯·霍尔。1998年。

  • 控制依赖结构的有效构建。
    萨尔瓦多诉卡瓦迪尼。

    在计算中为工程师提供最后的培训。 应用数学学院。 U. C. S. E.2001。

  1. 这是一个广阔的话题。不要低估这一点。不要低估我的观点,不要低估它。
  2. 我听说龙书是一个(?)开始的地方,以及搜索。:)更好地搜索,最终它将成为你的生活。
  3. 构建自己的编程语言绝对是一项很好的练习!但要知道它最终永远不会用于任何实际目的。这方面的例外很少,非常也很少见。

你可能想研究一下Lex/Yacc(或Flex/Bison,无论你想怎么称呼它们)。Flex是一个词法分析器,它将解析和识别语言的语义组件(“令牌”),Bison将用于定义解析每个令牌时发生的事情。这可以是,但绝对不限于,打印C代码,用于将编译为C的编译器,或动态运行指令。

此FAQ应该对你有帮助,本教程看起来很有用。

我认为这是一个相当模糊的问题;只是因为涉及的主题很深入。然而,编译器可以被分解成两个独立的部分;上半部分和下半部分。上半部分通常采用源语言并将其转换为中间表示,下半部分负责特定于平台的代码生成。

尽管如此,一个简单的方法来处理这个主题(至少我们在编译器类中使用的方法)的想法是在上面描述的两个部分中构建编译器。具体来说,通过构建上半部分,您将对整个过程有一个很好的了解。

只做上半部分可以让你获得编写词法分析器和解析器的经验,并去生成一些“代码”(我提到的中间表示)。因此,它将获取你的源程序并将其转换为另一种表示并做一些优化(如果你愿意),这是编译器的核心。然后,下半部分将获取中间表示并生成在特定架构上运行程序所需的字节。例如,下半部分将获取你的中间表示并生成PE可执行文件。

我发现一些关于这个主题的书特别有帮助的是编译器原理和技术(或者龙书,因为封面上有一条可爱的龙)。它有一些很棒的理论,肯定以一种非常容易理解的方式涵盖了上下文无关语法。此外,为了构建词法分析器和解析器,你可能会使用*nix工具lex和yacc。有趣的是,名为“lex和yacc”的书继承了龙书在这一部分留下的地方。

我很惊讶它没有被提及,但Donald Knuth的计算机编程的艺术最初是作为一种编译器编写教程编写的。

当然,高德纳博士倾向于深入研究主题,这导致编译器编写教程被扩展到大约9卷,其中只有三卷实际上已经出版。这是对编程主题的相当完整的阐述,涵盖了你需要了解的关于编写编译器的一切,非常详细。

每当我想尝试一种新的语言理念时,我只需编写一个简单的解析器,并让它生成一些易于获得良好编译器的语言,例如C。

你觉得C++是怎么完成的?

一般来说,编译器没有五分钟的教程,因为这是一个复杂的主题,编写编译器可能需要几个月的时间。你必须自己搜索。

Python和Ruby通常是解释的。也许您也想从解释器开始。它通常更容易。

第一步是编写一个正式的语言描述,也就是你的编程语言的语法。然后你必须将你想要根据语法编译或解释的源代码转换成一个抽象的语法树,这是源代码的一种内部形式,计算机可以理解并可以对其进行操作。这一步通常被称为解析,解析源代码的软件称为解析器。解析器通常是由解析器生成器生成的,该生成器将正式语法转换为源代码或机器代码。对于解析的一个好的、非数学的解释,我推荐解析技术-实用指南。维基百科对解析器生成器进行了比较,您可以从中选择适合您的解析器生成器。根据您选择的解析器生成器,您可以在Internet上找到教程,对于真正流行的解析器生成器(如GNU bison),也有书籍。

为您的语言编写解析器可能真的很难,但这取决于您的语法。所以我建议保持语法简单(不像C++);这方面的一个很好的例子是LISP。

在第二步中,抽象语法树从树结构转换为线性中间表示。作为Lua字节码的一个很好的例子经常被引用。但中间表示实际上取决于您的语言。

如果你正在构建一个解释器,你只需要解释中间表示。你也可以即时编译它。我推荐LLVM和libjit进行即时编译。为了使语言可用,你还必须包含一些输入和输出函数,也许还有一个小型标准库。

如果您要编译该语言,它将更加复杂。您必须为不同的计算机体系结构编写后端,并从这些后端的中间表示生成机器代码。我推荐LLVM完成此任务。

有几本关于这个主题的书,但我可以推荐它们中没有一本适合一般使用。它们中的大多数都太学术或太实用了。没有“在21天内自学编译器写作”,因此,你必须购买几本书才能很好地理解整个主题。如果你在互联网上搜索,你会遇到一些在线书籍和讲义。也许你附近有一所大学的图书馆,你可以在那里借到关于编译器的书。

我还建议你在理论计算机科学和图形理论方面有良好的背景知识,如果你想认真对待你的项目。计算机科学学位也会有所帮助。

我记得大约七年前,当我对编程还很陌生的时候,我问过这个问题。

当我问的时候,我非常小心,令人惊讶的是,我没有得到像你在这里得到的那么多批评。然而,他们确实给我指出了《龙书》的方向,在我看来,这是一本非常棒的书,解释了编写编译器所需知道的一切(你当然必须掌握一两种语言。你知道的语言越多,越快乐。)。

是的,很多人说读那本书很疯狂,你不会从中学到任何东西,但我完全不同意这一点。

许多人还说编写编译器是愚蠢和毫无意义的。好吧,编译器开发有用的原因有很多:

  • 因为它很有趣。
  • 这是有教育意义的,在学习如何编写编译器时,您将学到很多关于计算机科学和其他技术的知识,这些技术在编写其他应用程序时很有用。
  • 如果没有人编写编译器,现有的语言就不会变得更好。

我没有立即编写自己的编译器,但在询问之后,我知道从哪里开始。现在,在学习了许多不同的语言并阅读了龙书之后,写作不是什么大问题。(我也在学习计算机工程atm,但我所知道的大部分编程知识都是自学的。)

总而言之,《龙书》是一个很棒的“教程”。但在尝试编写编译器之前,请花一些时间掌握一两种语言。不过,不要指望在未来十年左右成为编译器大师。

如果你想学习如何编写解析器/解释器,这本书也很好。

不是一本书,而是一篇技术论文和一个非常有趣的学习体验,如果你想了解更多关于编译器(和元编译器)……这个网站引导你构建一个完全独立的编译器系统,可以编译自己和其他语言:

教程:元计算程序第1部分

这一切都基于一篇令人惊叹的10页技术论文:

ValSchorreMETA II:一种面向语法的编译器编写语言

从1964年开始。早在1970年,我就学会了如何从中构建编译器。当你最终了解编译器如何再生自己时,会有一个令人兴奋的时刻……

我从大学时代就认识网站作者,但我和网站没有任何关系。

comp.compilersFAQ

《个人电脑编程》作者:佩尔·布林奇·汉森 Prentice-Hall 1982 ISBN 0-13-730283-5

这本标题不幸的书 解释单用户编程环境的设计和创建 对于微型计算机,使用一种名为Edison的类Pascal语言。作者介绍 逐步实现的所有源代码和解释 爱迪生编译器和简单的支持操作系统,全部用 爱迪生本身(除了一个用符号编写的小型支持内核) PDP 11/23的汇编器;完整的源代码也可以订购IBM PC)。

这本书最有趣的地方是:1)它能够 演示如何创建一个完整的,独立的,自我维护的, 有用的编译器和操作系统,以及2)有趣的讨论 第2章中的语言设计和规范问题和权衡。

“BrincchHansen on Pascal编译器”作者:Per BrincchHansen Prentice-Hall 1985 ISBN 0-13-083098-4

另一种光理论 这是一本关于如何编码的书。作者介绍了 编译器和p代码的设计、实现和完整源代码 Pascal-(Pascal“减号”)的解释器,一个具有布尔值和 整数类型(但没有字符、实数、子范围或枚举类型), 常量和变量定义以及数组和记录类型(但没有打包, 变量、集合、指针、无名、重命名或文件类型)、表达式、 赋值语句、带有值和变量的嵌套过程定义 参数、if语句、if语句和开始-结束块(但没有 函数定义、过程参数、goto语句和标签, case语句、重复语句、for语句和with语句)。

编译器和解释器是用Pascal*(Pascal“star”)编写的 Pascal子集扩展了一些爱迪生风格的功能,用于创建 软件开发系统。用于IBMPC的Pascal*编译器由 作者,但很容易将本书的Pascal-编译器移植到任何 方便的Pascal平台。

本书使编译器的设计和实现看起来很容易。我 特别是像作者关注质量的方式, 可靠性和测试。编译器和解释器可以很容易地使用 作为更复杂的语言或编译器项目的基础,尤其是 如果你被要求快速启动并运行某些东西。

列表中缺少:垃圾收集:自动动态内存管理算法,Jones和Lins。

(假设您正在编写编译器运行时系统,并且您正在实现垃圾收集语言。

我发现《龙》这本书读起来太难了,因为它过于关注语言理论,而实际上编写编译器并不需要这些理论。

我会添加奥伯龙这本书,其中包含一个非常快速和简单的Oberon编译器Project Oberon的完整源代码。

替换文本

如果你没有时间,我推荐Niklaus Wirth的“编译器构造”(Addison-Wesley.1996),这是一本小册子,你可以在一天内阅读,但它解释了基础知识(包括如何实现词法分析器、递归下降解析器和你自己的基于堆栈的虚拟机)。之后,如果你想深入了解,就没有其他评论者建议的龙书了。

最快的方法是通过两本书:

JP Bennett 1990年版编译技术简介,使用ANSI C、LeX和YaCC的第一门课程——示例代码、解析理论和设计的完美平衡——它包含一个用C、lex和yacc编写的完整编译器,用于简单的语法

龙书(旧版本)-主要是前一本书中未涵盖的功能的详细参考

您可以使用Apache软件基金会的BCEL。使用此工具,您可以生成类似汇编程序的代码,但它与BCEL APIJava。您可以了解如何生成中间语言代码(在本例中为字节代码)。

简单的例子

  1. 用这个函数创建一个Java类:

    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";
    }
    }
    

Now run BCELifier with this class

BCELifier bcelifier = new BCELifier("MyClass", System.out);
bcelifier.start();

你可以在控制台上看到整个类的结果(如何构建字节代码MyClass.java)。该函数的代码如下:

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();
}

到目前为止,这本书不包括在列表中:

编译器设计基础(Torben Mogensen) (来自哥本哈根大学计算机科学系)

我也对学习编译器很感兴趣,并计划在未来几年进入这个行业。据我所知,这本书是开始学习编译器的理想理论书。它可以免费复制和复制,写得干净仔细,用简单的英语给你,没有任何代码,但仍然通过说明和图表等方式介绍机制。值得一看。

如果你不仅仅是在寻找书籍,而且还对有关于这个主题的文章的网站感兴趣,我已经写了关于创建编程语言的各个方面的博客。大多数帖子都可以在我的博客「语言设计」类别中找到。

特别是,我涵盖了手动生成英特尔机器代码、自动生成机器或字节码、创建字节码解释器、编写面向对象的运行时、创建简单的加载程序以及编写简单的标记/扫描垃圾收集器。所有这些都以非常实用和务实的方式进行,而不是用大量的理论来无聊你。

我希望得到关于这些的反馈。