C 编程语言将在 2022 年迎来五十周年。尽管历史悠久,C 仍然是许多“流行编程语言”调查中“最常用”的编程语言之一。例如,查看 TIOBE 指数,它跟踪不同编程语言的受欢迎程度。许多 Linux 应用程序是用 C 语言编写的,例如 GNOME 桌面。
我采访了 Brian Kernighan,《C 编程语言》一书(与 Dennis Ritchie 合著)的合著者,以了解更多关于 C 编程语言及其历史的信息。
C 编程语言从何而来?
C 语言是一系列旨在用于系统编程的语言的演变——也就是说,编写像编译器、汇编器、编辑器以及最终操作系统这样的程序。麻省理工学院的 Multics 项目与贝尔实验室合作,计划用高级语言编写所有内容(在当时这是一个新想法,大约在 1965 年)。他们打算使用 IBM 的 PL/1,但它非常复杂,而且承诺的编译器没有及时到来。
在短暂地尝试了贝尔实验室的 Doug McIlroy 提出的一个名为 EPL 的子集后,Multics 转而使用 BCPL,这是一种更简单、更简洁的语言,由剑桥大学的 Martin Richards 设计和实现,我认为他当时正在麻省理工学院访问。当 Ken Thompson 开始研究后来的 Unix 时,他创建了一种更简单的语言,基于 BCPL,他称之为 B。他在 1969 年为第一个原型 Unix 系统使用的 PDP-7 实现了它。
BCPL 和 B 都是“无类型”语言;也就是说,它们只有一种数据类型,整数。大约在 1971 年出现的 DEC PDP-11,是第一个真正的 Unix 实现的计算机,它支持多种数据类型,特别是 8 位字节以及 16 位整数。为此,一种也支持多种数据类型的语言更合适。这就是 C 的起源。
C 在贝尔实验室和早期版本的 Unix 中是如何使用的?
C 最初只在 Unix 上使用,尽管过了一段时间,也出现了用于其他机器和操作系统的 C 编译器。它主要用于系统编程应用程序,涵盖了相当广泛的有趣领域,以及许多用于管理 AT&T 电话网络运营的系统。
贝尔实验室用 C 编写的最有趣的项目是什么?
可以说,最有趣、最令人难忘和最重要的 C 程序是 Unix 操作系统本身。1971 年的第一个 Unix 版本是用 PDP-11 汇编语言编写的,但到大约 1973 年的第四版时,它被重写为 C。这确实至关重要,因为它意味着操作系统(及其所有支持软件)基本上可以通过重新编译所有内容来移植到不同类型的计算机。实际上并没有那么简单,但相差不远。
您与 Dennis Ritchie 合著了《C 编程语言》一书。这本书是如何诞生的,您和 Dennis 是如何合作编写这本书的?
我写了一个关于 Ken Thompson 的 B 语言的教程,以帮助人们入门。当 C 语言可用时,我将其升级为 C 语言的教程。过了一段时间,我软磨硬泡地让 Dennis 和我一起写一本 C 语言的书。基本上,我写了大部分教程材料,除了系统调用章节,Dennis 已经写好了参考手册,非常出色。然后我们来回修改以使教程部分更加流畅;参考手册基本保持不变,因为它从一开始就做得很好。这本书是用 troff 格式化器(Unix 上的众多工具之一)格式化的,我做了大部分格式化工作。
C 何时成为贝尔实验室以外的其他程序员用于他们的工作的工具?
在这一点上我真的不太记得了,但我认为 C 语言在最初的五六年里主要跟随 Unix 的发展。随着用于其他操作系统的编译器的开发,它开始传播到 Unix 以外的其他系统。我不记得我们何时意识到 C 和 Unix 正在产生真正的影响,但肯定是在 1970 年代中期到后期。
为什么 C 会成为如此有影响力的编程语言?
早期最主要的原因是它与迅速传播的 Unix 相关联。如果你使用 Unix,你就用 C 语言编写代码。后来,C 语言传播到可能不一定运行 Unix 的计算机,尽管许多计算机确实运行 Unix,因为 Steve Johnson 编写了可移植的 C 编译器。太阳微系统公司、MIPS(后来成为 SGI)和其他公司的工作站市场是由 Unix 和 C 的结合实现的。IBM PC 出现得稍晚一些,大约在 1982 年,C 语言成为标准语言之一,在 MS-DOS 和后来的 Windows 下。而今天,大多数物联网 (IoT) 设备都将使用 C 语言。
C 语言在创建 50 年后,今天仍然是一种流行的编程语言。为什么 C 语言仍然如此受欢迎?
我认为 C 语言在效率和表达性方面达到了一个最佳点。在早期,效率非常重要,因为与我们今天使用的相比,计算机速度慢且内存有限。C 语言非常高效,因为它可以编译成高效的机器代码,而且它足够简单,很容易看出如何编译它。与此同时,它非常富有表现力、易于编写且紧凑。至少在我谦虚但正确的观点看来,没有其他语言能如此出色地达到那种程度。
C 编程语言多年来是如何发展或变化的?
我想 C 语言发展得比较温和,但我没有过多关注不断发展的 C 标准。变化足够多,以至于 1980 年代编写的代码在编译之前需要做一些工作,但这主要与诚实地对待类型有关。像复数这样的新功能可能有用,但对我来说没用,所以我无法做出明智的评论。
哪些编程问题最容易用 C 语言解决?
嗯,它是一种适用于任何事情的好语言,但如今,由于拥有大量的内存和处理能力,大多数程序员都可以很好地使用像 Python 这样的语言,这些语言可以处理内存管理和其他更高级的结构。C 语言仍然是较低级别的良好选择,在这些级别中,压缩周期和字节仍然很重要。
C 语言影响了其他编程语言,包括 C++、Java、Go 和 Rust。您对这些其他编程语言有什么看法?
几乎每种语言都在某些方面是对其前辈的反应。为了在很大程度上过度简化,C++ 添加了控制信息访问的机制,因此对于真正的大型程序来说,它比 C 更好。Java 是对 C++ 的感知复杂性的反应。Go 是对 C++ 的复杂性和 Java 的限制的反应。Rust 是一种尝试处理 C(以及可能是 C++)中的内存管理问题,同时接近 C 的效率。
它们都具有真正的积极属性,但不知何故,没有人完全满意,因此总是会有更多的语言,反过来,对之前发生的事情做出反应。与此同时,大多数旧语言将继续存在,因为它们做得很好,并且存在一个嵌入式基础,它们在那里非常好,并且用更新的东西重新实现是不可行的。
感谢 Brian 分享关于 C 编程语言的伟大历史!
您想学习 C 编程吗?从去年这些流行的 C 编程文章开始:2022 年学习 C 编程语言的 5 种方法。
评论已关闭。