如何用 C 语言编写 C 编译器? [复制]

2024-04-02

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

在《K&R》第一版的序言(第 xi 页)中可以找到以下陈述:

操作系统,C编译器,并且基本上所有 UNIX 应用程序(包括编写本书所使用的所有软件)都是用 C 编写的。

(我的重点)

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

解决这个无限回归难题(或先有鸡还是先有蛋的问题)的唯一方法是,K&R 所指的用 C 语言编写的 C 编译器实际上是使用现有的 C 编译器(该编译器是用 C 以外的语言编写的)进行编译的。 .然后用C编写的C编译器取代了后者。

还是我彻底没了?


它被称为自举 http://en.wikipedia.org/wiki/Bootstrapping_%28compilers%29,引用维基百科:

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

  1. 在语言中实现 X 语言的解释器或编译器 Y. Niklaus Wirth 报告称,他于 2017 年编写了第一个 Pascal 编译器。 福特兰语言。
  2. X 的另一个解释器或编译器已经编写在 另一种语言 Y;这就是Scheme通常被引导的方式。
  3. 早期版本的编译器是用 X 的子集编写的 存在其他一些编译器;这就是一些超级组的方式 Java、Haskell 和最初的 Free Pascal 编译器的 自举。
  4. X 的编译器是从另一个架构交叉编译的,其中 存在 X 的编译器;这就是 C 编译器的方式 通常移植到其他平台。这也是用于 初始引导后释放 Pascal。
  5. 用X编写编译器;然后从源代码手动编译它(大多数 可能以非优化的方式)并在代码上运行它以获得 优化的编译器。 Donald Knuth 将其用于他的 WEB 读写能力 编程系统。

如果你有兴趣,here https://github.com/mortdeus/legacy-cc是 Dennis Richie 的第一个 C 编译器源代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用 C 语言编写 C 编译器? [复制] 的相关文章