34

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

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

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

4

10 回答 10

28

从龙书入手....(更强调代码优化和代码生成)

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

然后阅读 gcc 内部书以及浏览 gcc 源代码。

于 2009-07-06T05:26:14.137 回答
11
于 2009-07-06T05:03:36.460 回答
11

编译器文本很好,但它们对于自学来说有点沉重。Jack Crenshaw 有一本“书”,它是一系列可以下载和阅读的文章,名为“让我们构建一个编译器”。它遵循“边做边学”的方法,如果您没有从参加有关该主题的正式课程中得到任何东西,或者自从学习它已经有太多年了(这是我的情况),那么它会很棒。它牵着你的手,引导你编写编译器,而不是用 Lambda 演算和只有学术界才关心的深层理论问题来打你。这是一个很好的方法来激发那些只有模糊记忆的脑细胞,在很多个月前的学校里在 Vax(是的,没错,就是 VAX!)上写了一些东西。它写得很对话,很容易坐下来阅读,不像大多数教科书需要几壶咖啡才能通过第一章。一旦你有了理解的基础,那么像龙书这样的更传统的文本是扩展你理解的很好的参考。(而且我个人喜欢死树版本,我打印了杰克的版本,在舒适的位置上阅读比在笔记本电脑上要容易得多。而且电子书阅读器对于那些实际上并不觉得你正在阅读的东西来说太贵了真正的书。)在舒适的位置上阅读比在笔记本电脑上容易得多。而且电子书阅读器对于那些实际上还不像在阅读真正的书的东西来说太贵了。)在舒适的位置上阅读比在笔记本电脑上容易得多。而且电子书阅读器对于那些实际上还不像在阅读真正的书的东西来说太贵了。)

有些人可能称之为“缺点”的是它是用 Pascal 编写的,但我认为这让我思考的更多,而不是有人给我一个可以工作的 C 程序开始。另外,它是在考虑 68000 的情况下编写的,目前仅在嵌入式系统中使用。再次对我来说这不是问题,我知道 68000 asm 和 68000 asm 比其他一些 asm 更容易阅读。

于 2009-07-06T23:09:50.793 回答
9

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

于 2009-07-06T05:13:40.247 回答
4

正如 Pete Eddy 所说,Jack Crenshaw 的教程非常适合新手。但是,如果您想了解一个真正的生产 C 编译器是如何工作的——它是由出色的工程师设计的,而不是通过将代码扔到墙上直到出现问题而创建的——给自己找一份 Fraser 和 Hanson 的A Retargetable C Compiler: Design和 Implementation,其中包含非常干净的lcc编译器的源代码。设计和实现的解释与代码混合在一起。这不是初学者的第一本书,但它会回报仔细研究,你可以花 35 美元买到一本二手书。

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

lcc 网页也有很多优秀教科书的链接。但是,我不知道我真正喜欢的介绍性文字。

PS对不起,你在大学被骗了。

于 2009-07-07T02:14:54.987 回答
3

查看 Fabrice Bellard 的 otcc 源代码

http://bellard.org/otcc/

于 2009-07-11T10:54:17.470 回答
3

http://se-radio.net/podcast/2007-07/episode-61-internals-gcc

于 2009-07-06T06:54:25.347 回答
2

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

当我的编译器知识不太过时时,它的工作方式如下:

将源代码解析为符号表示

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

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

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

当然依赖关系等也必须解决。

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

于 2009-07-06T05:14:47.763 回答
1

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

我会认真考虑查看脚本语言的源代码,该语言在内部编译为虚拟机的字节码。有几种语言适合这种描述,但我会从Lua开始。语言很小,虚拟机很新颖。源代码也很小,尽管注释很少,但我看过的部分非常清楚。

于 2009-07-06T08:03:07.910 回答
0

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

于 2009-09-01T16:32:35.043 回答