Unix 和计算机科学
今年是贝尔实验室于 1969 年发明 Unix 内核 25 周年。以下正在进行中的工作曾于 1993 年夏季在俄亥俄州辛辛那提举行的 Usenix 夏季会议上展示。一篇基于此研究的更长论文已提议在 1994 年 6 月的 Usenix 会议上发表,作为对 Unix 突破意义的 25 周年纪念讨论以及从中吸取的教训,以迈出下一步。
Multics(1965-68 年)项目旨在“展示通用、多用户、分时系统是可行的”1。基于麻省理工学院使用麻省理工学院兼容分时系统 (CTSS) 获得的研究成果,AT&T 和 G.E. 同意与麻省理工学院合作构建“新硬件、新操作系统、新文件系统和新用户界面”。尽管该项目进展缓慢,并且 Multics 花费了数年时间才开发出来,但普渡大学计算机科学教授道格·科默解释说,在 Multics 的研究过程中“发现了基本问题”,“探索了新方法并发明了新机制”。他解释说,最重要的是“参与者和观察者都致力于一种新的计算形式(交互式、多用户、分时系统)。因此,Multics 项目多年来在计算机系统研究中占据主导地位,其许多成果至今仍被认为是开创性的。”
然而,到 1969 年,AT&T 决定退出该项目。贝尔实验室 Unix 发明者之一丹尼斯·里奇在描述那个时期时写道,“到 1969 年,贝尔实验室的管理层,甚至研究人员都开始相信,Multics 的承诺只能太晚且成本太高才能实现。”2
里奇解释说,“甚至在 GE-645 Multics 机器从场所移走之前”,“一个主要由肯·汤普森领导的非正式小组就开始研究替代方案。”
汤普森和里奇向贝尔实验室提交了购买计算机的提案,以便他们可以构建自己的交互式分时操作系统。他们的提案没有得到采纳。最终,肯·汤普森找到了一台很少使用且过时的 PDP-7 计算机,这台机器很小,属于 Commodore 64 计算机的级别。
里奇解释说,汤普森试图实现的环境包括“Multics 的许多创新方面”,例如“进程作为控制中心的明确概念、树状结构文件系统、作为用户级程序的命令解释器、文本文件的简单表示以及对设备的通用访问”3。在描述汤普森在尝试创建他想要的编程环境时面临的原始条件时,里奇写道
一开始,汤普森甚至没有在 PDP 本身上编程,而是使用了一组用于 GE-635 机器上的 GEMAP 汇编程序的宏。后处理器生成了 PDP-7 可读的纸带。这些纸带从 GE 机器运到 PDP-7 进行测试,直到一个原始的 Unix 内核、一个编辑器、一个汇编器、一个简单的 shell(命令解释器)和一些实用程序(如 Unix rm、cat、cp 命令)完成。至此,操作系统实现了自支持;程序可以编写和测试,而无需借助纸带,并且开发工作在 PDP-7 本身上继续进行。4
里奇解释说,结果是,
汤普森的 PDP-7 汇编程序甚至比 DEC 的汇编程序还要简单;它评估表达式并发出相应的位。没有库,没有加载器或链接编辑器:程序的整个源代码都呈现给汇编程序,并且出现的输出文件——具有固定的名称——是直接可执行的。5
该操作系统被命名为 Unix,以区别于 Multics 的复杂性。
随着贝尔实验室操作系统工作的继续,研究人员制定了一套原则来指导他们的工作。这些原则包括
让每个程序做好一件事。要完成一项新工作,请从头开始构建,而不是通过添加新功能来使旧程序复杂化。
期望每个程序的输出都成为另一个尚未知程序的输入。不要用无关信息弄乱输出。避免严格的列式或二进制输入格式。不要坚持交互式输入。
设计和构建软件,甚至操作系统,以便尽早尝试,理想情况下在几周内。不要犹豫丢弃笨拙的部分并重建它们。
使用工具而不是非熟练的帮助来减轻编程任务,即使您必须绕道构建工具并期望在使用完它们后丢弃其中一些工具。6
里奇写道,到 1970 年,Unix 研究人员“能够获得一台新的 DEC PDP-11。他回忆说,“处理器是 DEC 交付的第一批产品之一,磁盘花了三个月才到货。”机器到货后不久,在“仍在等待磁盘”的同时,里奇回忆说,“汤普森用 PDP 汇编语言重写了 Unix 内核和一些基本命令。在机器上的 24K 字节内存中,最早的 PDP-11 Unix 系统使用了 12K 字节用于操作系统,用户程序空间很小,其余的用作 RAM 磁盘。”8 里奇解释说,“到 1973 年初,现代 C 语言的要点已经完成。语言和编译器足够强大,使我们能够在当年夏天用 C 语言重写 PDP-11 的内核。”9 他们构建的每个程序都开发了一些简单的功能,他们称该程序为工具。他们希望这些程序使用起来有趣,并且对程序员有帮助。在描述实验室的成就时,道格·麦克伊罗伊,一位研究人员,也是汤普森创建 Unix 内核时他的部门主管,描述了实验室的气氛
不断的讨论磨练了系统……工具通常应该接受输出文件名吗?如何处理可卸载介质?如何在更高级别的语言中操作地址?如何最大限度地减少从被拒绝的登录中可推断出的信息?同行压力和对工艺的简单自豪感导致大量代码被重写或丢弃,因为更好或更基本的想法出现了。职业竞争和地盘保护几乎不为人所知:发生了太多好事,以至于没有人需要对创新拥有所有权。10
实验室完成的研究与使用计算机自动化编程任务有关。通过科学的工作方法和对细节的认真关注,贝尔实验室的研究人员确定了设计中的基本要素,然后创建了一个程序来完成尽可能简单的工作。然后,这些简单的计算机自动化工具可用于构建程序以执行更复杂的任务。他们创建了一个 Unix 内核,并附带一个贝尔实验室其他人可以使用的程序工具箱。内核包含大约 11,000 行代码。最终,10,000 行代码用 C 语言重写,因此可以移植到其他计算机系统。“内核,”肯·汤普森写道,“是唯一不能被用户随意替换的 Unix 代码。因此,内核应尽可能少地做出真正的决策。”11 汤普森描述了创建内核的过程
内核中实现或未实现的内容既代表着巨大的责任,也代表着巨大的权力。这是一个关于“事情应该如何完成”的肥皂箱平台。即便如此,如果“方式”过于激进,就不会有人效仿。每个重要的决定都经过仔细权衡。始终以简洁性代替效率。只有当复杂算法的复杂性可以本地化时才使用复杂算法。(12)
内核被认为是必不可少的东西,其他功能留待作为工具或可用软件的一部分进行开发。汤普森解释说
Unix 内核与其说是一个完整的操作系统,不如说是一个 I/O 多路复用器。这应该是这样。由于这种观点,大多数其他操作系统中发现的许多功能在 Unix 内核中都缺失了。例如,Unix 内核不支持文件访问方法、文件处置、文件格式、文件最大大小、假脱机、命令行语言、逻辑记录、物理记录、逻辑文件名分配、逻辑文件名、多种字符集、操作员控制台、操作员、登录或注销。其中许多东西是症状而不是功能。其中许多东西是在用户软件中使用内核作为工具实现的。命令语言就是一个很好的例子。维护此类代码与维护用户代码一样容易。“系统”代码和通用用户原语的概念直接来自 Multics。13
在贝尔实验室研究人员早期从事 Unix 工作的同一时期,贝尔系统面临着使用小型计算机自动化其电话运营的问题。
“我们发现在 70 年代初期,我们有必要——或者实际上是机会——使用这些小型机来支持电话公司的运营,这鼓励我们使用 Unix 系统,”伯克利·塔格写道。14 “我们知道我们可以更好地完成维护、交通控制、维修和会计应用程序。现有系统由人员和纸张组成,”他说道。“在 70 年代初期,电话业务面临着 60 年代繁荣带来的巨大压力。当时人们对使用计算机来帮助管理业务的这一部分非常感兴趣。我们想摆脱所有这些 Rolodex 文件,并帮助那些必须来回搬运仪器和零件的人,只是为了维持运营。”
他继续描述了贝尔系统需要自动化的操作类型。正如贝尔系统的操作系统人员已经认识到计算机操作系统需要可移植性一样,里奇和汤普森以及贝尔实验室的其他编程研究人员创建了计算机语言 C,并用 C 语言重写了 Unix 内核的大部分代码,从而在创建不依赖于机器的计算机操作系统方面取得了重要突破。在描述他们使用 Unix 取得的突破时,汤普森和里奇在 1973 年 10 月 15-17 日于纽约州约克镇高地 IBM Thomas J. Watson 研究中心举行的第四届 ACM 操作系统原理研讨会上发表了他们的第一篇关于 Unix 的论文。15
凭借可移植计算机操作系统的研究突破,“第一个 Unix 应用程序”,莫尔在《Unix 评论》的一篇文章中写道,“于 1973 年安装在一个参与更新目录信息和拦截呼叫已更改号码的系统上。自动拦截系统交付用于早期的 PDP-11。这基本上是 Unix 第一次用于支持实际的、持续运营的业务。”16
实验室以非常小的费用向学术机构提供该软件。例如,澳大利亚新南威尔士大学计算机科学系的约翰·莱昂斯报告说,他的学校在 1974 年 12 月以 150 美元(110 澳元)的价格获得了研究 Unix Edition 5 的副本,包括磁带和手册。17
到 1979 年,AT&T 的自动化受益于不仅来自贝尔实验室的研究,也受益于学术界研究人员的研究。在早期开发阶段,Unix 操作系统及其优势的消息在贝尔实验室之外传播开来。(一些资料来源将此归因于里奇和汤普森在 1973 年操作系统原理研讨会上发表的关于 Unix 的论文。18)
Unix 对学术计算机科学界具有吸引力,原因有几个。在描述了更明显的优势之后,例如它的价格、它可以根据安装进行塑造、它是用 C 语言编写的,与汇编语言相比很有吸引力、它足够小,个人可以学习和理解它,约翰·斯通巴克写道
Unix 还有另一个吸引人的优点,许多人可能只是在事后才认识到——它忠实于 70 年代中期流行的软件设计和开发理念。Unix 不仅证明了真正的软件可以按照许多人所说的方式构建,而且它还为一门正在努力确立自身科学地位的科学增添了可信度。教师可以同时使用 Unix 并教授它。在大多数方面,该系统都是优秀计算机科学的典范。它提供了简洁而强大的用户界面和工具,可以促进和鼓励软件的开发。它是用 C 语言编写的事实使得实际代码可以被呈现和讨论,并使教科书示例成为现实。显然,Unix 注定要在学术界发展壮大。19
在试图向学生教授优秀操作系统的要点时,澳大利亚新南威尔士大学的约翰·莱昂斯描述了他如何在 1976 年准备一本包含研究 Unix Edition 6 版本源代码文件的手册,并在第二年完成了一套解释性注释,向学生介绍代码。“编写这些,”他回忆说,“对我来说真是一次学习练习。通过缓慢而有条不紊地调查整个内核,我开始理解其他人忽略的事情。”20
这种向学生展示操作系统内核真实示例的能力是一项突破。莱昂斯写道
在我写关于 Unix 的注释之前,大多数人认为操作系统是庞大且难以接近的。因为我曾在 Burroughs 工作过,所以我知道如果人们花一些时间研究,他们就可以学会整个程序。我知道一个人有可能有效地成为整个系统的专家。Edition 6 Unix 代码包含不到 10,000 行,这使其很好地定位为第一个真正易于访问的操作系统。21
为了秉承 Unix 社区互相帮助的精神,莱昂斯给 Usenix 的梅尔·费伦茨、娄·卡茨等人写了一封信,并提出向其他人提供他的注释副本。在与西电公司就专利许可进行了一些谈判后,他根据西电公司提出的条件,将题为“Unix 操作系统注释”的注释分发给其他拥有 Unix 许可证的人。22
道格·科默在描述研究 Unix 及其在学术机构中的采用如何促进计算机科学发展时写道
将 Unix 用作操作系统研究的基础产生了三个非常理想的后果。首先,通用系统的可用性使研究人员能够重现和验证彼此的实验。这种验证是科学的本质。其次,拥有坚实的系统软件基础使实验人员有可能在他人工作的基础上进行构建,并着手解决重要的想法,而无需浪费时间从头开始开发所有部件。这样的基础是富有成效的研究的先决条件。第三,使用单个系统作为研究工具和传统计算资源,使研究人员可以将成果从实验室快速转移到生产环境。这种快速过渡是最先进计算的强制性要求。23
研究 Unix 不仅服务于学术界,而且学术界的贡献也被纳入研究 Unix。一个例子是加州大学伯克利分校为 VAX 计算机设计 Unix 虚拟内存版本的工作,该版本后来经过优化并纳入 Unix 的一个版本。“思想的潮流,”科默解释说,“已经开始了一个新的循环,从学术界流向工业实验室,再回到学术界,最终流向越来越多的商业场所。”24
科默在总结贝尔实验室和学术界在开发 Unix 方面的关系时总结道
Unix 不是由闲逛的黑客发明的,也不是在真空中形成的。它从强大的学术根基中成长起来,并在整个发展过程中滋养和吸收了学术界的营养。Unix 的主要贡献者是受雇于许多人认为是世界一流工业研究中心贝尔实验室的受过高等教育的数学家和计算机科学家。尽管这些开发人员本身知识渊博且经验丰富,但他们与学术界的研究人员保持着专业的联系,从而促进了思想交流,这对双方都有利。理解 Unix 与学术界之间的共生关系意味着理解系统发明者的背景以及大学与贝尔实验室之间互动的历史。25
约翰·莱昂斯在回顾他作为 Unix 社区成员的经历时总结道,“我们通过 Unix 连接与世界各地建立了大量联系并交流了大量信息。也许 Unix 最好的地方在于:与其说是系统本身友好,不如说是使用它的人们友好。”26
当一项科学技术突破发生时,这将肯定会影响社会发展的未来进程,并且当它的助产士仍然活着告诉我们这件事时,这是一件罕见而美好的事件。Unix,贝尔实验室研究人员、当时受监管的 AT&T 系统和学术计算机科学的产物,以及对计算机科学、计算机教育以及下一代计算机科学家和工程师教育的宝贵发明,就是这样一件事件。
Unix 和计算机科学© 作者:Ronda Hauben,改编自 1994 年春季《业余计算机爱好者》通讯中发表的一篇文章,并经《业余计算机爱好者》编辑许可转载。《业余计算机爱好者》的电子副本可从 ronda@umcc.umich.edu 或 au329@cleveland.freenet.edu 免费获取。印刷版可通过订阅获得,4 期订阅价格为 5.00 美元(外国邮资另加 2.50 美元)。支票应支付给 R. Hauben。如需印刷版,请写信至:The Amateur Computerist, c/o R. Hauben, P.O. Box 4344, Dearborn, MI 48126。
此外,欢迎对这项正在进行的工作提出意见,因为一项更长的工作正在进行中,并且将努力在更长的工作中回应意见和建议。