[英]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源代码
根据您确切想知道的内容,您应该查看管道和过滤器模式,因为据我所知,在过去几年中,许多编译器都使用了这种(或类似的东西)。
当我的编译器知识不是太过时它的工作原理如下:
将源代码解析为符号表示
清理符号表示,做一些规范化
基于特定规则的符号树优化
写出基于符号树的可执行代码
当然,依赖性等也必须得到解决。
当然,查看gcc或javac源代码可能有助于获得更详细的理解。
看看万花筒 。 您可以使用LLVM在几天内编写自己的编译器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.