gcc C编译器是用C本身编写的吗?


87

gcc C编译器是用C本身编写的吗?还是用汇编语言编写?如果编译器是用C编写的,那么用于编译编译器代码的编译器是什么?


12
是的(主要是)。当然,一个人需要一个C编译器来编译C,因此,与大多数编译器一样,它具有一系列的“引导-启动”阶段。安装GCC:GCC-LFS的构建安装中涵盖了一般思想。

2
在1980年代和90年代初期,不同品牌的工作站都有自己的类unix环境,其中包含c编译器,工具等,两者彼此之间有点不同。使用GCC源代码,您可以在这些平台之一上进行gcc的初始编译,然后将其本身编译几次,以或多或少地检查固定点。
保罗

Answers:


98

GCC的特定历史记录在GCC Wiki中提供。更为笼统的一点是,编译器通常最初是与其他一些编译器一起编译的,直到它们强大到可以自行编译为止。或者,可以编写一个基本的编译器来处理汇编器中部分功能,然后从那里开始构建。但是,这几乎不再需要了。有许多可用的,各种语言的编译器。甚至在斯蒂芬·约翰逊(Stephen Johnson)编写pcc(最早的C编译器之一)时,也存在可用的B编译器以及许多其他语言。gcc最初有几个编译器可供选择来构建,而RMS说他至少在最初的开发中就使用了Pastel编译器。

记住,没有要求用C编写C编译器。如果愿意,可以用Perl编写。不需要将给定平台的编译器最初编写在该平台上(嵌入式系统几乎总是在其他系统上编译)。因此,有很多方法可以使您自举。

这个问题有一些有趣的细微之处,它们与引导编译器的第一个实例有关。如果您非常聪明,则可以利用该引导程序来做一些令人难以置信,辉煌而恐怖的事情


哇,您链接的第二篇文章非常聪明。
Ponkadoodle

1
感谢您提供出色的自举链接。我曾以为,编译器总是写在简单的语言全部回办法机器代码排序的这个原因。(例如,如果您意识到编译器的二进制文件包含错误,该怎么办?这当然提供了更强大的示例。)那么,用自己的语言编写编译器有什么好处?极度偏执的人会担心这一点,并在没有“自我”引导的情况下构建编译器吗?
RoG

4
一些语言团体认为能够进行自我汇编是一种荣誉标记。Go最近在这个方向上做出了巨大的努力。另一方面,Swift显然没有当前计划在Swift中重写其编译器。但是请注意,GCC始终是用C编写的。它只是与其他编译器一起编译的。但是,如果所有C编译器都是用BCPL编写的,那将无法解决有关偏执狂的任何问题。它只是使问题退后一步。(通过编译带有clang的GCC,您将获得相同的偏执狂收益。)
Rob Napier

51

最初,它是用某种汇编语言编写的,然后就开始狗食了。


2
对于原始引导程序,我还没有看到使用汇编程序对RMS的任何引用。您的来源是什么?他还有其他几个编译器需要引导,因此似乎需要大量工作。
罗布·纳皮尔

17
我虽然这个词是引导程序。
马丁·约克

7
哈哈哈,我几周前读过这篇文章,以为您对这种表达不满意,没有意识到这是标准的。好秀先生!en.wikipedia.org/wiki/Eating_your_own_dog_food

3

虽然这显然只是一个非常粗略的指标,我发现这个快速上市gcc-5.1.0-src/gcc/目录有趣。该目录包含GCC本身的主要来源(运行时库除外)。

这是按扩展名分组的排名第一的文件计数(超过100),这些文件以C和C ++文件为主。

    112 .opt
    118 .def
    140 .cc
    185 .x
    250 .exp
    353 .md
    366 .mm
    414 .f
    430 .f03
    521 .m
    625 .a
   1082 .go
   1371 .h
   1602 .ads
   1655 .adb
   1828 .ada
   3860 .f90
  11231 .C        // C++ 
  23811 .c        // C 

请注意,当今GCC指的是GNU编译器集合,而不仅仅是GNU C编译器。

6.3 gcc子目录

gcc目录包含许多文件,这些文件是GCC的C源代码的一部分,其他文件是配置和生成过程的一部分,以及子目录(包括文档和测试套件)。

参考: https : //gcc.gnu.org/onlinedocs/gccint/gcc-Directory.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.