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

105

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


14
是的,大部分是这样的。当然,编译C需要一个C编译器,因此与大多数编译器一样,有一系列“引导程序”阶段。这个基本的想法在安装GCC:构建安装GCC-LFS中有介绍。 - user166390
2
20世纪80年代和90年代初,不同品牌的工作站都有自己的类Unix环境,包括C编译器、工具等,它们之间都有一些微小的差异。使用GCC源代码,您可以在其中一个平台上进行初始GCC编译,然后将GCC编译几次以更多或更少地检查固定点。 - Paul
4个回答

118
具体有关gcc的历史可以在GCC Wiki上找到。更一般的观点是,编译器通常最初是用其他编译器编译的,直到它们足够强大,能够编译自身。或者,您可以编写一个基本编译器,在汇编语言中处理部分功能,并从那里构建。但是,这几乎再也不需要了。有很多编译器可供选择,涵盖各种语言。即使Stephen Johnson正在编写pcc(C编译器之一),也有可用的B编译器以及许多其他语言的编译器。gcc最初有几个编译器可供选择进行构建,RMS至少在他最初的开发过程中使用Pastel编译器。
记住,一个C编译器并没有要求必须用C语言编写。如果你想,你可以用Perl编写它。对于给定平台的编译器,并没有要求必须在该平台上最初编写(嵌入式系统几乎总是在其他系统上编译)。因此,有很多方法可以启动自己。
这个问题涉及到与编译器第一次引导有关的一些有趣的微妙之处。如果你非常聪明,你可以利用这种引导来做一些令人难以置信、聪明和可怕的事情。具体内容可以看这里

1
哇,你链接的第二篇文章真是太聪明了。 - Ponkadoodle
1
感谢提供这个很棒的引导链接。我一直以为编译器总是用更简单的语言编写,一直到机器码,有点类似于这个原因。(例如,如果你发现编译器的二进制文件包含错误怎么办?当然,这提供了一个更强有力的例子。)那么,使用自己的语言编写编译器有什么优势呢?极度偏执的人会担心这一点,并且不使用“自我”引导来构建他们的编译器吗? - RoG
4
一些语言组认为能够自己编写编译器是一种荣誉标志。 Go 最近在这方面大力推进。另一方面,值得注意的是 Swift 目前没有重写其编译器为 Swift 的计划。然而请注意,GCC 总是用 C 写成的,只是用其他编译器编译而已。但如果所有的 C 编译器都是用 BCPL 编写的,这并不能解决任何关于偏执的问题,只是将问题向后移了一步。(使用 clang 编译 GCC 将获得相同的偏执好处)。 - Rob Napier
请注意,gcc有一个政策,即gcc主要版本X始终可以使用gcc主要版本X-1进行编译,因此在X中添加到编译器的任何新功能只能从X+1中在gcc源代码本身中使用。例如,您应该能够使用任何gcc版本9(无论小版本号是什么)与任何gcc 8编译,同样无论小版本号是什么。 - Baruch
2
此外,如果您想要真正、可证明地解决偏执问题,您必须找到底层turtle - thariqfahry

57

最初它是用某种汇编语言编写的,然后开始自我实践。


3
我没有看到任何关于RMS在最初的引导程序中使用汇编语言的参考文献。你的信息来源是什么?他有其他几个编译器可以用来引导,所以那似乎是很多工作。 - Rob Napier
24
我认为该术语为“自举”。 - Martin York
8
哈哈哈,我几周前读到这段话时,认为你使用的表达非常奇怪,没想到原来是一种标准用语。干得好,先生!https://en.wikipedia.org/wiki/Eating_your_own_dog_food - user2918461

4

虽然这只是一个非常粗略的指标,但我发现快速列出 gcc-5.1.0-src/gcc/ 目录对于GCC本身的主要源代码(除了运行时库)是有趣的。

以下是按扩展名分组的文件计数前 一百个 文件,以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

请注意,即使是GCC中的.c文件也包含了C++代码,这是因为开发人员在迁移到C++时没有重命名该文件。 - phuclv

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接