【问题标题】:How do C/C++ compilers work?C/C++ 编译器如何工作?
【发布时间】:2010-11-08 07:13:27
【问题描述】:

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

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

谁能推荐在线资源或喜爱书籍的链接?我对 C/C++ 编译、优化、GCC 和 LLVM 特别感兴趣。

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,很好的序列。我拿的龙书是:en.wikipedia.org/wiki/index.html?curid=188976
  • 对,就是龙书。我读了第一版。它有一条简单得多的龙……
  • 嘎。人们一直在推荐这个。不是我。从一个随意的介绍开始——比如“让我们构建一个编译器”——然后查看包含所有数学和理论的计算机科学参考。
  • 我建议不要尝试理解 GCC。就编译器而言,这是相当不寻常的,而且它的架构在设计上很差(因为,设计是故意削弱的。是的,我是认真的。不,我不只是在拿 GCC 开玩笑)。
  • 在了解您在做什么时,LEX 和 YACC 只是添加了一层额外的技术,使您无法了解正在发生的事情。如果目标是了解编译器的工作原理,那么递归体面的解析器将使您比使用 LEX 和 YACC 更好地理解,一般来说,如果您只是将其作为学习练习,您可能不会编写优化编译器没有其他人帮助您的空闲时间。
【解决方案2】:

【讨论】:

  • 我正在翻阅 GCC 内部手册,它似乎对“学习”编译器的工作方式没有用处。它不是假设您已经掌握该主题的知识的教学文档。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    如果你想要死树版本,试试The Art of Compiler Design: Theory and Practice

    【讨论】:

      【解决方案5】:

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

      有关lcc 的详细介绍,请参阅Compile C Faster on Linux

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

      附:对不起,你在 Uni 被骗了。

      【讨论】:

      • 感谢您的提示 - 我会检查 lcc
      • 杰出的工程师? Jack Crenshaw 设计了航天飞机的部件,而自制电脑是他的爱好。不要质疑编写 lcc 的人的智慧,但您不必很聪明就能设计一个编译器。真的没那么难。
      • 引用的不是 Crenshaw,而是 gcc。 RMS 有很多东西,但杰出的工程师不是其中之一。然后加入1000只猴子,搅拌均匀……
      【解决方案6】:
      【解决方案7】:

      查看 Fabrice Bellard 的 otcc 源代码

      http://bellard.org/otcc/

      【讨论】:

        【解决方案8】:

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

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

        将源代码解析为符号表示

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

        根据一定的规则优化符号树

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

        当然依赖等也必须解决。

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

        【讨论】:

          【解决方案9】:

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

          我会认真考虑查看脚本语言的源代码,该语言在内部编译为虚拟机的字节码。几种语言符合该描述,但我会以Lua 开头。语言很小,虚拟机很新颖。 source code 也很小,虽然评论很少,但我看过的部分非常清楚。

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              猜你喜欢
              • 2011-10-18
              • 1970-01-01
              • 1970-01-01
              • 2016-08-11
              • 2014-10-07
              • 1970-01-01
              • 1970-01-01
              • 2014-05-29
              • 2015-01-29
              相关资源
              最近更新 更多