第一个 C 编译器是用 C 本身编写的,对吗?那么,它是如何执行和编译的呢?或者,这个编译器是用汇编语言编写的吗?
3 回答
Dennis Ritchie在 C 语言历史的文章中对它进行了很好的描述。
仅对他在那里写的内容进行摘要,请使用他的文章了解更详细的信息。C 从 BCPL 语言开始,Ken Thomson 可以使用在通用电气 635 主机上运行的编译器。对语言不满意,汤姆森使用 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 语法早几年。丹尼斯对其中一盘磁带的描述表明它是被引导的结构的定格:
“prestruct-c”是我开始更改它以使用结构本身之前编译器的副本。
换句话说,编译器已被扩充以支持结构,但尚未使用它们。进行磁带备份的好时机...