第一个 C 编译器是如何编写的?

问题描述 投票:0回答:3

第一个 C 编译器真的是用 C 本身编写的吗?那么,它是如何执行和编译的呢?或者,这个编译器是用汇编语言编写的吗?

c assembly compiler-construction
3个回答
105
投票

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 小型计算机在该步骤中发挥了重要作用,为他们提供了足够的空间来改进语言和编译器。


32
投票

第一个 C 编译器不是用 C 编写的,通常在编写编译器时我们使用汇编语言或其他编程语言,并且通常在第一次编译后,编译器用其母语重写。

有很多编程语言最初是用 C 编写的,然后用它们的母语重写:例如 Java,Ada ...


9
投票

阅读丹尼斯·里奇 (Dennis Ritchie) 关于 primevalC 的注释表明,就像先有鸡还是先有蛋一样,C 通过自举从前身语言及其自己的编译器演变而来。物种形成的时间尺度比 Gallus gallus domesticus 更快。

甚至可以看到陷入进化混乱之中的编译器源代码。该注释链接到从磁带备份中恢复的两个快照。这段代码也已放在github上。这些快照构成了中间化石,比K&R语法早了很多年。 Dennis 对其中一盘磁带的描述表明它是正在引导的结构的定格:

“prestruct-c”是我开始更改之前的编译器副本 它使用结构本身。

换句话说,编译器已经增强到支持结构,但还没有使用它们。做磁带备份的好时机...

© www.soinside.com 2019 - 2024. All rights reserved.