这件事已经困扰我好一阵子了.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.它测试编译器自身编译的能力,并确保生成的编译器是使用它自己实现的所有优化构建的.

EDIT:Drew Dorman在 comments 中指出了比亚恩·斯特劳斯图普对earliest implementation of C++人的描述.它是用C++实现的,但是Stroustrup称之为"预处理器"的翻译是从C++到C;不是定义的完全编译器,但仍然是C.中的C++.

C++相关问答推荐

插入元素后,Sizeof操作符无法正常工作

有什么方法可以检测SunOS上的SparcWorks吗?

想了解 struct 指针和空指针转换

理解没有返回语句的递归C函数的行为

在C中使用动态内存分配找到最小的负数

C中是否有语法可以直接初始化一个常量文本常量数组的 struct 成员?

如何在不使用其他数组或字符串的情况下交换字符串中的两个单词?

Linux不想运行编译后的文件

S在本文中的价值观到底出了什么问题?

如何只获取字符串的第一个单词,然后将其与c中的另一个单词进行比较?

处理来自浏览器的HTTP请求

从另一个宏函数调用C宏

在吉陀罗中,_2_1_和CONCAT11是什么意思?

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

在哪里可以找到叮当返回码的含义?

通过GTK';传递回调参数;s g_signal_connect()导致C中出现意外值

无法在 C 中打开文本文件,我想从中读取文本作为数据并将其写入数组

初始化动态分配的布尔二维数组的最佳方法是什么?

Zig 中 C 的system函数的惯用替代方案