这个问题可能源于我对编译器的误解,但这里要说的是……

你可以在《K&R(第十一页):

操作系统the C compiler,以及基本上所有UNIX应用程序(包括用于编写本书的所有软件)都是用C编写的.

(我要强调的是)

我不明白的是:C编译器在编译任何C代码之前不需要自己编译吗?如果C编译器是用C编写的,那么编译它不需要已经存在的C编译器吗?!

解决这个无限回归难题(或鸡和蛋的问题)的唯一方法是使用C编写的C编译器;R实际上是用一个已经存在的C编译器编译的,该编译器是用C以外的语言编写的.然后,用C编写的C编译器取代了后者.

还是说我完全疯了?

推荐答案

它的名字叫Bootstrapping,引用了维基百科的话:

如果需要一个X语言的编译器来获得X语言的编译器(用X语言编写),那么第一个编译器是如何编写的?解决这一鸡或蛋问题的可能方法包括:

  1. 用Language实现X语言的解释器或编译器 Y.Niklaus Wirth报告说,他用Wirth编写了第一个Pascal编译器 Fortran语言.
  2. X的另一个解释器或编译器已经用 另一种语言Y;这就是Scheme经常被 bootstrap 的方式.
  3. 早期版本的编译器是在X的子集中编写的
  4. X的编译器是从另一个体系 struct 交叉编译的,其中
  5. 用X编写编译器;然后从源代码手工编译(大多数 很可能是以非优化的方式),并在代码上运行该命令以获取 一个优化的编译器.Donald Knuth在他的网络通中使用了这一点 编程系统.

如果您感兴趣,here是Dennis Richie的第一个C编译器源代码.

C++相关问答推荐

如何用C(使用两个s补数算术的32位程序)计算

带双指针的2D数组

了解一些CLIPS原语数据类型

在32位处理器上优化53—32位模计算>

如何判断宏参数是否为C语言中的整型文字

在函数中使用复合文字来初始化C语言中的变量

为什么在C中二维字符数组会有这样的行为?

如何一次获取一个字符

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

对于C中给定数组中的每个查询,如何正确编码以输出给定索引范围(1到N)中所有数字的总和?

如何在C++中处理按键

C代码在字符串中删除不区分大小写的子字符串的问题

Tic-tac-toe:从文件加载存储

使用%f格式说明符打印整数值

C语言中MPI发送接收字符串时出现的分段错误

unions 的原子成员是个好主意吗?

如何在Rust中处理C的longjmp情况?

为什么孤儿进程在 Linux 中没有被 PID 1 采用,就像我读过的一本书中声称的那样?

Struct 内的数组赋值

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