# 为什么是 Unix

让我们暂停一下，回顾这六年的实验，思考为什么 Unix 能如此受国际学术界的欢迎。Unix 究竟有什么东西让这么多人喜欢？

在 CACM 论文的开头，Ritchie 和 Thompson 列出了系统提供的六个特性：

> * (i) 包含可拆卸卷的层次文件系统，
> * (ii) 兼容的文件、设备和进程间输入输出，
> * (iii) 启动异步进程的能力，
> * (iv) 可按用户选择的系统命令语言，
> * (v) 一百多款子系统，包括十几种语言，
> * (vi) 高度的可移植性。

让我列举一些我喜欢的 Unix 特点：

* 可在多种平台上使用
* 多用户支持
* 提供目录层次结构
* 合理共享计算机资源
* 支持文件、进程和程序的操作
* 支持进程间及机器间通信
* 能访问其操作功能

Rudd Canaday 简单地说过：“Unix 在贝尔实验室传播开来，是因为人们喜欢使用它。”最近，Armando Stettner 说：“它不会妨碍自己，也不会妨碍我。”

在 1976 年和 1977 年，Tom Lyon 使得 Unix 的部分功能能够在普林斯顿大学的一台 IBM 360 上运行的 VM/360 系统下运行。1977 年和 1978 年期间，Ritchie 和 Steve Johnson 将 Unix 移植到 Interdata 8/32，同时 Richard Miller 和他的同事们也将 Unix 移植到澳大利亚卧龙岗大学的 Interdata 7/32。Ritchie 曾说，将 Unix 移植到 Interdata 是他最引以为豪的编程工作之一。它证明了 Unix 确实可以被移植到一台非 DEC 生产的机器上。对此我稍后会回到。

简单地说 Unix 有这个功能或那个功能，或者它可以运行在一个某个部门（而非计算中心）负担得起的机器上，是太表面化了。让我来讲讲 Mike O'Dell 的回忆，他现在是 UUNET Technologies 的副总裁，回忆的是 1974 年夏天。当时，O'Dell 还是俄克拉荷马大学的本科生。

> 当著名的 1974 年 ACM 通讯期刊发布时，我正在俄克拉荷马大学计算机中心工作。我们有一个叫 ITF（间歇终端设施）的东西，它拥有世界上最烂的 BASIC 实现，其中一个人写了一些例程，能让你在终端上进行输入输出——这是一个不小的成就。所以我们一群人坐下来，试图弄清楚是否能做些有趣的事，比如用 IBM 2741 终端作为打孔机来编辑。这样你就可以编辑作业并提交，诸如此类。我当时正全身心投入这件事——我记得我的黑板上满是数据结构，因为我们把所有东西都建进了文件里，因为我们当时还不知道更好的方法。
>
> 那期关于 Unix 的期刊来了。我记得走在走廊上，从我的信箱里拿出它，心里想着：“哦，ACM 出了一些关于操作系统的东西，或许值得一读。”（那期是“第四届 ACM 操作系统原理研讨会论文集”）。我开始翻阅那期杂志，里面确实还有一些其他不错的论文。但我记得自己坐下来通读了那篇关于 Unix 分时系统的论文。那感觉就像是被石头猛击了一下脑袋。我又读了一遍。然后我站起来，走出办公室，转过拐角去找乔治·梅布里，他是我们当中参与那件事的另一个人。我把那期杂志甩在他桌子上，说：“怎么会有这么多人，这么久以来都错得这么离谱？”
>
> 他问我：“你在说什么？”
>
> 我说：“你读读这个，然后试着告诉我我们一直在干的事不荒唐。我们简直疯了。这才是我们真正想要的。”就在那一刻，我下定决心，无论如何我们都得搞到一个这样的系统。

事实上，O'Dell 之所以对此着迷，其中一个原因是，在俄克拉荷马大学电气工程实验室的一个角落里，有一台 PDP-9，这是一台与 PDP-7 关系密切的机器。O'Dell 读到 Ritchie 和 Thompson 最初是在 PDP-7 上完成他们工作的消息后，便开始思考是否可以在 PDP-9 上运行这个神奇的系统。O'Dell 告诉我：

> 我说我们没有 PDP-11，但我们有一台 PDP-9，能不能搞到 PDP-7 的版本然后移植一下？Dennis 说他觉得那不是个好主意（在那时候，他们可能已经觉得电话那头是个疯小子了）。但他们态度非常友好，所以我备受鼓舞。我下定决心，我们一定得搞到这样一台机器。
>
> 于是我就这么一边天真一边厚脸皮，打电话联系了 DEC 在塔尔萨的销售办公室——俄克拉荷马城还没有销售处——请求和某位负责 PDP-11 的人谈谈。我联系上了一个叫 Stan Bartel 的家伙，他是销售员。
>
> Stan 是那种脚踏实地的人，他明白自己从来没能把一台迷你计算机卖进 OU——“蓝色死神”对一切掌控太严了——但他也知道让计算中心有个狂热分子也许不失为一个机会。而那时候 DEC 的销售员拿的是工资不是提成，所以对他来说没什么损失（现在他们也还是不拿提成）。正好他过几周要来我们这边出差，就中午顺便过来，带了一整摞手册来：处理器手册和外设手册。我从未见过这种文档。于是我通读了这些手册——我那时是个相当不错的程序员——读完指令集后我说：“这些家伙真懂行，这真是太酷了。”从那时开始，一切就这样开始了，我彻底入坑了。

正如我先前提到的，《C 程序设计语言》直到 1978 年才出版。那时候，身在俄克拉荷马州这类“边缘地带”的人该怎么办？我还是让 O'Dell 来讲述吧，因为他的经历与 1974 到 1978 年间许多其他人的故事非常相似。

> 我初次接触 C 语言，其实是通过伊利诺伊大学。Steve Bunch 从 OU 转到了 UIUC（伊利诺伊大学厄本那 - 香槟分校）。我们去那儿朝圣了一趟，也见识了 Unix……Steve Bunch、Steve Holmgren 和 Mike Mullen……就是那批把 Unix 接入 ARPANET 的人。总之，Steve（Bunch）给我寄了一份智能终端内核的清单，内容包括上下文切换器、控制信号量的键值代码、进程间通信机制，以及一两个其他片段。总共大概五六张纸。他还在边上写了点注释，因为我从来没见过这种编程语言，他解释了像“++”这种奇怪的操作符是干什么的。他说：“你看看能不能搞懂这些东西是怎么工作的。”我记得那个上下文切换器大概只有六行汇编代码，他把它寄给我，基本上就是想看看我能不能弄懂。而我确实搞懂了。
>
> 后来，我想更深入了解这些东西，于是他给我做了一卷 tp 磁带——那是 tar 诞生之前的事——用的是旧的 tp 格式的磁带，里面是以 nroff 输出形式保存的 man 手册页。他把这卷磁带寄给我，还说：“这里面有些有趣的东西，如果你能搞清楚怎么把它打印出来的话。”他还把真正的 tp 的 man 手册页也寄给我了。
>
> 于是我坐下来，基本上用了一个长周末，写了一款……程序来解析那个格式，正确显示下划线，并打印出 Unix 的 man 手册页。那就是我第一次接触的 man 手册页。我估计现在某个箱子里还留着它们，因为我从未像这么努力地去获取过什么东西。
>
> 然后我们开始传阅这些 man 手册页：虽然我们拿不到系统，但我们能看到它的功能。就是在那个时候，我真正被吸引住了。

自学。自己弄明白。你觉得它应该怎么工作？Mike 并不是孤单一人。RAND 编辑器的创造者之一 Dave Yost 告诉我他是如何看一段代码的（在七十年代中期）：

> 于是我坐下来仔细看，看到那些花括号 `[{` 和 `}]`，我心想，“哇！”

在 C 语言中，`{` 和 `}` 包围构成函数的语句块。C 语言没有 PL/I 的 DO-END，也没有 Algol 或 Pascal 的 begin-end。在很多方面它是一种更简单的语言，更像一种自然语言（比如英语）。它并不是一种“非常高级的语言”。正如 Thompson 和 Ritchie 所说：“C 语言是一种通用编程语言，具有表达简洁、现代的控制流和数据结构，以及丰富的运算符集合……根据我们的经验，C 语言被证明是一种愉快、富有表现力且多才多艺的语言……”根据我的经验，C 语言也适合写出风格优雅的程序。

USENIX 技术会议上，他谈到了“简单、连贯且强大的计算模型”；“工具箱的隐喻”；以及可移植性。

其中第一个和最后一个尤为重要：Unix 和 C 语言在多个平台上的可用性以及其优雅性，是系统流行的重要原因。风格和工具则是系统的其他重要组成部分。
