017. UNIX:一段历史与回忆 - podcast episode cover

017. UNIX:一段历史与回忆

May 21, 2025
--:--
--:--
Download Metacast podcast app
Listen to this episode in Metacast mobile app
Don't just listen to podcasts. Learn from them with transcripts, summaries, and chapters for every episode. Skim, search, and bookmark insights. Learn more

Episode description

欢迎听众打赏支持,您的支持是我不断创作的动力🍻

本期节目来介绍一本书: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: 与作者合作编写了实现页面垂直对齐的程序。
收听方式 反馈 ✉️
For the best experience, listen in Metacast app for iOS or Android