use*_*005 182 c c++ compiler-construction
这一直困扰着我.gcc/g ++如何编译自己?我猜测每个修订版都使用以前构建的修订版进行编译.这是真的?如果是的话,是否意味着最古老的g ++/gcc版本是用汇编语言编写的?
Fre*_*Foo 174
最古老的GCC版本是使用另一个C编译器编译的,因为编写它时还有其他版本.有史以来第一个C编译器(大约1973年,IIRC)是在PDP-11汇编中实现的,或者是在它之前的B编程语言中实现的,但无论如何B编译器都是用汇编语言编写的.同样,第一个C++编译器(CPre/Cfront,1979-1983)可能首先在C中实现,然后用C++重写.
当您编译GCC或任何其他自托管编译器时,构建的完整顺序是:
此过程称为bootstrapping.它测试编译器编译自身的能力,并确保生成的编译器是使用它自己实现的所有优化构建的.
编辑:Drew Dormann在评论中指出了Bjarne Stroustrup对最早实现C++的描述.它是用C++实现的,但是被Stroustrup称为从C++到C的"预处理器"的翻译; 他的定义并不是一个完整的编译器,但C++仍然是用C语言引导的.
And*_*nas 10
如果要在现代环境(x86 Linux)中复制 GCC 的 bootstrap 过程,可以使用bootstrappable项目开发的工具:
我们可以从hex0
汇编程序开始(在 x86 上它是 357 字节的二进制文件),它大致完成以下两个命令的作用
sed 's/[;#].*$//g' hex0_x86.hex0 | xxd -r -p > hex0
chmod +x hex0
Run Code Online (Sandbox Code Playgroud)
即它将二进制程序的 ASCII 等价物转换为二进制代码,但它本身是用 hex0 编写的。
基本上,hex0 具有与其二进制代码一一对应的等效源代码。
hex0
可用于构建更强大的hex1
汇编器,该汇编器支持更多功能(一个字符标签并计算偏移量)。hex1 是用 hex0 程序集编写的。
hex1
可用于构建hex2
(甚至支持多字符标签的更高级的汇编程序)。
hex2
then 可用于构建宏汇编程序(其中程序使用宏而不是十六进制操作码)。
然后您可以使用这个宏汇编器来构建cc_x86
它是一个用汇编编写的“C 编译器”。cc_x86 仅支持 C 的一小部分,但这是一个令人印象深刻的开始。
您可以使用cc_x86
to build M2-Planet
(Macro Platform Neutral Transpiler),这是一个用 C 编写的 C 编译器。M2-Planet 是自托管的,可以自行构建。
然后您可以使用 M2-Planet 来构建GNU Mes,它是一个小型方案解释器。
mes 可用于运行 mescc,它是一个用 scheme 编写的 C 编译器,与 mes 位于同一存储库中。
mescc 可用于重建 mes 并构建 mes C 库。
然后 mescc 可以用来构建一个稍微打了补丁的 Tiny C 编译器。
然后您可以使用它来构建更新版本的 TCC 0.9.27。
GCC 4.0.4 和 musl C 库可以用 TCC 0.9.27 构建。
然后你可以使用旧的 GCC 构建新的 GCC。例如 GCC 4.0.4 -> GCC 4.7.4 -> 现代 GCC。
特尔;博士:
hex0 -> hex1 -> hex2 -> M0 -> M2-Planet -> Mes -> Mescc -> TCC -> GCC。