繁体   English   中英

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

[英]How do C/C++ compilers work?

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

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

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

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

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

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

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

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

如果你想要死树版,试试编译器设计的艺术:理论与实践

正如Pete Eddy所说,Jack Crenshaw的教程非常适合新手。 但是,如果你想看看如何将一个真实的,生产的C编译器的工作原理 -酮这是由聪明的工程师设计的 ,而不是通过在墙投掷代码中创建,直到东西卡,让自己弗雷泽和汉森的副本一个可重定向C编译器:设计和实现 ,其中包含非常干净的lcc编译器的源代码。 设计和实现的解释与代码混合在一起。 它不是初学者的第一本书,但它会报销仔细研究,你可以花35美元得到一份二手书。

有关lcc的更长lcc ,请参阅在Linux上编译C更快

lcc网页还包含许多优秀教科书的链接。 但是,我不知道我真正喜欢的介绍文本。

PS对不起你在Uni被扯掉了。

请参阅Fabrice Bellard的otcc源代码

http://bellard.org/otcc/

根据您确切想知道的内容,您应该查看管道和过滤器模式,因为据我所知,在过去几年中,许多编译器都使用了这种(或类似的东西)。

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

将源代码解析为符号表示

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

基于特定规则的符号树优化

写出基于符号树的可执行代码

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

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

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

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

看看万花筒 您可以使用LLVM在几天内编写自己的编译器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM