首选语言:C/C++、Java 和 Ruby。
我正在寻找一些有用的书籍/教程,介绍如何仅为教育目的编写自己的编译器。我最熟悉 C/C++、Java 和 Ruby,因此我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的。
首选语言:C/C++、Java 和 Ruby。
我正在寻找一些有用的书籍/教程,介绍如何仅为教育目的编写自己的编译器。我最熟悉 C/C++、Java 和 Ruby,因此我更喜欢涉及这三者之一的资源,但任何好的资源都是可以接受的。
传奇:
我认为这是一个非常模糊的问题;只是因为所涉话题的深度。但是,编译器可以分解为两个独立的部分;上半部分和下半部分。上半部分通常采用源语言并将其转换为中间表示,而下半部分负责特定于平台的代码生成。
尽管如此,一个解决这个主题的简单方法(至少我们在我的编译器类中使用的方法)的一个想法是在上面描述的两个部分中构建编译器。具体来说,只需构建上半部分,您就可以很好地了解整个过程。
只做上半部分就可以让您获得编写词法分析器和解析器的经验,并生成一些“代码”(我提到的中间表示)。因此,它将获取您的源程序并将其转换为另一种表示形式并进行一些优化(如果您愿意),这是编译器的核心。然后下半部分将采用该中间表示并生成在特定架构上运行程序所需的字节。例如,下半部分将采用您的中间表示并生成一个 PE 可执行文件。
我发现一些关于这个主题特别有用的书是编译器原理和技术(或龙书,因为封面上有可爱的龙)。它有一些很棒的理论,并且绝对以一种非常容易理解的方式涵盖了上下文无关语法。此外,为了构建词法分析器和解析器,您可能会使用 *nix 工具 lex 和 yacc。有趣的是,名为“ lex and yacc ”的书在这部分的龙书停止的地方接续了。
我认为ML 中的现代编译器实现是最好的介绍性编译器编写文本。还有一个Java 版本和一个C 版本,考虑到您的语言背景,这两个版本都可能更容易访问。本书包含大量有用的基础材料(扫描和解析、语义分析、激活记录、指令选择、RISC 和 x86 原生代码生成)和各种“高级”主题(编译 OO 和函数式语言、多态性、垃圾收集、优化和单个静态分配表格)到相对较小的空间(约 500 页)。
我更喜欢现代编译器实现而不是龙书,因为现代编译器实现调查的领域较少——相反,它确实涵盖了编写一个严肃、体面的编译器所需的所有主题。读完本书后,如果需要,您将准备好直接处理研究论文以获得更深入的了解。
我必须承认,我对 Niklaus Wirth 的Compiler Construction情有独钟。它以 PDF 格式在线提供。我发现 Wirth 的编程美学很漂亮,但是有些人觉得他的风格太少了(例如,Wirth 偏爱递归下降解析器,但大多数 CS 课程侧重于解析器生成器工具;Wirth 的语言设计相当保守。)编译器构建是一个非常简洁的提炼Wirth 的基本思想,不管你喜不喜欢他的风格,我都强烈推荐阅读这本书。
我同意龙书参考;IMO,它是编译器构造的权威指南。不过,为一些核心理论做好准备。
如果您想要一本理论较轻的书,Game Scripting Mastery可能更适合您。如果您是编译器理论的新手,它会提供更温和的介绍。它没有涵盖更实用的解析方法(选择非预测递归下降而不讨论 LL 或 LR 解析),而且我记得,它甚至没有讨论任何类型的优化理论。另外,它不是编译成机器代码,而是编译成一个字节码,该字节码应该在你也编写的 VM 上运行。
它仍然是一本不错的读物,尤其是如果您可以在亚马逊上以便宜的价格买到它。如果您只想简单介绍一下编译器,Game Scripting Mastery 是不错的选择。如果你想在前面硬核,那么你应该满足于龙书。
“让我们构建一个编译器”很棒,但它有点过时了。(我并不是说它会降低它的有效性。)
或查看俚语。这类似于“让我们构建一个编译器”,但它是一个更好的资源,尤其是对于初学者来说。这附带一个 pdf 教程,它采用 7 步方法教您编译器。添加 quora 链接,因为它具有 C++、Java 和 JS 中 SLANG 的所有各种端口的链接,还有 python 和 java 中的解释器,最初是使用 C# 和 .NET 平台编写的。
如果您希望使用功能强大、更高级别的工具,而不是自己构建所有东西,那么阅读本课程的项目和阅读材料是一个不错的选择。这是 Java 解析器引擎 ANTLR 的作者的一门语言课程。您可以从Pragmatic Programmers获得 PDF 格式的课程书籍。
本课程介绍了您在其他地方看到的标准编译器编译器内容:解析、类型和类型检查、多态性、符号表和代码生成。几乎唯一没有涉及的是优化。最终项目是一个编译 C 子集的程序。因为您使用 ANTLR 和 LLVM 之类的工具,所以在一天内编写整个编译器是可行的(我有一个存在证明,尽管我的意思是大约 24 小时)。它在使用现代工具的实际工程方面很重,在理论上稍微轻松一些。
顺便说一句,LLVM 简直太棒了。在很多情况下,您通常可以编译为汇编,最好编译为LLVM 的中间表示。它更高级别,跨平台,LLVM 非常擅长从中生成优化的程序集。
如果你时间不多,我推荐Niklaus Wirth 的“编译器构造”(Addison-Wesley. 1996),这是一本你可以在一天内阅读的小册子,但它解释了基础知识(包括如何实现词法分析器、递归下降解析器、和您自己的基于堆栈的虚拟机)。在那之后,如果你想深入了解,就像其他评论者所建议的那样,没有办法绕过《龙》一书。
一般来说,编译器没有五分钟的教程,因为这是一个复杂的话题,编写编译器可能需要几个月的时间。您将不得不自己进行搜索。
通常解释 Python 和 Ruby。也许您也想从口译员开始。它通常更容易。
第一步是编写正式的语言描述,即您的编程语言的语法。然后你必须将你想要根据语法编译或解释的源代码转换为抽象语法树,这是计算机理解并可以操作的源代码的内部形式。这一步通常称为解析,解析源代码的软件称为解析器。解析器通常由解析器生成器生成,该解析器生成器将形式文法转换为源代码或机器代码。对于解析的一个好的、非数学的解释,我推荐 Parsing Techniques - A Practical Guide。Wikipedia 对解析器生成器进行了比较,您可以从中选择适合您的解析器生成器。根据您选择的解析器生成器,
为您的语言编写解析器可能非常困难,但这取决于您的语法。所以我建议保持你的语法简单(不像 C++);LISP 就是一个很好的例子。
在第二步中,抽象语法树从树结构转换为线性中间表示。经常引用 Lua 的字节码作为一个很好的例子。但是中间表示实际上取决于您的语言。
如果您正在构建解释器,则只需解释中间表示。您也可以即时编译它。我推荐 LLVM 和 libjit 用于即时编译。为了使该语言可用,您还必须包含一些输入和输出函数,也许还有一个小型标准库。
如果你要编译语言,它会更复杂。您将不得不为不同的计算机架构编写后端,并从这些后端中的中间表示生成机器代码。我推荐 LLVM 来完成这项任务。
关于这个主题有几本书,但我不能推荐任何一本用于一般用途。他们中的大多数都过于学术或过于实际。没有“在 21 天内自学编译器写作”,因此,您必须购买几本书才能很好地理解整个主题。如果你在互联网上搜索,你会看到一些在线书籍和讲义。也许您附近有一个大学图书馆,您可以在其中借阅有关编译器的书籍。
如果您打算认真对待您的项目,我还建议您具备理论计算机科学和图论方面的良好背景知识。计算机科学学位也会有所帮助。
看看下面的书。作者是ANTLR的创建者。
一本尚未推荐但非常重要的书是John Levine 的“Linkers and Loaders”。如果您不使用外部汇编程序,则需要一种方法来输出可以链接到最终程序中的目标文件。即使您使用的是外部汇编程序,您也可能需要了解重定位以及整个程序加载过程是如何工作的以制作一个工作工具。本书收集了大量关于这个过程的随机知识,适用于各种系统,包括 Win32 和 Linux。
Dragon Book绝对是一本“构建编译器”的书,但是如果您的语言不像当前一代语言那么复杂,您可能需要查看Design Patterns中的解释器模式。
书中的示例设计了一种类似正则表达式的语言,并且经过深思熟虑,但正如他们在书中所说,它有助于思考整个过程,但实际上只对小型语言有效。但是,使用这种模式为一种小型语言编写解释器要比学习所有不同类型的解析器、yacc 和 lex 等要快得多……
如果您愿意使用 LLVM,请查看: http: //llvm.org/docs/tutorial/。它教您如何使用 LLVM 的框架从头开始编写编译器,并且不假设您对该主题有任何了解。
本教程建议您编写自己的解析器和词法分析器等,但我建议您在了解后研究一下 bison 和 flex。他们让生活变得如此轻松。
Fraser 和 Hanson的 LCC 编译器(维基百科)(项目主页)(github.com/drh/lcc)在他们的书“A Retargetable C Compiler: Design and Implementation”中有描述。它非常易读,并解释了整个编译器,直至代码生成。
我发现 Dragon 的书太难读了,因为过于关注语言理论,而在实践中编写编译器并不真正需要。
我会添加Oberon书,其中包含一个非常快速和简单的 Oberon 编译器Project Oberon的完整源代码。
我正在研究同样的概念,并发现了 Joel Pobar 的这篇很有前途的文章,
为 .NET Framework 创建一个语言编译器 - 不确定它去了哪里
为 .NET Framework 创建语言编译器 - 原始文档的 pdf 副本
他讨论了编译器的高级概念,并着手为 .Net 框架发明了自己的语言。虽然它是针对 .Net 框架的,但许多概念应该能够被复制。文章涵盖:
还有其他主题,但你得到了公正。
它面向初学者,用 C#(不是 Java)编写
高温高压
骨头
我记得大约七年前我对编程还很陌生时问过这个问题。
当我问起时,我非常小心,令人惊讶的是,我并没有像你来到这里那样受到批评。然而,他们确实为我指明了“龙之书”的方向,在我看来,这是一本非常棒的书,它解释了编写编译器所需的一切(你当然必须掌握一两种语言。更多你知道的语言越多越好。)。
是的,很多人说读那本书很疯狂,你不会从中学到任何东西,但我完全不同意这一点。
很多人还说编写编译器是愚蠢和毫无意义的。好吧,编译器开发有用的原因有很多:
我没有立即编写自己的编译器,但在询问后我知道从哪里开始。而现在,学习了很多不同的语言,读了龙书之后,写作已经不是什么大问题了。(我也在学习计算机工程atm,但我对编程的大部分了解都是自学的。)
总之,《龙书》是一本很棒的“教程”。但是在尝试编写编译器之前,请花一些时间掌握一两种语言。不要期望在未来十年左右成为编译器大师。
如果您想学习如何编写解析器/解释器,这本书也很好。
“......让我们构建一个编译器......”
我第二个http://compilers.iecc.com/crenshaw/ @sasb 。暂时忘记购买更多书籍。
为什么?工具和语言。
所需的语言是 Pascal,如果我没记错的话是基于 Turbo-Pascal。如果您访问http://www.freepascal.org/并下载 Pascal 编译器,就会发生这种情况,所有示例都可以直接从页面工作 ~ http://www.freepascal.org/download.var关于免费的美妙之处Pascal 是您几乎可以使用任何您关心的处理器或操作系统。
一旦你掌握了课程,然后尝试更高级的“龙书” ~ http://en.wikipedia.org/wiki/Dragon_book
创建编译器的一种简单方法是使用 bison 和 flex(或类似),构建树(AST)并在 C 中生成代码。生成 C 代码是最重要的步骤。通过生成 C 代码,您的语言将自动在所有具有 C 编译器的平台上运行。
生成 C 代码就像生成 HTML 一样简单(只需使用 print 或等效的),而这又比编写 C 解析器或 HTML 解析器容易得多。
您应该查看 Darius Bacon 的“ ichbins ”,它是针对 C 的小型 Lisp 方言的编译器,代码只有 6 页多。与大多数玩具编译器相比,它的优势在于该语言足够完整,编译器是用它编写的。(tarball 还包括一个解释器来引导这个东西。)
在我的Ur-Scheme网页上,我发现了更多关于学习编写编译器的有用信息。
Per Brinch Hansen Prentice-Hall 的“个人计算机编程”,1982 年 ISBN 0-13-730283-5
这本不幸的书名解释了使用名为 Edison 的类似 Pascal 的语言为 micros 设计和创建单用户编程环境。作者提供了 Edison 编译器和简单支持操作系统的逐步实现的所有源代码和解释,所有这些都是用 Edison 本身编写的(用 PDP 11/23 的符号汇编器编写的小型支持内核除外;也可以为 IBM PC 订购完整的源代码)。
这本书最有趣的地方是:1)它展示了如何创建一个完整的、自包含的、自维护的、有用的编译器和操作系统的能力,以及 2)关于语言设计和规范问题以及交易的有趣讨论。第 2 章中的关卡。
Per Brinch Hansen Prentice-Hall 的“Brinch Hansen 谈 Pascal 编译器”,1985 年 ISBN 0-13-083098-4
这是另一本轻理论重语用学的书,这是一本如何编码的书。作者介绍了 Pascal- (Pascal "minus") 的编译器和 p 代码解释器的设计、实现和完整源代码,Pascal 子集具有布尔和整数类型(但没有字符、实数、子范围或枚举类型) 、常量和变量定义以及数组和记录类型(但没有压缩、变体、集合、指针、无名、重命名或文件类型)、表达式、赋值语句、带有值和变量参数的嵌套过程定义、if 语句、while 语句、和开始-结束块(但没有函数定义、过程参数、goto 语句和标签、case 语句、repeat 语句、for 语句和 with 语句)。
编译器和解释器是用 Pascal*(Pascal “star”)编写的,Pascal 子集扩展了一些用于创建软件开发系统的 Edison 风格的特性。作者出售了用于 IBM PC 的 Pascal* 编译器,但很容易将本书的 Pascal 编译器移植到任何方便的 Pascal 平台。
这本书使编译器的设计和实现看起来很容易。我特别喜欢作者关注质量、可靠性和测试的方式。编译器和解释器可以很容易地用作更复杂的语言或编译器项目的基础,尤其是当您被迫快速启动和运行某些东西时。
Python 捆绑了一个用 Python 编写的 Python 编译器。您可以看到源代码,它包括所有阶段,从解析、抽象语法树、发出代码等。Hack 它。
抱歉,它是西班牙语的,但这是阿根廷一门名为“Compiladores e Intérpretes”(编译器和口译员)的课程的参考书目。
该课程从形式语言理论到编译器构建,这些是您至少需要构建一个简单编译器的主题:
C. Allen I. Holub
Prentice-Hall 的编译器设计。1990 年。编译器。Teoría y Consrucción。
Sanchís Llorca, FJ, Galán Pascual, C. 编辑 Paraninfo。1988 年。编译器构造。
尼克劳斯·沃思艾迪
生-卫斯理。1996 年。Lenguajes,Gramáticas y Automatas。Un enfoque practico。
佩德罗·伊萨西·维努埃拉、帕洛玛·马丁内斯·费尔南德斯、丹尼尔·博拉霍·米兰。Addison-Wesley Iberoamericana(西班牙)。1997 年。编译器设计的艺术。理论与实践。
托马斯·皮特曼,詹姆斯·彼得斯。
普伦蒂斯霍尔。1992 年。面向对象的编译器构造。
吉姆·福尔摩斯。
Prentice Hall,恩格尔伍德悬崖,新泽西州 1995编译器。概念基础。
B. Teufel、S. Schmidt、T. Teufel。
艾迪生-韦斯利伊比利亚美洲。1995 年。自动机理论、语言和计算简介。
约翰·E·霍普克罗夫特。Jeffref D. Ullman。
艾迪生-韦斯利。1979 年。正式语言简介。
György E. Révész。
麦格劳希尔。1983 年。解析技术。实用指南。
迪克·格鲁内,塞瑞尔·雅各布斯。
Impreso por los autores。1995
http://www.cs.vu.nl/~dick/PTAPG.htmlYacc:又一个编译器-编译器。
Stephen C. Johnson
计算科学技术报告第 32 号,1975 年。贝尔实验室。新泽西州默里山
。Lex:词法分析器生成器。
我莱斯克,E.施密特。计算科学技术报告第 39 号,1975 年。贝尔实验室。新泽西州默里山。莱克斯和 yacc。
约翰·R·莱文、托尼·梅森、道格·布朗。
O'Reilly & Associates。1995 年。计算理论的要素。
Harry R. Lewis,Christos H. Papadimitriou。西贡达埃迪西翁。普伦蒂斯霍尔。1998 年。Un Algoritmo Eficiente para la Construcción del Grafo de Dependencia de Control。
萨尔瓦多诉卡瓦迪尼。
Trabajo Final de Grado para obtener el Título de Ingeniero en Computación。
Facultad de Matemática Aplicada。UCSE 2001。
这里有很多很好的答案,所以我想我应该在列表中再添加一个:
十多年前,我有一本名为 Project Oberon 的书,其中有一些关于编译器的非常好的文字。这本书真的很突出,因为来源和解释非常实用和可读。全文(2005 年版)已以 pdf 格式提供,因此您可以立即下载。编译器在第 12 章中讨论:
http://www.ethoberon.ethz.ch/WirthPubl/ProjectOberon.pdf
尼克劳斯·沃特,于尔格·古特克内希特
(处理没有他关于编译器的书那么广泛)
读过几本编译器方面的书,可以秒龙书,花在这本书上的时间很值得。
如果您想了解更多关于编译器(和元编译器)的信息,这不是一本书,而是一篇技术论文和一次非常有趣的学习体验……这个网站将引导您构建一个完全独立的编译器系统,该系统可以编译自身和其他语言:
这一切都基于一篇令人惊叹的 10 页小技术论文:
Val Schorre META II:面向语法的编译器编写语言
从 1964 年的老实人开始。我在 1970 年就学会了如何构建编译器。当你终于了解编译器如何自我再生时,这是一个令人兴奋的时刻……
我从大学时代就认识网站作者,但我与该网站无关。
我也喜欢Crenshaw 教程,因为它清楚地表明编译器只是另一个读取一些输入并写入一些输出的程序。
阅读。
如果您愿意,可以使用它,然后查看另一个参考,了解如何真正编写更大、更完整的编译器。
并阅读On Trusting Trust,了解在这个领域可以做的不明显的事情。
如果您有兴趣为函数式语言(而不是过程式语言)编写编译器,Simon Peyton-Jones 和 David Lester 的“实现函数式语言:教程”是一个很好的指南。
功能评估如何工作的概念基础由称为“核心”的简单但功能强大的功能语言中的示例指导。此外,Core 语言编译器的每个部分都用 Miranda(一种与 Haskell 非常相似的纯函数式语言)中的代码示例进行了解释。
描述了几种不同类型的编译器,但即使你只遵循所谓的 Core 模板编译器,你也会对函数式编程的成功有很好的理解。
您可以使用Apache 软件基金会的BCEL。使用此工具,您可以生成类似汇编程序的代码,但它是带有 BCEL API 的 Java。您可以了解如何生成中间语言代码(在本例中为字节代码)。
使用此函数创建一个 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";
}
}
现在用这个类运行 BCELifier
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();
}
作为一个起点,最好创建一个递归下降解析器 (RDP)(假设您想创建自己的 BASIC 风格并构建一个 BASIC 解释器)以了解如何编写编译器。我在 Herbert Schild 的 C Power Users 第 7 章中找到了最好的信息。本章参考了 H. Schildt 的另一本书“C The complete Reference”,他解释了如何创建计算器(一个简单的表达式解析器)。我在 eBay 上发现这两本书都很便宜。如果您访问 www.osborne.com 或查看www.HerbSchildt.com,您可以查看本书的代码 我在他的最新书中找到了相同的代码,但 C# 代码
龙书太复杂了。所以忽略它作为起点。这很好,一旦你有了一个起点,你就会想很多,但对于初学者来说,也许你应该简单地尝试使用 RD、LL 或 LR 解析技术编写一个数学/逻辑表达式评估器,并编写所有内容(词法分析/解析)可能是 C/Java 中的手工。这本身很有趣,让您了解编译器中涉及的问题。然后你可以使用一些脚本语言跳到你自己的 DSL(因为在这些语言中处理文本通常更容易),就像有人说的那样,用脚本语言本身或 C 生成代码。你可能应该使用 flex/bison/antlr 等来如果要在 c/java 中进行词法分析/解析。
我很惊讶它没有被提及,但 Donald Knuth 的计算机编程艺术最初是作为编译器编写的一种教程而写的。
当然,Knuth 博士对主题进行深入研究的倾向导致编译器编写教程被扩展为大约 9 卷,其中只有三卷实际已出版。这是一个关于编程主题的相当完整的阐述,并且非常详细地涵盖了您在编写编译器时需要了解的所有内容。
列表中缺少:垃圾收集:自动动态内存管理算法,Jones 和 Lins。
(假设您正在编写编译器和运行时系统,并且您正在实现一种垃圾收集语言。
到目前为止,未列入清单的是这本书:
Basics of Compiler Design (Torben Mogensen) (来自哥本哈根大学计算机科学系)
我也有兴趣了解编译器,并计划在未来几年进入该行业。据我所知,这本书是开始学习编译器的理想理论书。它是免费的复制和复制,干净而仔细地编写并以简单的英语提供给您,无需任何代码,但仍然通过说明和图表等方式呈现机制。值得一看 imo。
最快的方法是通过两本书:
JP Bennett 的1990 年版本的编译技术简介,使用 ANSI C、LeX 和 YaCC 的第一门课程- 示例代码、解析理论和设计的完美平衡 - 它包含一个用 C、lex 和 yacc 编写的完整编译器简单语法
龙书(旧版) - 主要是对前一本书中未涵盖的功能的详细参考
如果您不只是在寻找书籍,而且对包含有关该主题的文章的网站感兴趣,我已经在博客中介绍了创建编程语言的各个方面。大多数帖子都可以在我的博客的“语言设计”类别中找到。
具体来说,我将介绍手动生成 Intel 机器代码、自动生成机器码或字节码、创建字节码解释器、编写面向对象的运行时、创建简单的加载器以及编写简单的标记/清除垃圾收集器。所有这一切都以一种非常实用和务实的方式进行,而不是让你用大量的理论感到厌烦。
希望对这些提供反馈。
如果你像我一样,没有受过正规的计算机科学教育,并且有兴趣构建/想知道编译器是如何工作的:
我推荐“Java 中的编程语言处理器:编译器和解释器”,这是一本适合自学成才的计算机程序员的精彩书籍。
在我看来,理解那些基本的语言理论、自动化机器和集合论并不是什么大问题。问题是如何将这些东西变成代码。上面的书告诉你如何编写解析器、分析上下文和生成代码。如果你看不懂这本书,那我不得不说,放弃编译编译器吧。这本书是我读过的最好的编程书。
还有另一本书也不错,Compiler Design in C。有很多代码,它告诉您有关如何构建编译器和词法分析器工具的一切。
构建编译器是一种有趣的编程实践,可以教会你大量的编程技能。
不买龙书。这是浪费金钱和时间,不适合从业者。
每当我想尝试一种新的语言想法时,我只需编写一个简单的解析器,并让它生成一些易于获得好的编译器的语言,比如 C。
你认为 C++ 是如何完成的?