C 的巨大影响

《命令行英雄》季终集讲述了一个关于小型开源爱好者社区如何改变世界的故事。
405 位读者喜欢这篇文章。
In the finale of Command Line Heroes, we learn about the significant impact of C

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

The original C programming guide by two of the language authors, circa 1978

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 残骸中开发的所有关于文件系统的疯狂手写想法。

A PDP-7 minicomputer

这值得强调:一些原始文件系统规范是手写的,然后在实际上相当于玩具的系统上编程的,与他们用来构建 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”(尽管这种说法并非最终定论)。

A diagram showing the key Unix and Unix-like operating systems

除了无类型性之外,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 方面的工作。

Ritchie and Thompson receiving the National Medal of Technology from President Clinton, 1998

但是 Doug McIlroy 和 J.F. Ossanna 也应该得到他们的赞扬。他们四个人都是真正的命令行英雄。

本季总结

命令行英雄已经完成了一整个季的关于影响我们今天编码方式的编程语言的见解。很高兴了解这些语言并与您分享。我希望你也喜欢!

接下来阅读什么
I'm happiest at a microphone
Matt 曾是 EMC 存储专家、VMware vExpert 以及其他专有技术的爱好者。他现在专注于开源和 DevRel 采用。

4 条评论

很棒的文章!而且,我有那本书! :)

我认为称这些人为“开源爱好者”有点牵强,因为当时这个概念还不存在。那时,人们做有趣的事情并自由分享,因为这是取得进展的最快方法。没有这种将每一个新想法都货币化的心态。

您提到 Python(第一个实现)、Perl 等是用 C 语言编写的。但您没有提到许多现代语言的语法或多或少都基于 C 语言,包括 C++、Java、JavaScript、C#、Kotlin、Dart 等。

您说的 python 的“第一个实现”是什么意思?

回复 作者 Ian Darwin (未验证)

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.