【发布时间】:2010-11-08 07:13:27
【问题描述】:
经过十多年的 C/C++ 编码,我注意到以下模式 - 非常优秀的程序员往往对编译器的内部有详细的了解。
我是一个相当优秀的程序员,我有一个特别的编译器“迷信”集合,所以我想重新认识我的知识并从基础开始。
谁能推荐在线资源或喜爱书籍的链接?我对 C/C++ 编译、优化、GCC 和 LLVM 特别感兴趣。
【问题讨论】:
标签: c++ c compiler-construction compiler-optimization
经过十多年的 C/C++ 编码,我注意到以下模式 - 非常优秀的程序员往往对编译器的内部有详细的了解。
我是一个相当优秀的程序员,我有一个特别的编译器“迷信”集合,所以我想重新认识我的知识并从基础开始。
谁能推荐在线资源或喜爱书籍的链接?我对 C/C++ 编译、优化、GCC 和 LLVM 特别感兴趣。
【问题讨论】:
标签: c++ c compiler-construction compiler-optimization
从龙书入手....(更注重代码优化和代码生成)
继续为诸如 Decaf 或 Cool 之类的教育编程语言编写一个玩具编译器,您可以在前端使用解析器生成器(lex 和 yacc)(让生活更轻松并专注于更多 imp 的东西)... .
然后阅读 gcc 内部书以及浏览 gcc 源代码。
【讨论】:
【讨论】:
编译器文本很好,但它们对于自学来说有点沉重。 Jack Crenshaw 有一本“书”,它是一系列可以下载和阅读的文章,名为“让我们构建一个编译器”。它遵循“边做边学”的方法,如果你没有从参加该主题的正式课程中得到任何东西,或者它已经有太多年没有上过它(这是我的情况),那么它会很棒。它牵着你的手,引导你编写编译器,而不是用 Lambda 演算和只有学术界才关心的深层次理论问题来打你。这是一个很好的方法来激发那些只有模糊记忆的脑细胞,他们在很多个月前的学校里在 Vax(是的,没错,就是 VAX!)上写了一些东西。它写得非常健谈,很容易坐下来阅读,不像大多数教科书需要几壶咖啡才能读完第一章。一旦你有了理解的基础,那么像龙书这样的更传统的文本是扩展你理解的很好的参考。 (而且我个人喜欢死树版本,我打印了杰克的版本,在舒适的位置上阅读比在笔记本电脑上要容易得多。而且电子书阅读器对于那些实际上并不觉得你正在阅读的东西来说太贵了真正的书。)
有些人可能称之为“缺点”的是它是用 Pascal 编写的,但我认为这让我思考的更多,而不是有人给我一个可以工作的 C 程序开始。另外,它是在考虑 68000 的情况下编写的,目前仅在嵌入式系统中使用。再次对我来说这不是问题,我知道 68000 asm 和 68000 asm 比其他一些 asm 更容易阅读。
【讨论】:
如果你想要死树版本,试试The Art of Compiler Design: Theory and Practice。
【讨论】:
正如 Pete Eddy 所说,Jack Crenshaw 的教程非常适合新手。但是,如果您想了解一个真正的生产 C 编译器如何工作——它是由杰出的工程师设计而不是通过将代码扔到墙上直到出现问题而创建的——给自己一份弗雷泽和汉森的A Retargetable C Compiler: Design and Implementation 的副本,其中包含非常干净的lcc 编译器的源代码。设计和实现的解释与代码混合在一起。这不是初学者的第一本书,但它会回报仔细研究,您可以花 35 美元买到一本二手书。
有关lcc 的详细介绍,请参阅Compile C Faster on Linux。
lcc 网页也有很多优秀教科书的链接。但是,我不知道我真正喜欢的介绍性文字。
附:对不起,你在 Uni 被骗了。
【讨论】:
查看 Fabrice Bellard 的 otcc 源代码
【讨论】:
根据您确切想知道的内容,您应该看看管道和过滤器模式,因为据我所知,过去几年很多编译器都使用了这个(或类似的东西)。
当我的编译器知识不太过时时,它的工作原理如下:
将源代码解析为符号表示
清理符号表示,做一些规范化
根据一定的规则优化符号树
根据符号树写出可执行代码
当然依赖等也必须解决。
当然,查看 gcc 或 javac 源代码可能有助于获得更详细的理解。
【讨论】:
获取源代码并将其读取到编译器可能也很有价值。我怀疑 GCC 是最好的首选,因为它完全兼容 20 多年的语言演变。但我也确信,在其中一本内部参考手册的指导下阅读其来源会很有教育意义。
我会认真考虑查看脚本语言的源代码,该语言在内部编译为虚拟机的字节码。几种语言符合该描述,但我会以Lua 开头。语言很小,虚拟机很新颖。 source code 也很小,虽然评论很少,但我看过的部分非常清楚。
【讨论】:
看看Kaleidoscope。 使用 LLVM,您可以在几天内编写自己的编译器。
【讨论】: