C 语言是最初的通用编程语言。《命令行英雄》播客第三季的季终集以一种展示其设计的持久性和力量的方式,探索了 C 语言的起源故事。它是整个播客第三季和这个系列文章中讨论的所有语言的完美综合。

C 语言是如此基础的语言,以至于我们很多人都忘记了它发生了多大的变化。从技术上讲,它是一种“高级语言”,因为它需要编译器才能运行,但它尽可能地接近汇编语言(在专业、低内存环境之外)。它也被认为是使几乎所有后来的语言成为可能的语言。
通往 C 语言的道路始于失败
尽管关于所有伟大的发明都来自竞争激烈的车库居民的神话仍然存在,但 C 语言的故事更适合文艺复兴时期。
在 20 世纪 60 年代,新泽西州郊区的贝尔实验室是当时最具创新力的地方之一。《创意工厂》的作者 Jon Gertner 描述了当时的文化,其特点是乐观主义和解决难题的兴奋感。贝尔实验室没有紧迫的时间限制和货币化压力,而是为疯狂的想法提供了看似无穷无尽的资金。它拥有一种与今天的开放领导力原则非常吻合的研发精神。结果是显著的,并证明了即使没有风险投资资金或首次公开募股的承诺,也能产生卓越的成就。
当时的挑战是终端共享:找到一种方法,让很多人可以访问(数量非常有限的)可用计算机。在找到可扩展的解决方案之前,早在我们拥有像 Bash 这样的 shell 之前,就有了 Multics 项目。这是一个假设的操作系统,数百甚至数千名开发人员可以在同一系统上共享时间。正如我最近探讨的那样,这是 Lisp 和人工智能 (AI) 术语的创造者 John McCarty 的梦想。
《美国计算机历史》的作者 Joy Lisi Ranken 描述了接下来发生的事情。公众对推进 Multics 的愿景,即更普遍可用的分时系统,非常感兴趣。学者、科学家、教育家和更广泛的公众中的一些人都在期待这个计算机驱动的未来。许多人主张将计算作为一种公共事业,类似于电力,而推动分时系统是一场全球运动。
到那时为止,高端大型机的终端数量最多为每个系统 40-50 个。规模的变化是雄心勃勃的,最终失败了,正如 Warren Toomey 在 IEEE Spectrum 中写道
“在五年多的时间里,AT&T 在 Multics 项目上投入了数百万美元,购买了一台 GE-645 大型计算机,并将公司著名的贝尔电话实验室的许多顶级研究人员投入到这项工作中——包括 Thompson 和 Ritchie、Joseph F. Ossanna、Stuart Feldman、M. Douglas McIlroy 以及已故的 Robert Morris。但是,新系统过于雄心勃勃,并且进度严重落后。最终,AT&T 的公司领导决定终止该项目。”
贝尔实验室于 1969 年退出了 Multics 计划。Multics 不会发生了。
C 语言的伙伴关系
资金结束了,强大的 GE645 大型机被分配到贝尔实验室内部的其他任务。但这并没有让所有人气馁。
Multics 项目的最后几个坚守者是四位对该项目充满热情的人:Ken Thompson、Dennis Ritchie、Doug McIlroy 和 J.F. Ossanna。这四位死忠仍然在纸上思考和涂写想法。Thompson 和 Ritchie 为 PDP-7 小型计算机开发了一款名为《太空旅行》的游戏。当他们致力于此游戏时,Thompson 开始实现他们从 Multics 残骸中开发的所有疯狂的手写文件系统想法。

这值得强调:一些原始文件系统规范是手写的,然后在实际上只是一个玩具的系统上编程的,而他们过去使用的系统是构建 Multics 的系统。维基百科的 Ken Thompson 页面更深入地探讨了接下来发生的事情
“在编写 Multics 时,Thompson 创建了 Bon 编程语言。他还创建了一个名为《太空旅行》的视频游戏。后来,贝尔实验室退出了 MULTICS 项目。为了继续玩这个游戏,Thompson 找到了一台旧的 PDP-7 机器,并在其上重写了《太空旅行》。最终,Thompson 开发的工具变成了 Unix 操作系统:在一个 PDP-7 上工作,一个由 Thompson 和 Ritchie 领导的贝尔实验室研究团队,包括 Rudd Canaday,开发了一个分层文件系统,计算机进程和设备文件的概念,一个命令行解释器,用于轻松的进程间通信的管道,以及一些小型实用程序。1970 年,Brian Kernighan 建议将名称命名为“Unix”,以与“Multics”名称开玩笑。在 Unix 的初步工作之后,Thompson 认为 Unix 需要一种系统编程语言,并创建了 B,它是 Ritchie 的 C 的前身。”
正如 Walter Toomey 在上面提到的 IEEE Spectrum 文章中记录的那样,Unix 以 Multics 项目从未实现的方式显示出了希望。在赢得团队的支持并完成更多编程之后,通往 Unix 的道路铺平了。
从 Unix 中的 B 到 C
Thompson 很快创建了一种他称为 B 的 Unix 语言。B 从其前身 BCPL 继承了很多,但它与旧语言的决裂还不够。例如,B 不知道数据类型。它被认为是一种无类型语言,这意味着它的“Hello World”程序看起来像这样
main( ) {
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';
即使你不是程序员,也很明显,每次分割四个字符的字符串是有限制的。还值得注意的是,这段文本被认为是 Brian Kernighan 1972 年出版的著作《B 语言教程》中的原始“Hello World”(尽管这种说法并非最终定论)。

除了无类型之外,B 的汇编语言对应物仍然产生比使用 B 编译器线程代码技术可能实现的更快的程序。因此,从 1971 年到 1973 年,Ritchie 修改了 B。他添加了一个“字符类型”并构建了一个新的编译器,这样它就不必再使用线程代码了。经过两年的工作,B 变成了 C。
在正确的时间进行正确的抽象
C 语言对类型的使用和易于编译为高效汇编代码的特性使其成为小型计算机兴起的完美语言,小型计算机以字节码进行通信。B 语言最终被 C 语言超越。一旦 C 语言成为 Unix 的语言,它就成为新兴计算机行业的实际标准。Unix 是互联网时代之前的共享平台。编写 C 语言的人越多,它就变得越好,采用它的人也就越多。它最终成为了开放标准本身。根据C 编程语言简史
“多年来,C 语言的实际标准是 Unix 操作系统提供的版本。1983 年夏天,成立了一个委员会来制定 ANSI(美国国家标准协会)标准,该标准将定义 C 语言。标准化过程花费了六年时间(比任何人的合理预期都长得多)。”
如今 C 语言的影响力有多大?快速回顾揭示了
- 所有主要操作系统的部分内容都是用 C 语言编写的,包括 macOS、Windows、Linux 和 Android。
- 世界上最多产的数据库,包括 DB2、MySQL、MS SQL 和 PostgreSQL,都是用 C 语言编写的。
- 许多编程语言的特性都始于 C 语言,包括 Python、Go、Perl 的核心解释器和 R 统计语言。
在他们作为衣衫褴褛的局外人开始几十年后,Thompson 和 Ritchie 被誉为编程世界的巨擘。他们分享了 1983 年的图灵奖,并于 1998 年获得了国家科学奖章,以表彰他们在 C 语言和 Unix 方面的工作。

但 Doug McIlroy 和 J.F. Ossanna 也值得赞扬。他们四位都是真正的命令行英雄。
本季总结
命令行英雄已经完成了一个完整季度的节目,深入了解了影响我们今天编码方式的编程语言。很高兴了解这些语言并与您分享。我希望您也喜欢!
4 条评论