
本期节目来介绍一本书:Unix: A History and a Memoir(PDF 下载地址,访问码:emacstalk),作者是贝尔实验室的计算机科学家 Brian W. Kernighan,他是 Unix 的联合创始人之一,也是 C 语言、AWK 的主要开发者之一。书中详细回顾了 Unix 的发展历程、设计理念和对计算机科学的影响。
比较特别的是,本期节目没有嘉宾,是由西瓜和 NotebookLM 协同完成!NotebookLM 是一个基于 LLM 的笔记应用,支持 Markdown 和 LaTeX 语法,具有强大的搜索和组织功能。它可以帮助你更高效地管理和利用你的知识,建议大家都去试试。
如果你对以后的节目有任何建议或者想法,欢迎给我留言,让我们一起把节目做得更好!
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。
Unix 文件系统的一个核心特点是其层次结构,以一个根目录 / 为起点,形成树状结构。目录本身也被视为文件,其内容由系统维护,包含关于文件和子目录的信息。每个目录都有特殊的条目: "." 指代自身,".." 指代父目录。这种结构使得通过从根目录开始的路径名(例如 /usr/bwk/book/book.txt)可以轻松访问任何文件。文件系统还支持当前目录的概念,允许使用相对路径。
Unix 的另一个重要创新是将外围设备(如磁盘、终端等)表示为文件系统中的文件。这意味着可以使用与访问普通文件相同的系统调用(如 open, read, write, close)来访问这些设备,极大地简化了编程。此外,文件权限控制机制也相对简单但有效,使用 9 个比特位分别控制文件所有者、所属组和其他用户的读、写、执行权限,后来还引入了 setuid 位以允许普通用户以文件所有者的权限执行程序。
Shell 是 Unix 系统中用户与操作系统交互的主要接口。它是一个普通的用户程序,负责解释用户输入的命令并执行相应的程序。用户通过 shell 输入命令,shell 执行这些命令并在完成后等待下一个输入。Shell 并非操作系统内核的组成部分,这使得用户可以根据需要选择或编写不同的 shell 程序,提供了极大的灵活性。
Shell 的一个重要功能是支持 I/O 重定向和管道(pipes)。I/O 重定向允许将命令的输入或输出连接到文件,而管道(用 | 字符表示)则允许将一个命令的输出直接作为另一个命令的输入,实现多个程序的串联执行,极大地提高了命令组合的能力。例如, ls | wc 命令将 ls 命令的输出(每行一个文件)传递给 wc 命令进行行数统计,从而计算目录中的文件数量。
C 语言与 Unix 系统有着紧密的联系,两者可以说是共同演进、互相成就。在 PDP-11 计算机上开发 Unix 时,由于之前的 B 语言不适合字节寻址的 PDP-11,Dennis Ritchie 开始改进 B 语言并为其编写编译器,最终诞生了 C 语言(最初称为 NB,New B)。
C 语言支持与 PDP-11 硬件数据类型相匹配的数据类型(如字节、整数、浮点数),并提供了强大的指针操作能力,这使得它非常适合用于系统级编程,包括编写操作系统本身。Unix 的大部分代码都用 C 语言编写,而 C 语言的许多特性也受到 Unix 开发经验的影响。两者共同构成了 Unix 系统及其开发环境的基础。
Yacc (Yet Another Compiler-Compiler)、Lex (Lexical Analyzer generator) 和 Make 是 Unix 环境中重要的开发工具,它们都遵循模式-动作(pattern-action)范式,用于简化程序开发过程。
这些工具通过自动化语言处理和构建过程中的重复任务,为 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)的出现,摆脱了商业限制,并在开源社区的推动下获得了巨大的成功,成为现代计算基础设施的重要组成部分。
Unix 的技术遗产是巨大的,它引入了许多至今仍然影响着计算机科学和软件工程的概念和实践:
这些技术遗产不仅体现在 Unix 的各种后代系统(如 Linux, macOS, BSD 等)中,也 deeply 影响了其他操作系统的设计和软件开发的实践。
关于 Unix 的成功是否可以复制,这是一个复杂的问题。书中提到,伟大的想法通常来自个人。Ken Thompson 和 Dennis Ritchie 等少数核心开发者的贡献是 Unix 早期成功的关键。他们的技术洞察力和创造力, coupled with 贝尔实验室宽松的研究环境,促成了 Unix 的诞生和早期发展。
然而,复制这种成功是困难的。当今的软件开发环境更加复杂,竞争激烈。但书的作者仍然对未来持乐观态度,认为伟大的想法仍将来自个人。关于未来的技术发展趋势,虽然书中没有给出明确预测,但可以 inferred 的是,对简单、强大工具的需求仍然存在,模式-动作范式和领域特定语言(little languages)等思想可能在新的应用领域继续发挥作用。同时,开源社区在推动软件发展方面的重要性也日益凸显,这与 Unix 早期在大学和用户群体中的传播模式有相似之处。
