当前位置:  开发笔记 > 编程语言 > 正文

从一个简单的(也许是最简单的)C编译器开始?

如何解决《从一个简单的(也许是最简单的)C编译器开始?》经验,为你挑选了8个好方法。

我遇到了这个问题:使用Turbo Pascal编写编译器

我很好奇是否有任何教程或参考资料解释如何创建一个简单的C编译器.我的意思是,如果它让我达到理解算术运算的水平就足够了.在阅读肯·汤普森的这篇文章后,我变得非常好奇.写一些理解自己的东西的想法似乎令人兴奋.

为什么我提出这个问题而不是问Google?我试过谷歌和帕斯卡一个是第一个链接.其余的似乎没有相关性,并且增加了......我不是CS专业(所以我仍然需要了解所有这些工具,如yacc),我想通过这样做来学习这一点,并希望有更多经验的人总是比谷歌更擅长这些事情.我想阅读一些与上面列出的文章相同的文章,但至少突出了构建一个简单的C编译器的自举阶段.

另外,我不知道最好的学习方法.我是否开始用C或其他语言构建C编译器?我是否编写C编译器或其他语言?一旦我有方向去探索,我觉得这样的问题会得到更好的回答.有什么建议?

有什么建议?



1> duffymo..:

编译器由三部分组成:

    解析器

    抽象语法树(AST)

    代码生成器

有很多很好的解析器生成器以语言语法开头.也许ANTLR会是你开始的好地方.如果你想坚持C根,试试lex/yacc或bison.

有C语法,但我认为C语言很复杂.你最好从语言的一个子集开始,然后继续努力.

获得AST后,您可以使用它生成您将运行的机器代码.

这是可行的,但不是微不足道的.

我还要查看亚马逊有关编写编译器的书籍.龙书是经典之作,但还有更多现代书.

更新:Stack溢出有类似问题,就像这个问题一样.查看这些资源.



2> Phong..:

我建议你这个教程:

LLVM教程

这是一个关于如何实现"小语言"编译器的小例子.源代码非常小,并逐步解释.

还有用于LLVM(低级虚拟机,代表程序内部结构)库的C前端库:



3> Mark Rushako..:

对于它的价值,Tiny C Compiler是一个相对较小的源代码包中功能齐全的C编译器.例如,您可能会从研究该来源中受益,因为它可能比理解GCC的所有源代码基础更容易理解.


我尝试过,但很难阅读源代码

4> mctylr..:

这是我的观点(和猜想)如果不理解本科(中学后)计算机科学课程中通常涵盖的数据结构,编写编译器将很困难.这并不意味着你不能,但你需要知道基本数据结构,如链表和树.

我建议将自己局限于语言的基本子集,例如常用运算符,仅整数支持,以及基本函数和指针,而不是编写完整或符合标准的C语言编译器(至少在开始时).其中一个典型的例子就是Ron Cain的Small-C,它受到Dobbs Journal博士写的一系列文章的欢迎,我相信20世纪80年代.他们用詹姆斯亨德里克斯的绝版书籍A Small-C Compiler出版了一张CD.

我建议遵循Crenshaw的教程,但是将其编写为类似C语言的编译器,以及您希望定位的任何CPU目标(Crenshaw的目标是Motorola 68000 CPU).为此,您需要了解要在其上运行已编译程序的目标的基本程序集.这可能包括68000或MIPS的仿真器,它们可以说是比Intel x86(16/32位)令人尊敬的CISC指令集更好的汇编指令集.

有许多潜在的书籍可以作为学习编译器/翻译理论(和实践)的起点.阅读comp.compilers FAQ,以及各种在线图书销售商的评论.大多数入门书籍都是作为大二到大学本科计算机科学课程的教科书编写的,因此如果没有CS背景,它们可能会很慢.一本较旧的书可能比" 龙书 "更具介绍性,但更容易阅读,是托马斯帕森斯的编译器构建简介.它比较旧,所以您应该能够以合理的价格从您选择的在线图书销售商处找到一份旧版本.

所以我想说,尝试从Jack Crenshaw的Let's Build a Compiler教程开始,按照他的示例作为指南自己编写,并构建一个简单编译器的基础知识.一旦你有了这个工作,你就可以更好地决定你从哪里开始.

添加:

关于自举过程.由于现有的C编译器可以免费使用,因此您无需担心自举.使用单独的现有工具(GCC,Visual C++ Express,Mingw/djgpp,tcc)编写编译器,您可以担心在稍后阶段自行编译项目.我对这个问题的这一部分,直到我意识到你是通过阅读肯·托马斯ACM图灵奖的演讲,带给编写自己的编译器的想法感到惊讶的信任信托思考,这并进入编译引导过程.这是一个适度的高级主题,也简直是一个麻烦.我甚至发现在较旧的Unix系统(64位Alpha上的数字OSF/1)下引导GCC C编译器,其中包括C编译器,这是一个缓慢且耗时且容易出错的过程.

另一类问题是像Yacc这样的编译器工具实际上做了什么.Yacc(来自GNU的另一个编译器编译器或Bison)是一种旨在使编写(或转换器)解析器更容易编写的工具.根据您输入到yacc的目标语言的形式语法,它会生成一个解析器,它是编译器总体设计的一部分.接下来是用于生成词法分析器或扫描器的Lex(或GNU的flex),它通常与yacc生成的解析器结合使用,以形成编译器前端的骨架.这些工具使得编写者的前端可以说比编写词法分析器和解析器更容易.Crenshaw的教程不使用这些工具,您也不需要,许多编译器编写者并不总是使用它们.当然,Crenshaw承认教程的解析器非常基础.

Crenshaw的教程还跳过生成AST(抽象语法树),这简化了但也限制了教程编译器.它缺少大多数(如果不是全部)优化,并且与特定编程语言和编译器的"后端"发出的特定汇编语言密切相关.通常,AST是一个中间部分,可以执行某些优化,并用于在设计中解耦编译器前端和后端.对于没有计算机科学背景的初学者,我建议不要担心你的第一个编译器(或至少是它的第一个版本)没有AST.我认为保持它小而简单将帮助你完成编写第一个版本的编译器,然后你可以从那里决定如何继续.



5> Joe Internet..:

您可能对本书/课程计算系统要素:从第一原理构建现代计算机感兴趣.

请注意,这不是关于从newegg购买的东西构建"pc".它首先描述了布尔逻辑基础,并构建了一个虚拟计算机,从最低级别的抽象到逐步更高级别的抽象.课程材料都在线,这本书本身相当便宜,来自亚马逊.

在本课程中,除了"构建硬件"之外,您还将以逐步的方式实现汇编程序,虚拟机,编译器和基本操作系统.我认为这将为您提供足够的背景知识,以深入研究主题领域,并在其他答案中列出一些更常用的推荐资源.



6> t0mm13b..:

编译器是一个复杂的主题,涵盖了各个方面

输入处理涉及Lexing,Parsing

构建使用的每个变量的符号存储,例如抽象语法树(AST)

从AST树中,根据语法转置并构建机器代码二进制文件

这绝不是详尽的,因为它是从山顶的一个抽象的鸟瞰图,把它归结为得到语法符号正确,并确保异常输入不扔它,其实是一个很好的输入处理应该不会下降跪在地上,无论多么畸形,可怕,滥用的输入案件都会被抛到脑后.并且,在决定和知道输出将是什么时,它是否在机器代码中,这意味着您可能必须密切了解处理器指令...包括变量的内存寻址等等......

以下是一些入门链接:

有一个Jack Crenshaw的C代码端口 ....(我记得几个月前下载它......)

下面是一个类似的问题的链接在这里的SO.

另外,这是Basic到x86汇编程序编译器的另一个小编译器教程.

微小的C编译器

Hendrix的Small C编译器在这里找到.



7> msw..:

在Unix编程环境中,Kernighan和Pike进行了5次迭代,使计算器从简单的基于C的词法分析和立即执行到yacc/lex解析和抽象机器的代码生成.因为他们写的如此奇妙,我不能建议更顺畅的介绍.它肯定比C小,但这可能对你有利.



8> Norman Ramse..:

我如何[开始编写]一个简单的C编译器?

编译C没什么简单的.最好的简单C编译器是Chris Fraser和David Hanson的lcc.他们花了10年的时间从​​事设计工作,使其尽可能简单,同时仍能产生相当好的代码.如果您可以访问大学图书馆,您应该可以获得他们的图书.

我是否开始用C或其他语言构建C编译器?

其他一些语言.有一次我问汉森他和弗雷泽在lcc项目上花了10年时间学到了什么.汉森说的主要是

C是编写编译器的糟糕语言.

你最好使用Haskell或ML的一些方言.两种语言都提供代数数据类型的功能,这是编译器编写者面临的问题的完美匹配.如果你仍然想要追求C,你可以从George Necula的CIL开始,这是用ML编写的C编译器的一大块.

我想阅读一些与上面列出的文章相同的文章,但至少突出了自举阶段...

你不会找到像肯的那样的另一篇文章.但Andrew Appel写了一篇很好的文章,叫做Axiomatic Bootstrapping:编译器黑客指南 我找不到免费版本,但很多人都可以访问ACM数字图书馆.

有什么建议?

如果要编写编译器,

使用Haskell或ML作为您的实现语言.

对于你的第一个编译器,选择一个非常简单的语言,如Oberon或类似P0,来自Niklaus Wirth的书Algorithms + Data Structures = Programs.Wirth因设计易于编译的语言而闻名.

您可以为第二个编译器编写C编译器.

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有