c++ - GCC 和 g++ 是如何引导的?

标签 c++ c compiler-construction

这已经困扰我一段时间了。 GCC和g++是如何自己编译的?

我猜每个版本都会使用以前构建的版本进行编译。这是真的?如果是,是否意味着最古老的 g++ 和 GCC 版本是用汇编语言编写的?

最佳答案

最旧的 GCC 版本是使用另一个 C 编译器编译的,因为在编写它时还有其他版本。第一个 C 编译器(约 1973 年,IIRC)在 PDP-11 中实现。汇编,或在它之前的 B 编程语言中,但无论如何 B 编译器是用汇编编写的。 同样,第一个 C++ 编译器(CPre/Cfront,1979-1983)可能首先用 C 实现,然后用 C++ 重写。

当您编译 GCC 或任何其他自托管编译器时,构建的完整顺序是:

  1. 使用现有的 C 编译器构建新版本的 GCC
  2. 用刚刚构建的 GCC 重新构建新版本
  3. (可选)重复第 2 步以进行验证。

这个过程被称为 bootstrapping .它测试编译器的 self 编译能力,并确保生成的编译器使用它自己实现的所有优化来构建。

编辑:Drew Dormann 在评论中指出 Bjarne Stroustrup 对 earliest implementation of C++ 的描述.它是用 C++ 实现的,但由 Stroustrup 所谓的“预处理器”从 C++ 翻译成 C;根据他的定义,它不是一个完整的编译器,但 C++ 仍然是在 C 中引导的。

关于c++ - GCC 和 g++ 是如何引导的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9429491/

相关文章:

c - 如何使用 GCC 编译器强制执行结构位顺序?

c++ - 是否可以在 gcc 中关闭对 "and"/"or" boolean 运算符使用的支持?

c++ - 为什么 c/c++ 允许在函数调用中省略多维数组的最左边索引?

c++ - QTextEdit 的内存问题

c++ - 有没有办法在 Eclipse 中找到匹配的#if、#else、#elif 和#endif?

多维数组的位置与它们在初始化期间表示的内容的相关性

c - 处理字符串时解析错误

c++ - 初始化基类

c++ - 霍夫曼解码循环不迭代

c - rtl_sdr : reliably detect frequency changes, 丢弃之前获得的样本