017. UNIX:一段历史与回忆
文章目录
欢迎听众打赏支持,您的支持是我不断创作的动力🍻

本期节目来介绍一本书:Unix: A History and a Memoir(PDF 下载地址,访问码:emacstalk),作者是贝尔实验室的计算机科学家 Brian W. Kernighan,他是 Unix 的联合创始人之一,也是 C 语言、AWK 的主要开发者之一。书中详细回顾了 Unix 的发展历程、设计理念和对计算机科学的影响。
比较特别的是,本期节目没有嘉宾,是由西瓜和 NotebookLM 协同完成!NotebookLM 是一个基于 LLM 的笔记应用,支持 Markdown 和 LaTeX 语法,具有强大的搜索和组织功能。它可以帮助你更高效地管理和利用你的知识,建议大家都去试试。
如果你对以后的节目有任何建议或者想法,欢迎给我留言,让我们一起把节目做得更好!
时间线
- 02:15 生成播客节目:探索UNIX历史的奇妙之旅
- 04:16 软件开发的演变:从 Multics 到 UNIX 的故事
- 06:19 软件开发过程中的挑战与经验教训:重写项目的利与弊
- 08:22 如何减少失败率?探讨重生计划前阅读UNIX历史的重要性
- 10:24 深入探索UNIX诞生背后的秘密武器:贝尔实验室的创新之道
- 12:24 探索与创新的天堂:贝尔实验室与UNIX的诞生
- 14:25 成功的秘诀:自由探索的氛围、密切的合作和知识分享
- 16:26 从PDP到UNIX:一个被低估的操作系统的诞生历程
- 18:26 追寻历史的足迹:贝尔实验室与UNIX的诞生
1. Unix 是如何诞生的,最初的目的是什么?
Unix 的诞生源于贝尔实验室的一个小团队,最初由 Ken Thompson 和 Dennis Ritchie 等人开发。它的起源可以追溯到 Multics 项目,当贝尔实验室退出 Multics 后,Thompson 在一台 PDP-7 计算机上开始了 Unix 的原型开发。最初,这个系统是为了给一个文件系统实现提供测试平台,以便于加载数据进行吞吐量等方面的测试。Ken Thompson 在他的伴侣 Bonnie 回娘家期间,意识到他距离一个分时系统只差一个 exec 调用、一个 shell、一个编辑器和一个汇编器,并决定用三个星期的时间完成它们。因此,最初的 Unix 系统是一个单用户系统,随后才扩展为多用户。名称“Unix”源于对“Multics”的戏称,“UNICS”(UNiplexed Information and Computing Service),最终演变为 Unix。
2. Unix 文件系统有何特点和创新之处?
Unix 文件系统的一个核心特点是其层次结构,以一个根目录 /
为起点,形成树状结构。目录本身也被视为文件,其内容由系统维护,包含关于文件和子目录的信息。每个目录都有特殊的条目: "." 指代自身,".." 指代父目录。这种结构使得通过从根目录开始的路径名(例如 /usr/bwk/book/book.txt)可以轻松访问任何文件。文件系统还支持当前目录的概念,允许使用相对路径。
Unix 的另一个重要创新是将外围设备(如磁盘、终端等)表示为文件系统中的文件。这意味着可以使用与访问普通文件相同的系统调用(如 open, read, write, close)来访问这些设备,极大地简化了编程。此外,文件权限控制机制也相对简单但有效,使用 9 个比特位分别控制文件所有者、所属组和其他用户的读、写、执行权限,后来还引入了 setuid 位以允许普通用户以文件所有者的权限执行程序。
3. Shell 在 Unix 系统中扮演什么角色?
Shell 是 Unix 系统中用户与操作系统交互的主要接口。它是一个普通的用户程序,负责解释用户输入的命令并执行相应的程序。用户通过 shell 输入命令,shell 执行这些命令并在完成后等待下一个输入。Shell 并非操作系统内核的组成部分,这使得用户可以根据需要选择或编写不同的 shell 程序,提供了极大的灵活性。
Shell 的一个重要功能是支持 I/O 重定向和管道(pipes)。I/O 重定向允许将命令的输入或输出连接到文件,而管道(用 | 字符表示)则允许将一个命令的输出直接作为另一个命令的输入,实现多个程序的串联执行,极大地提高了命令组合的能力。例如, ls | wc
命令将 ls 命令的输出(每行一个文件)传递给 wc 命令进行行数统计,从而计算目录中的文件数量。
4. C 语言与 Unix 的关系是什么?
C 语言与 Unix 系统有着紧密的联系,两者可以说是共同演进、互相成就。在 PDP-11 计算机上开发 Unix 时,由于之前的 B 语言不适合字节寻址的 PDP-11,Dennis Ritchie 开始改进 B 语言并为其编写编译器,最终诞生了 C 语言(最初称为 NB,New B)。
C 语言支持与 PDP-11 硬件数据类型相匹配的数据类型(如字节、整数、浮点数),并提供了强大的指针操作能力,这使得它非常适合用于系统级编程,包括编写操作系统本身。Unix 的大部分代码都用 C 语言编写,而 C 语言的许多特性也受到 Unix 开发经验的影响。两者共同构成了 Unix 系统及其开发环境的基础。
5. Yacc、Lex 和 Make 这些工具在 Unix 开发中有什么作用?
Yacc (Yet Another Compiler-Compiler)、Lex (Lexical Analyzer generator) 和 Make 是 Unix 环境中重要的开发工具,它们都遵循模式-动作(pattern-action)范式,用于简化程序开发过程。
- Yacc 是一个编译器-编译器,用于根据语言的语法规则生成解析器程序。它接受语言的语法定义和与之相关的语义动作,并生成一个 C 语言程序,该程序能够解析输入并执行对应的语义动作。Yacc 极大地简化了编写编译器和其他需要解析输入语言的程序的过程。
- Lex 是一个词法分析器生成器,与 Yacc 配合使用。它根据正则表达式模式识别输入中的“词法单元”(如保留字、变量名、运算符等),并生成一个 C 语言程序,该程序能够从输入流中提取这些词法单元。
- Make 是一个构建自动化工具,用于管理多文件程序的编译和链接过程。它读取一个描述文件依赖关系的配置文件,根据文件的修改时间确定需要重新编译和链接哪些文件,并只执行必要的步骤,以保证最终程序是最新的。Make 极大地提高了开发效率,特别是在大型项目中。
这些工具通过自动化语言处理和构建过程中的重复任务,为 Unix 开发环境提供了强大的支持,并至今仍在广泛使用。
6. Unix 是如何从一个研究项目走向商业化和广泛应用的?
Unix 最初在贝尔实验室内部使用,用于支持专利申请等工作,后来开始向大学授权(通常是第六版),收费 nominal。由于 AT&T 不提供商业支持,大学用户被迫自行维护和改进系统,这促进了用户群体的形成和 Usenix 等用户组织的出现,分享经验和代码。
大学授权(尤其是加州大学伯克利分校的 BSD 版本)和用户社区的活跃 contributed 到 Unix 的传播和发展。然而,AT&T 后期试图将 Unix 商业化,成立了 USL (Unix System Laboratories) 并发布了 SVR4 等版本。商业化过程带来了商标问题(UNIX™)和“Unix Wars”等争议,不同版本的 Unix 在市场上竞争。
尽管商业化过程中存在波折,Unix 的核心思想和技术(如文件系统、shell、管道、工具集等)影响深远。最终,独立开发的类 Unix 系统(如 Minix 和 Linux)的出现,摆脱了商业限制,并在开源社区的推动下获得了巨大的成功,成为现代计算基础设施的重要组成部分。
7. Unix 的主要技术遗产有哪些?
Unix 的技术遗产是巨大的,它引入了许多至今仍然影响着计算机科学和软件工程的概念和实践:
- 文件系统:简单的层次结构、将设备视为文件以及灵活的权限控制。
- Shell 和命令行工具:强大的命令行接口、I/O 重定向和管道,以及大量功能单一但可以组合使用的工具(如 grep, sed, awk 等),体现了“小工具,大用途”的理念。
- C 语言:一种强大的、适合系统级编程的通用语言,成为后续许多语言的基础。
- 开发工具:Yacc, Lex, Make 等自动化工具,简化了程序开发和构建过程。
- 模式-动作范式:在 grep, sed, awk, Make, Yacc, Lex 等工具中广泛应用,提供了一种强大的数据处理和程序生成方式。
- 可移植性:随着时间的推移,Unix 逐渐实现了跨硬件平台的 portability,打破了硬件锁定。
这些技术遗产不仅体现在 Unix 的各种后代系统(如 Linux, macOS, BSD 等)中,也 deeply 影响了其他操作系统的设计和软件开发的实践。
8. Unix 的成功是否可能被复制,未来技术发展的趋势是什么?
关于 Unix 的成功是否可以复制,这是一个复杂的问题。书中提到,伟大的想法通常来自个人。Ken Thompson 和 Dennis Ritchie 等少数核心开发者的贡献是 Unix 早期成功的关键。他们的技术洞察力和创造力, coupled with 贝尔实验室宽松的研究环境,促成了 Unix 的诞生和早期发展。
然而,复制这种成功是困难的。当今的软件开发环境更加复杂,竞争激烈。但书的作者仍然对未来持乐观态度,认为伟大的想法仍将来自个人。关于未来的技术发展趋势,虽然书中没有给出明确预测,但可以 inferred 的是,对简单、强大工具的需求仍然存在,模式-动作范式和领域特定语言(little languages)等思想可能在新的应用领域继续发挥作用。同时,开源社区在推动软件发展方面的重要性也日益凸显,这与 Unix 早期在大学和用户群体中的传播模式有相似之处。
Unix 开发主要事件时间线
- 1956年: 贝尔实验室的科学家因发明晶体管获得诺贝尔物理学奖。
- 1960年代-1980年代: 贝尔实验室约有3000人。
- 1966年夏天: 作者作为实习生在MIT接触到Jerry Saltzer的Runoff程序,这是一个简单的文本格式化程序。
- 1967年左右: 作者在普林斯顿大学读研期间,第一次见到Stu Feldman,当时Stu是普林斯顿的本科生,同时兼职为贝尔实验室的Multics项目工作。
- 1968年夏天: Richard Hamming获得ACM图灵奖。
- 1969年: Unix起源于一个为了测试磁盘吞吐量的文件系统实现。Ken Thompson意识到它接近一个分时系统,缺少exec调用、shell、编辑器和汇编器。他决定在妻子Bonnie去圣地亚哥探亲期间,用三周时间编写这三个程序。
- 1969年: Multics项目未能实现其目标,贝尔实验室撤回参与。
- 1969年: Peter Neumann在一次午餐时建议Ken Thompson应该把他的单用户系统变成多用户系统,并随口提到了“阉割的Multics”(castrated Multics)的概念,即UNICS。
- 1969年: Daniel Bobrow编写了Tenex操作系统,用于PDP-10。
- 1971年: Unix 第一版发布。
- 1971年: 为了满足专利申请的需求,贝尔实验室批准购买了一台PDP-11。Ken Thompson和Dennis Ritchie迅速将PDP-7上的Unix移植到PDP-11上。
- 1971年: Joe Ossanna编写了Nroff(“new roff”)程序,用于格式化专利申请。
- 1973年: AT&T开始以象征性的费用向大学授权Unix。
- 1973年: Steve Johnson在Al Aho的语言理论帮助下,创建了名为YACC(“yet another compiler-compiler”,后来的Yacc)的编译器生成器。
- 1973年: Grep命令出现。其名称来自“g/re/p”,意为在全球(globally)搜索正则表达式(regular expression)并打印(print)。
- 1974年: Ken Thompson编写了B语言,作为BCPL语言的精简版本,以适应PDP-7的内存限制。
- 1975年: Unix 第六版发布。大多数大学许可证都是针对第六版的。
- 1975年: Michael Lesk创建了名为Lex的词法分析器生成器,与Yacc并行。
- 1976年: Stu Feldman创建了Make程序,用于管理多文件程序的编译依赖关系。
- 1976年: Steve Bourne编写了Bourne shell,整合了PWB shell的功能并进行了增强,使其成为一个功能齐全的可编程脚本语言。
- 1976-1979年: Unix 第七版发布。
- 1979年: Dennis Ritchie因setuid机制获得专利。
- 1980年: Brian Kernighan和Dennis Ritchie出版了《The C Programming Language》一书。
- 1983年: C语言的一个增强版本,由Bjarne Stroustrup开发,获得了C++的名称。
- 1984年: Dennis Ritchie发表了论文《The Evolution of the Unix Time-sharing System》。
- 1986年: Bob Morris从贝尔实验室退休,成为国家安全局(NSA)的首席科学家。
- 1987年: 在阿姆斯特丹自由大学,Andy Tanenbaum创建了Minix,一个与Unix系统调用兼容但完全从头编写的Unix类系统。
- 1989年: Mike Mahoney对Unix进行了口述历史访谈,采访了包括Al Aho在内的人。
- 1991年8月: Linus Torvalds宣布开发一个免费的Unix类操作系统Linux。
- 1992年12月: Ken Thompson和Fred Grampp去莫斯科驾驶MiG-29。
- 1993年: Dennis Ritchie发表了论文《The Development of the C Language》。
- 1998年: Robert T. Morris(Bob Morris的儿子)无意中释放了Morris蠕虫。
- 1999年: Ken Thompson和Dennis Ritchie获得美国国家技术奖章。
- 2000年年底: Ken Thompson和作者从贝尔实验室退休。作者去了普林斯顿,Ken加入了一家由贝尔实验室同事创办的初创公司Entrisphere。
- 2000年: Lucent将其企业通信服务业务分拆成Avaya公司。
- 2001年: Eric Schmidt成为Google的CEO(任期至2011年)。
- 2002年: Lucent将其集成电路业务分拆成Agere公司。
- 2006年: Ken Thompson加入Google,与Rob Pike和Robert Griesemer一起开发了Go语言。
- 2007年: Dennis Ritchie正式从贝尔实验室退休,但直到去世前几乎每天都来实验室。
- 2011年: Ken Thompson和Dennis Ritchie获得日本信息与通信奖。
- 2011年: Dennis Ritchie去世。
- 2011年: Bob Morris去世。
- 2019年: Dennis Ritchie被追授入选美国国家发明家名人堂。
Unix 开发主要人物列表
- Richard Hamming (Dick): 数学科学家,误差纠正码的发明者,数值方法、自动编码系统和误差检测/纠正码领域的先驱。1968年获得ACM图灵奖。对作者的职业生涯有重要影响。
- Ken Thompson: Unix的联合创始人,被认为是Unix的核心人物和最优秀的程序员。开发了B语言,实现了管道机制。曾参与Unix的早期版本开发、PDP-7和PDP-11上的移植。退休后加入Google,参与Go语言的开发。
- Dennis Ritchie (DMR): Unix的联合创始人,C语言的主要开发者。与Ken Thompson共同获得了多项重要奖项。开发了NB语言(后来的C语言)。编写了第一本《The C Programming Language》书的参考手册部分。发明了setuid机制。直到去世前仍在贝尔实验室工作。
- Joe Ossanna: Unix早期开发者之一,是购买第一台PDP-11的计划发起人之一。编写了Nroff程序。创建了Troff文本格式化程序。
- Doug McIlroy: Unix早期开发者之一,提出了Unix哲学中的管道概念。开发了许多重要的Unix命令和工具,如malloc、sort、diff、grep等。对语言设计有深刻见解,并为许多项目的文档提供了重要反馈。
- Steve Bourne: 在1976年编写了Bourne shell,这是一个重要的Unix shell,集成了PWB shell的功能并进行了增强。
- Steve Johnson: 在Al Aho的帮助下,于1973年创建了Yacc(yet another compiler-compiler)。
- Al Aho: 语言理论专家,为Yacc的开发提供了帮助。在Unix口述历史访谈中被提到。
- Jeff Ullman: 启发了Steve Johnson将编译器生成器命名为YACC。
- Michael Lesk: 于1975年创建了Lex,一个与Yacc并行的词法分析器生成器。
- Stu Feldman: 于1976年创建了Make程序,用于管理程序的编译依赖关系。
- Jerry Saltzer: MIT的科学家,开发了Runoff程序,作者的文本格式化程序的早期灵感来源。
- Lorinda Cherry: 与作者合作开发了数学排版语言Eqn。
- Jon Bentley: 与作者合作开发了图形处理程序Grap。
- Bjarne Stroustrup: C++语言的开发者,曾是作者部门的成员,经常与作者和Doug McIlroy讨论语言设计。
- Dave Gay: 在作者之后继续开发AMPL实现,并为Netlib数学软件库做出了贡献。
- Eric Grosse: 开发了半导体建模和模拟、电路分析和可视化算法。为Netlib数学软件库做出了贡献。曾是Google的CEO。
- Bill Coughran: 开发了半导体建模和模拟、电路分析和可视化算法。为Netlib数学软件库做出了贡献。
- Linda Kaufman: 为Netlib数学软件库做出了贡献。
- Fred Grampp: 在Unix安全方面有贡献。曾将一台Enigma密码机带到贝尔实验室,后来留给了Ken Thompson。曾与Ken Thompson一起驾驶MiG-29。
- Bob Morris: Unix安全方面的贡献者,编写了原始的Unix crypt命令。退休后成为NSA的首席科学家。
- Robert T. Morris: Bob Morris的儿子,Morris蠕虫的作者。
- Rob Pike: Unix开发者之一,参与开发了Blit和DMD-5620终端的操作系统,并获得了多窗口专利。开发了Sam等文本编辑器。后来在Google与Ken Thompson和Robert Griesemer一起开发了Go语言。
- Bill Joy: 加州大学伯克利分校的学生,对BSD(Berkeley Software Distribution)做出了重要贡献,包括系统、网络和工具(以及vi编辑器)。后来辍学共同创办了Sun Microsystems。
- Andy Tanenbaum: 在阿姆斯特丹自由大学创建了Minix,一个Unix类系统。
- Linus Torvalds: Linux操作系统的主要开发者和协调者,Git版本控制系统的创建者。
- Robert Griesemer: 在Google与Ken Thompson和Rob Pike一起开发了Go语言。
- Rick Mascitti: 提出了C++这个名字。
- Chris Van Wyk: 与作者合作编写了实现页面垂直对齐的程序。
收听方式

反馈
- 对节目有想法或发现内容错误?欢迎来信交流️