C / C ++编译器如何工作?

时间:2009-07-06 05:00:49

标签: c++ c compiler-construction compiler-optimization

经过十多年的C / C ++编码,我注意到以下模式 - 非常优秀的程序员倾向于详细了解编译器的内部结构。

我是一个相当优秀的程序员,我有一个特殊的编译器“迷信”集合,所以我想重新启动我的知识并从基础开始。

有人可以推荐在线资源或喜爱书籍的链接吗?我对C / C ++编译,优化,GCC和LLVM特别感兴趣。

10 个答案:

答案 0 :(得分:28)

从龙书开始....(更多关注代码优化和代码生成)

编写一个玩具编译器,用于教育编程语言,如Decaf或Cool ..,你可以使用解析器生成器(lex和yacc)作为你的前端(让生活更轻松,专注于更多的东西)......

然后阅读gcc internals book以及浏览gcc源代码。

答案 1 :(得分:11)

编译器文本很好,但是对于自己教学来说它们有点沉重。 Jack Crenshaw有一本“书”,这是一系列文章,你可以下载并阅读“Lets Build a Compiler”。它遵循“边做边学”的方法,如果你没有从这个主题的正式课程中得到任何东西,或者它已经花了太多年了(这是我的情况)。它牵着你的手,引导你通过编写编译器,而不是用Lambda微积分和只有学术界关心的深层理论问题来打扰你。这是一个很好的方式来激发那些只有在Vax(YEAH,那是一个VAX!)许多月前在学校写东西的模糊记忆的脑细胞。它的编写非常简单,易于坐下来阅读,不像大多数教科书需要几罐咖啡才能超越第一章。一旦你有了理解的基础,那么更多的传统文本,如龙书,是扩展你的理解的伟大参考。 (而且我个人喜欢Dead Tree版本,我打印出Jack's,在舒适的位置阅读比在笔记本电脑上阅读更容易。而电子书阅读器太昂贵了,因为某些东西实际上并不像你在阅读真实的书。)

有些人可能称之为“缺点”是它是用Pascal编写的,但我认为这让我更多地考虑它,而不是有人给我一个有效的C程序开始。从那时起,它就以68000编写,仅在此时才用于嵌入式系统。对我而言,这不是一个问题,我知道68000 asm和68000 asm比其他一些asm更容易阅读。

答案 2 :(得分:10)

答案 3 :(得分:9)

如果您想要死树版,请尝试The Art of Compiler Design: Theory and Practice

答案 4 :(得分:4)

如Pete Eddy所述,Jack Crenshaw的教程非常适合新手。但是如果你想看到如何真实,生产C编译器工作 - 由杰出工程师设计而不是通过在墙上抛出代码来创建 - 直到某些东西卡住 - 得到一份Fraser和Hanson的A Retargetable C Compiler: Design and Implementation副本,其中包含非常干净的lcc编译器的源代码。设计和实现的解释与代码混合在一起。它不是初学者的第一本书,但它会报销仔细研究,你可以花35美元得到一份二手书。

有关lcc的更长篇幅,请参阅Compile C Faster on Linux

lcc网页还提供了许多优秀教科书的链接。然而,我不知道我真正喜欢的介绍文本。

P.S。对不起,你在Uni被扯掉了。

答案 5 :(得分:3)

答案 6 :(得分:3)

请参阅Fabrice Bellard的otcc源代码

http://bellard.org/otcc/

答案 7 :(得分:2)

根据你想知道的内容,你应该看一下管道和过滤器模式,因为据我所知,这些(或类似的东西)在过去几年中被许多编译器使用。

当我的编译器知识不是太过时,它的工作原理如下:

将源代码解析为符号表示

清理符号表示,进行一些规范化

基于特定规则优化符号树

根据符号树写出可执行代码

当然,依赖性等也必须得到解决。

当然,查看gcc或javac源代码可能有助于获得更详细的理解。

答案 8 :(得分:1)

获取和阅读编译器的源代码也很有价值。我怀疑海湾合作委员会是最好的首选,因为它充分兼容20多年的语言发展。但我也确信,在其中一本内部参考手册的指导下阅读其来源将具有教育意义。

我认真考虑查看内部编译为虚拟机字节码的脚本语言的源代码。有几种语言符合这种描述,但我会从Lua开始。语言很小,VM很新颖。 source code也很小,我看过的内容非常明显,虽然轻微评论。

答案 9 :(得分:0)

查看Kaleidoscope。 您可以使用LLVM在几天内编写自己的编译器。