![]() |
2
69
我认为,这是一个相当模糊的问题,仅仅是因为涉及到的主题的深度。然而,编译器可以分解为两个独立的部分:上半部分和下半部分。上半部分通常采用源语言并将其转换为中间表示,下半部分负责特定于平台的代码生成。 尽管如此,解决这个问题的一个简单方法(至少在我的编译器类中使用的方法)是在上面描述的两个部分中构建编译器。具体来说,通过构建上半部分,您将对整个过程有一个很好的了解。 只需做上半部分,就可以获得编写词汇分析器和解析器的经验,并开始生成一些“代码”(我提到的中间表示)。因此,它将获取源程序并将其转换为另一种表示形式,并进行一些优化(如果需要的话),这是编译器的核心。然后,下半部分将采用这种中间表示,并生成在特定体系结构上运行程序所需的字节。例如,下半部分将采用中间表示并生成一个PE可执行文件。 关于这个话题的一些书我觉得特别有用 Compilers Principles and Techniques (或龙书,因封面上有可爱的龙)。它有一些很好的理论,并且以一种非常容易理解的方式明确地涵盖了上下文无关语法。另外,为了构建词汇分析器和解析器,您可能会使用*nix工具lex和yacc。不经意间,这本书叫做 lex and yacc “在这一部分龙书留下的地方找到了。 |
![]() |
3
55
我想 Modern Compiler Implementation in ML 是编写文本的最好的入门级编译器。有一个 Java version 和A C version 而且,考虑到您的语言背景,这两种语言都可能更容易访问。本书将大量有用的基础材料(扫描和解析、语义分析、激活记录、指令选择、RISC和x86本机代码生成)和各种“高级”主题(编译OO和函数语言、多态性、垃圾收集、优化和单个静态分配表)打包到相对较少的空间中。(500页)。 我更喜欢现代编译器实现,而不是《龙书》,因为现代编译器实现调查的领域更少——相反,它确实覆盖了编写一个严肃、体面的编译器所需的所有主题。在你读完这本书之后,如果你需要的话,你将准备好直接处理研究论文。 我必须承认我对尼克劳斯·沃思有一个严重的弱点 Compiler Construction. 它是 available online 作为一个PDF。我觉得Wirth的编程美学很简单,但是有些人觉得他的风格太小(例如,Wirth喜欢递归下降解析器,但大多数CS课程都集中在解析器生成器工具上;Wirth的语言设计相当保守。)编译器构造是对Wirth基本思想的一种非常简洁的提炼,因此无论你是否喜欢他的风格,我强烈推荐你读这本书。 |
![]() |
4
46
我同意龙书的参考;在我看来,它是编译器构造的最终指南。不过,准备好一些核心理论。 如果你想要一本理论上比较轻松的书, Game Scripting Mastery 对你来说可能是一本更好的书。如果你是一个编译器理论的新手,它提供了一个更温和的介绍。它不包括更实用的解析方法(选择非预测递归下降而不讨论ll或lr解析),我记得,它甚至没有讨论任何类型的优化理论。另外,它不是编译成机器代码,而是编译成一个字节码,这个字节码应该在您也编写的VM上运行。 它仍然是一本不错的书,尤其是如果你能在亚马逊上便宜买到它。如果你只想简单地介绍编译器,那么掌握游戏脚本并不是一个糟糕的方法。如果你想成为硬核的前面,那么你应该满足于无非是龙书。 |
![]() |
5
28
"Let's Build a Compiler" 太棒了,但有点过时了。(我不是说这会使它的有效性降低一点。) 或退房 SLANG . 这类似于“让我们构建一个编译器”,但对于初学者来说,这是一个更好的资源。这是一个PDF教程,它采用7步的方法教你一个编译器。添加了QuoLink链接,因为它有链接到所有不同的俚语端口的链接,在C++、Java和JS中也是Python和Java的解释器,最初是使用C.Y.NET和.NET平台编写的。 |
![]() |
6
24
如果您希望使用功能强大的高级工具而不是构建 一切 你自己,浏览项目和阅读 this course 是个不错的选择。这是一个由Java分析器引擎ANTLR作者编写的语言课程。你可以从 the Pragmatic Programmers . 本课程将介绍您在其他地方看到的标准编译器编译器的内容:解析、类型和类型检查、多态性、符号表和代码生成。几乎唯一没有涉及的就是优化。最后一个项目是 compiles a subset of C . 因为您使用了诸如antlr和llvm之类的工具,所以在一天内编写整个编译器是可行的(我有一个存在证明,尽管我的意思是24小时)。它对使用现代工具的实际工程很重要,理论上稍微轻一点。 顺便说一句,LLVM简直太棒了。在许多情况下,您通常可以编译到程序集,而编译到 LLVM's Intermediate Representation 相反。它的层次更高,跨平台,LLVM非常擅长从中生成优化的装配。 |
![]() |
7
20
如果你时间不多,我建议你 Niklaus Wirth's "Compiler Construction" (Addison-Wesley. 1996) 一本小册子,你一天就能读完,但它解释了基本知识(包括如何实现lexer、递归下降解析器和你自己的基于堆栈的虚拟机)。在那之后,如果你想要一个深潜水,没有办法像其他评论者建议的那样围绕着龙书。 |
![]() |
8
17
你可能想看看lex/yacc(或者flex/bison,随便你怎么称呼它们)。flex是一个词法分析器,它将解析和识别您语言的语义组件(“tokens”),bison将用于定义解析每个token时会发生什么。对于编译为C或动态运行指令的编译器来说,这可能是(但绝对不限于)打印出C代码。 This FAQ 应该帮助你,而且 this tutorial 看起来很有用。 |
![]() |
9
16
一般来说,编译器没有5分钟的教程,因为这是一个复杂的主题,编写编译器可能需要几个月的时间。你必须自己搜索。 通常解释python和ruby。也许你也想从一个翻译开始。一般来说比较容易。 第一步是编写正式的语言描述,即编程语言的语法。然后,您必须将要根据语法编译或解释的源代码转换为抽象语法树,这是计算机可以理解和操作的源代码的一种内部形式。这个步骤通常称为解析,解析源代码的软件称为解析程序。通常,解析器是由解析器生成器生成的,它将形式语法转换为源代码或机器代码。对于解析的一个好的、非数学的解释,我推荐解析技术——一个实用指南。维基百科对解析器生成器进行了比较,您可以从中选择适合自己的生成器。根据您选择的解析器生成器,您将在Internet上找到教程,对于真正流行的解析器生成器(如GNUbison),还有一些书籍。 为您的语言编写语法分析器可能非常困难,但这取决于您的语法。所以我建议保持你的语法简单(不像C++),一个很好的例子就是LISP。 在第二步中,抽象语法树从树结构转换为线性中间表示。作为一个很好的例子,Lua的字节码经常被引用。但是中间的表示法确实取决于你的语言。 如果您正在构建一个解释器,则只需解释中间表示。您也可以及时编译它。我建议使用llvm和libjit进行实时编译。为了使语言可用,您还必须包含一些输入和输出函数,也许还需要一个小的标准库。 如果您要编译该语言,它将更加复杂。您必须为不同的计算机体系结构编写后端,并从这些后端中的中间表示生成机器代码。我建议将LLVM用于此任务。 关于这个主题有几本书,但我不能推荐其中任何一本供一般使用。他们大多太学术或太实际。没有“21天自学编译器写作”,因此,你必须买几本书才能很好地理解整个主题。如果你在网上搜索,你会看到一些在线书籍和讲稿。也许你附近有一所大学图书馆,你可以在那里借一些关于编译器的书。 如果你想让你的项目认真进行的话,我也推荐你有良好的理论计算机科学和图论背景知识。计算机科学学位也会有所帮助。 |
![]() |
10
14
|
![]() |
11
11
一本书还没有被推荐,但很重要的是 "Linkers and Loaders" 约翰·莱文。如果您不使用外部汇编程序,您将需要一种方法来输出一个可以链接到最终程序的对象文件。即使您使用的是外部汇编程序,您可能也需要了解重新定位以及整个程序加载过程是如何工作的,从而形成一个工作工具。这本书收集了很多关于这个过程的随机知识,适用于各种系统,包括win32和linux。 |
![]() |
12
10
The Dragon Book 当然是“构建编译器”一书,但是如果您的语言没有当前一代语言那么复杂,您可能需要从 Design Patterns . 书中的例子设计了一个规则的表达式,就像语言一样,并经过深思熟虑,但是正如他们在书中所说,它有利于通过这个过程进行思考,但实际上只对小语言有效。然而,用这种模式为一种小语言编写一个解释器要比学习所有不同类型的解释器,yacc和lex,等等要快得多。 |
![]() |
13
10
如果您愿意使用LLVM,请查看: http://llvm.org/docs/tutorial/ .它教你如何使用LLVM框架从头开始编写编译器,并且不假设你对这个主题有任何了解。 本教程建议您编写自己的解析器和lexer等,但我建议您在得到这个想法后再研究bison和flex。它们使生活变得如此简单。 |
![]() |
14
10
我发现《龙书》读起来太难了,过于注重语言理论,而实际上编写编译器并不需要这种理论。 我会添加 Oberon 这本书包含了一个惊人的快速和简单的奥伯伦编译器的完整来源。 Project Oberon .
|
![]() |
15
9
我会第二 http://compilers.iecc.com/crenshaw/ 通过 @sasb . 暂时别买更多的书了。 为什么?工具和语言。 所需语言为Pascal,如果我记得正确,则基于turbo Pascal。如果你去 http://www.freepascal.org/ 下载pascal编译器所有的例子都直接从页面上运行~ http://www.freepascal.org/download.var 免费帕斯卡的好处在于,你几乎可以使用任何你喜欢的处理器或操作系统。 一旦你掌握了这些课程,那就尝试更高级的 “ Dragon Book “ ~ http://en.wikipedia.org/wiki/Dragon_book |
![]() |
16
9
我记得大约七年前我刚开始编程时问这个问题。 当我问的时候我很小心,很奇怪我没有你那么多的批评。不过,他们还是把我指向了 Dragon Book “在我看来,这是一本非常好的书,它解释了编写编译器所需要知道的一切(当然,你必须掌握一两种语言)。你知道的语言越多,就越快乐。 是的,很多人说读那本书是疯狂的,你不会从中学到任何东西,但我完全不同意。 许多人还说编写编译器既愚蠢又毫无意义。好吧,编译器开发有用的原因有很多: -因为它很有趣。 -这是有教育意义的,当学习如何编写编译器时,你会学到很多关于计算机科学和其他在编写其他应用程序时有用的技术。 -如果没有人编写编译器,现有的语言也不会变得更好。 我没有马上编写自己的编译器,但在问了我知道从哪里开始之后。现在,在学习了许多不同的语言和阅读了《龙书》之后,写作并不是什么大问题。(我也在学习计算机工程自动取款机,但我所知道的编程大部分都是自学的。) 总之: -龙书是一个伟大的“教程”。但是在尝试编写编译器之前,要花一些时间掌握一两种语言。不过,不要指望在未来十年左右成为编译器大师。 如果你想学习如何编写解析器/解释器,这本书也很好。 |
![]() |
17
9
我正在研究同样的概念,发现了乔尔·波巴的这篇有前途的文章, Create a Language Compiler for the .NET Framework - not sure where this has gone Create a Language Compiler for the .NET Framework - pdf copy of the original doc 他讨论了编译器的高级概念,并着手为.NET框架开发自己的语言。虽然它的目标是.NET框架,但许多概念应该能够被复制。文章内容包括:
还有其他的主题,但是你得到了公正。 它的目标是用C语言编写的人(不太Java) 高温高压 骨头 |
![]() |
18
8
创建编译器的一个简单方法是使用bison和flex(或类似工具),构建一个树(ast)并在c中生成代码。生成c代码是最重要的步骤。通过生成C代码,您的语言将自动在所有具有C编译器的平台上工作。 生成C代码和生成HTML一样简单(只需使用print或等效工具),而生成HTML又比编写C解析器或HTML解析器容易得多。 |
![]() |
19
8
“个人电脑编程”作者:Per Brinch Hansen 普伦蒂斯霍尔1982 ISBN 0-13-730283-5 这本书名很不幸 解释单用户编程环境的设计和创建 对于micros,使用一种类似pascal的语言,称为edison。作者介绍 逐步实现的所有源代码和说明 爱迪生编译器和简单的支持操作系统,全部用 爱迪生本身(除了用符号表示的小型支持内核) 用于PDP 11/23的汇编程序;也可以为IBM订购完整的源代码 PC)。 这本书最有趣的地方是:1)它的能力 演示如何创建一个完整、独立、自我维护的 有用的编译器和操作系统,以及2)有趣的讨论 第2章中的语言设计和规范问题以及权衡。 “Brinch Hansen on Pascal编译器”,作者:Per Brinch Hansen 普伦蒂斯霍尔1985 ISBN 0-13-083098-4 另一个理论之光 这本书讲授了大量的语用学知识。作者介绍了 编译器和P代码的设计、实现和完整的源代码 pascal的解释器-(pascal“减号”),一个带有布尔值和 整数类型(但没有字符、实数、子范围或枚举类型), 常量和变量定义以及数组和记录类型(但没有打包, 变量、集合、指针、无名称、重命名或文件类型)、表达式, 赋值语句,具有值和变量的嵌套过程定义 参数、if语句、while语句和begin end块(但不是 函数定义、过程参数、goto语句和标签, case语句、repeat语句、for语句和with语句)。 编译器和解释器是用pascal*(pascal“star”)编写的,a Pascal子集扩展了一些用于创建 软件开发系统。IBM PC的Pascal*编译器由 作者,但很容易将书的pascal编译器移植到任何 方便的帕斯卡平台。 这本书使编译器的设计和实现看起来很容易。我 尤其像作者关注质量的方式, 可靠性和测试。编译器和解释器很容易使用 作为更复杂语言或编译器项目的基础,尤其是 如果你被要求快速启动和运行一些东西。 |
![]() |
21
7
python与用python编写的python编译器捆绑在一起。您可以看到源代码,它包括所有阶段,从解析、抽象语法树、发出代码等。 砍掉它。 |
![]() |
22
7
LCC编译器( wikipedia ( project homepage )弗雷泽和汉森的著作《可重定目标的C编译器:设计和实现》中有描述。它非常易读,可以解释整个编译器,直到代码生成。 |
![]() |
23
7
对不起,这是西班牙语的,但这是阿根廷一门叫做“compiladores e int_)rpretes”(编译和翻译)的课程的参考书目。 本课程从形式语言理论到编译器构造,您至少需要构建一个简单的编译器:
|
![]() |
24
6
|
![]() |
25
6
不是一本书,而是一篇技术论文和一次非常有趣的学习体验,如果你想了解更多关于编译器(和元编译器)的信息…本网站将引导您构建一个完全独立的编译器系统,该系统可以编译自身和其他语言: Tutorial: Metacompilers Part 1 这都是基于一篇令人惊叹的10页小技术论文: 瓦尔朔尔 META II:一种面向语法的编译器编写语言 从诚实到上帝,1964年。早在1970年,我就从中学习了如何构建编译器。当您终于摸索编译器如何自我重新生成时,会有一个激动人心的时刻…… 我从大学时代就认识这个网站的作者,但我和这个网站没有任何关系。 |
![]() |
26
5
这里有很多很好的答案,所以我想我应该在列表中再加一个: 十多年前,我有一本书叫ProjectOberon,它在编译器上有一些写得很好的文本。这本书真正突出的意义是,来源和解释是非常亲手和可读的。完整的文本(2005版)已提供PDF格式,因此您可以立即下载。编译器将在第12章中讨论: http://www-old.oberon.ethz.ch/WirthPubl/ProjectOberon.pdf Niklaus Wirth,J_¼rg Gutknecht (治疗不如他那本关于编纂者的书广泛) 我读过几本关于编纂者的书,我可以仅次于龙书,花在这本书上的时间是非常值得的。 |
![]() |
27
5
如果您有兴趣为函数语言(而不是过程语言)编写编译器,可以使用Simon Peyton Jones和David Lester's“ Implementing functional languages: a tutorial “是一个很好的向导。 功能评估如何工作的概念基础是由一种简单但功能强大的称为“核心”的功能语言中的示例指导的。此外,核心语言编译器的每个部分都用miranda(一种与haskell非常相似的纯函数语言)中的代码示例进行了解释。 描述了几种不同类型的编译器,但即使您只遵循所谓的核心模板编译器,您也将非常了解什么使函数式编程起作用。 |
![]() |
28
4
我喜欢 Crenshaw tutorial 同样,因为它清楚地表明编译器只是另一个程序,它读取一些输入并写出一些输出。 读它。 如果您愿意的话,可以使用它,但是请看另一个参考资料,了解实际编写的编译器有多大和更完整。 读 On Trusting Trust ,以获取有关可以在此域中执行的不可见操作的线索。 |
![]() |
29
4
你可以使用 BCEL 由Apache软件基金会。通过这个工具,你可以生成类似汇编的代码,但是它是带有BCEL API的Java。您可以学习如何生成中间语言代码(在本例中是字节代码)。 简单实例
现在用这个类运行bcelifier
您可以在控制台上看到整个类的结果(如何构建字节代码MyCase.java)。函数的代码如下:
|
![]() |
30
4
到目前为止,这本书还不包括:
Basics of Compiler Design (Torben Mogensen) (来自哥本哈根大学计算机科学系)
我也有兴趣了解编译器,并计划在未来几年进入这个行业。这本书是理想的理论书,开始学习编者,就我所见。它可以自由复制,干净、仔细地书写,并以简单的英语提供给你,不需要任何代码,但仍然通过说明和图表等方式呈现出机制,值得一看。 |
![]() |
George S. · 是否存在基于元组的控制流语句内部表示? 7 年前 |
![]() |
FlatAssembler · 在x86程序集中计算exp(x) 7 年前 |
![]() |
cib · 即时编译和动态编译有什么区别? 7 年前 |
![]() |
Artemis · 寄存器与指令之间的差异 7 年前 |
![]() |
Sam · 了解go工具编译和链接命令 7 年前 |