第一个 C 编译器真的是用 C 本身编写的吗?那么,它是如何执行和编译的呢?或者,这个编译器是用汇编语言编写的吗?
在 Dennis Ritchie 的 C 语言历史的文章 中描述得非常好。
仅给出他在那里所写内容的摘要,使用他的文章了解更详细的信息。 C 从 BCPL 语言开始,Ken Thomson 可以访问它的编译器,该编译器运行在他们的 General Electrics 635 主机上。由于对该语言不满意,Thomson 使用 BCPL 为 B 语言编写了一个编译器,这是超越 BCPL 的进化步骤,消除了 BCPL 中的一些技术问题。
他们用 B 在他们的 PDP-7 小型计算机上创建程序,虽然大多数只是玩具程序,但机器的硬件能力非常有限。 Thomson 采取的一个重要步骤是在 B 本身中重写 B 编译器。一个常见的引导步骤。
然后通过称为 NB(新 B)的短暂中间步骤逐渐调整该编译器,开始类似于 C。PDP-11 小型计算机在该步骤中发挥了重要作用,为他们提供了足够的空间来改进语言和编译器。
第一个 C 编译器不是用 C 编写的,通常在编写编译器时我们使用汇编语言或其他编程语言,并且通常在第一次编译后,编译器用其母语重写。
有很多编程语言最初是用 C 编写的,然后用它们的母语重写:例如 Java,Ada ...
阅读丹尼斯·里奇 (Dennis Ritchie) 关于 primevalC 的注释表明,就像先有鸡还是先有蛋一样,C 通过自举从前身语言及其自己的编译器演变而来。物种形成的时间尺度比 Gallus gallus domesticus 更快。
甚至可以看到陷入进化混乱之中的编译器源代码。该注释链接到从磁带备份中恢复的两个快照。这段代码也已放在github上。这些快照构成了中间化石,比K&R语法早了很多年。 Dennis 对其中一盘磁带的描述表明它是正在引导的结构的定格:
“prestruct-c”是我开始更改之前的编译器副本 它使用结构本身。
换句话说,编译器已经增强到支持结构,但还没有使用它们。做磁带备份的好时机...