跨越50年历史河流带你走进贝尔实验室一探UNIX起源

0 Comments

自1969年在贝尔实验室的阁楼上诞生以来,Unix操作系统的发展远远超出其创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,改变了整个计算机技术的发展轨迹。

Unix及其衍生产品在特定的技术社区之外并不广为人知,但它们是若干系统的核心,这些系统已是许多人生活的一部分。谷歌(Google)、脸书(Facebook)、亚马逊(Amazon)等提供的许多服务和其他大量服务都由Linux驱动。Linux是类Unix操作系统,后文将会讲到。你的手机或MacBook运行着某种版本的Unix操作系统。如果你家里有Alexa等智能小电器,或者车上有导航软件,它们也由类Unix操作系统驱动。如果你浏览网页时总被广告轰炸,也是Unix操作系统在后面支撑。当然,基于Unix的追踪系统也知道你在做什么,以便更精准地对你进行广告轰炸。

曾在贝尔实验室工作超过30年的作者布莱恩.W. 克尼汉(Brian W. Kernighan),见证了Unix的诞生。在C程序设计语言后又一力作《UNIX传奇:历史与回忆》

本书不但书写Unix的历史,而且记录了作者的回忆,一探Unix的起源。本书试图解释什么是Unix,Unix是如何产生的,以及Unix为何如此重要。

本书为那些有兴趣了解计算或创新史的读者撰写。读者可以随意略过看起来太难懂的部分,不必逐字阅读。对于程序员,其中一些解释会显得太啰唆,还好书中有些对历史的思考仍然有用,与之有关的故事也颇有意趣。

本书主要的写作目的是讲述计算机历史上某个极具生产力和发展性的时期中的一些精彩往事。理解我们习以为常地使用的技术如何演化而来,颇为要紧。有人顶住压力、克服时间限制,做出了定义技术发展方向和路径的决策。越了解历史,我们越感激那些带来Unix的发明天才,或许也越能理解现代计算机系统是如何发展成现在这个样子的。仅就那些如今看起来大错特错抑或倒行逆施的选择而言,常常也是在当时可用资源限制之下所能考虑和实现的必然结果。

Unix操作系统是故事的中心,但其余亦有涉及。我还将讲述被广泛使用的C语言,人们用它编写了支持互联网运行的系统及利用系统能力的各种服务。在贝尔实验室,还有一些编程语言随Unix而生,尤其要提到也被广泛使用的C++。Word、Excel和PowerPoint等微软Office软件就是用C++写成的,大多数网页浏览器也是用C++编写的。程序员们耳熟能详的一二十个日常开发工具,在Unix的早期就已问世,四五十年以来一直维持原状,至今仍在许多程序员的工具包中有一席之地。

Unix诞生地贝尔实验室是很出色的机构,它既制造出许多好点子,也投资了这些好点子。多个改变世界的发明由贝尔实验室而起,它的运作机制足资学习。

Unix的故事当然也贡献了大量有关设计和构造软件,以及有效利用计算机的洞见,我会在书中一一指出。例如,Unix软件哲学倡导合用既有软件,完成很多不同任务,而不是从头写个新软件。这个例子简明又生动,它在编程领域体现了“分而治之”的故技:将大任务切分为多个小任务,每个小任务都变得更可控,然后再以各种不可思议的方式将之整合到一起。

最后,虽然Unix是贝尔实验室最抢眼的软件,但它绝非贝尔实验室对计算领域的唯一贡献。计算科学研究中心(The Computing Science Research Center),即传说中的“1127中心”,或简称“1127”,在那二三十年里面生产力“爆棚”。Unix激发了它的能力,Unix也是它的工作基础,但1127中心的贡献远超于此。1127中心的成员写出了多本重要著作,这些著作在后面的很多年里成为计算机科学的核心文献,也是程序员可以按图索骥的指南。1127中心分外显赫,在当时及以后都是极具生产力和规模较大的计算机科学研究团体。

Unix及其周边环境为何如此成功?区区两人的实验性产品如何演化为真正改变世界的东西?这是否是孤例?类似事件还会再发生吗?关于如此耀眼的成果能否被规划出来的大问题,本书末尾有讨论。

“因为有着令人惊异的乡村风格,乍看之下,贝尔电话实验室新泽西总部就像是一个巨大的现代化工厂。从某种意义上讲,它的确是工厂,是生产创意的工厂。所以,它的生产线也不可见。”

要了解Unix是如何产生的,得先了解贝尔实验室,尤其是其运作机理,以及它提供的创意环境。

AT&T,即美国电话电报公司(American Telephone and Telegraph Company),由分布于美国各地的多个当地电话公司组合而成。在其发展历史的早期阶段,AT&T意识到,它需要一个研究机构,系统解决在建设全国电话系统时遇到的科学和工程难题。1925年,AT&T创办研发子公司贝尔电话实验室(Bell Telephone Laboratories),意在解决这些难题。该机构通常被简称为贝尔实验室(Bell Labs)或BTL,有时甚至只是“实验室”,但电话系统始终是其关注的重点。

贝尔实验室最初位于纽约市西街463号。第二次世界大战之初,实验室的许多工作被移到了纽约以外进行。AT&T积极援战,为大量重要军方事务提供专业方案——通信系统自然有份,另外还有高射炮火控计算机、雷达及密码学等。其中部分工作在纽约以西33千米的新泽西州郊区或乡村开展,最大规模的办公点位于墨里山。墨里山是新普罗维登斯及伯克利高地小镇群落的一部分。

图1-1展示了纽约市与新泽西洲墨里山的相对位置。西街463号在哈得孙河畔,9A高速公路标记往北一点点。墨里山的贝尔实验室位于新普罗维登斯和伯克利高地之间,正好在78号州际公路北侧。两个驻地都用圆点标出。

贝尔实验室的工作越来越多地移往墨里山,实验室于1966年完全搬离西街463号。在20世纪60年代,墨里山容纳了3 000名员工,其中至少1 000名拥有物理、化学、数学或各种工程方面的博士学位。

图1-2展示的是1961年墨里山园区的航拍照片。当时有3幢主要建筑。1号楼在右下位置;2号楼在左上位置;3号楼呈方形,有一个露天庭院。1号楼与2号楼原本由一条400米的长廊相连,20世纪70年代,2幢新楼断开了这条长廊。

从1967年做实习生开始,直至2000年退休,我在2号楼里工作了30多年。我待过的两个办公室都在侧翼的5层(顶层),图1-2中用红点标出。9号梯位于2号楼最远端,而8号梯则在比较靠近大楼中心的侧翼。早期大多数年月里,Unix房间被安置在6层阁楼,8号梯和9号梯之间。

图1-3所示为2019年贝尔实验室的谷歌卫星图片。6号楼(图1-3的左上位置有个标记)和7号楼(图1-3的右下位置)建于20世纪70年代。自1996年开始的几年里,6号楼是朗讯科技(Lucent Technologies)的总部。数数图中谷歌打的标记印证了多少贝尔企业史,颇为有趣:“贝尔实验室”,出口车道处的“朗讯贝尔实验室”(Lucent Bell Labs),入口处的“阿尔卡特-朗讯贝尔实验室”(Alcatel-Lucent Bell Labs),以及6号楼大堂屋顶金字塔形截面尖角处的“诺基亚贝尔实验室”(Nokia Bell Labs)。

我不够资格书写贝尔实验室的详尽历史,幸而已有珠玉在前。我特别喜欢乔恩·格特纳的《创意工厂》,这本书主要写物理科学研究方面的内容。詹姆斯·格雷克(James Gleick)的《信息简史》(The Informationtion)对于了解信息科学极有价值。贝尔实验室官方出品的《贝尔系统的工程与科学史》(A History of Engineering & Science in the Bell System)卷帙浩繁(共7卷,近5000页),既全面又权威,以我之见,也很有趣。

贝尔实验室的早期研究涉及物理、化学、材料学和通信系统。研究员们有追随兴趣的自由,相关问题的环境资源也非常丰富,若想探索既满足科学兴趣又能有益于贝尔系统(Bell System)乃至全世界的领域,并非难事。

贝尔实验室做出了大量改变世界的科技成果。最早的是晶体管,由约翰·巴丁(John Bardeen)、沃尔特·布拉顿(Walter Brattain)和威廉·肖克利(William Shockley)于1947年在尝试为远距电线年代,业界亟待出现比真空管在物理上更可靠、耗能更少的设备,这是制造通信装备和构建最早的计算机的必要条件。这种需求推动了对半导体材料的基础研究,晶体管应运而生。

1956年,晶体管的发明者荣获诺贝尔奖。共有9项诺贝尔奖是因获奖者在贝尔实验室工作期间的成果而颁发的。贝尔实验室雇员还发明了负反馈放大器、太阳能电池、激光器、手机、通信卫星和电荷耦合器件(有了它,手机上的摄像头才能工作)等。

粗略估算,从20世纪60年代到20世纪80年代,贝尔实验室科研部门(主要在墨里山)拥有3 000名员工,另外还有15 000至20 000名员工隶属于其他地区的开发团队。这些开发团队利用科研部门的成果,为贝尔系统设计装备和系统。人真不少。谁给他们发工资呢?

AT&T为美国大部分地区提供电话服务,确实是一家垄断企业,但并不能随意利用其垄断地位。联邦和各州管制AT&T各项服务的价格,而且不允许AT&T涉足与提供电话服务直接有关的业务之外的其他业务。

这套规管制度多年以来行之有效。政府要求AT&T向所有人提供服务,无论服务对象远在何方,或者是否有利可图,这就是所谓“普遍服务”(universal service)。与之相应,它也获得了稳定和可预测的总体回报率。

作为规管制度的一部分,AT&T将一小部分营收拨付给贝尔实验室,专用于改进通信服务。实际上,贝尔实验室从全国范围内用户为每台电话缴纳的税款中获得回报[1]。据迈克尔 · 诺尔(A. Michael Noll)的论文,AT&T将营收的2.8%投入研发,其中基础研究投入约占营收的0.3%。放到今天,这样的安排不知能起多大作用,但在那几十年里,电话系统因此获得了持续改进,许多基础科学发现也因此应运而生。

持续的资金投入是研究工作的关键保障。这意味着AT&T能布局长远,贝尔实验室的研究员们也能自由探索那些未必有短期回报,甚至可能永无回报的领域。现今世界已全然不同,多数人只做未来几个月的规划,功夫都花在了预测下一季度财务状况上。

贝尔实验室生来就是通信系统的设计、建造与改进先锋,研发范围涵盖从电话之类的消费类硬件到交换机基础设施、微波传输塔和光缆。

有时,对实践领域的广泛关注会带来基础科学的进步。例如,1964年,阿尔诺·彭齐亚斯(Arno Penzias)和罗伯特·威尔逊(Robert Wilson)着手解决“回声号”(Echo)“气球”卫星地面天线的噪声问题。最后,他们发现,噪声来自宇宙太初大爆炸(Big Bang)遗留的背景辐射。彭齐亚斯和威尔逊因这项发现获得了1978年的诺贝尔物理学奖。(彭齐亚斯说:“多数诺贝尔奖得主因他们所追寻的东西而获奖,我们却是因自己想干掉的东西而获奖。”)

贝尔实验室还有一项任务,那就是构建对通信系统工作机制的数学理解。克劳德·香农(Claude Shannon)基于第二次世界大战期间的密码学研究创建了信息论,这是最重要的成果。香农于1948年在《贝尔系统技术杂志》(Bell System Technical Journal)上发表“A Mathematical Theory of Communication”(通信的数学理论)一文,阐释了通信系统可传递信息数量的基本属性和限制。香农于20世纪40年代到1956年期间在墨里山工作,之后回到母校麻省理工学院任教。他于2001年去世,享年84岁。

随着计算机变得越来越强大、越来越便宜,其用途也拓展到数据分析、物理系统和过程的大型建模与仿线年代起就开始涉足计算机与电子计算,到了20世纪50年代末期,贝尔实验室已经建成多个容纳大型中央计算机的计算中心。

20世纪60年代早期,一些人员从数学研究部门分离出来,与在墨里山操作大型中央计算机的人员一起,组成了计算机科学研究部门。新部门被命名为计算科学研究中心。在之后很短时间里,虽然该中心仍然负责为墨里山所有其他部门提供计算机服务,但它始终是科研机构,并非服务部门。1970年,计算机设备管理团队就拆分出去了。

本节写到好些我的个人经历,希望能告诉你是什么样的好运气让我选择电子计算作为职业,将我带入贝尔实验室这个举世无双的地方从事相关工作。

我出生于多伦多,曾就读于多伦多大学,专业是工程物理(后来改名为工程科学),这是为那些自己也不知道想学什么的人准备的“大杂烩”专业。我毕业于1964年,那时电子计算正处于早期阶段:我大三时才第一次见到计算机。整个学校只有一台IBM 7094大型计算机,算是当时最高端的设备。它拥有32K(32 768)个36位字长的磁芯存储器(如今我们会说是128 KB),还有大机械硬盘形态的次级存储。当时它价值足足300万美元,安放在空调机房中,由专业操作员照料,普通人(尤其是学生)不允许靠近。

所以,尽管我努力学习Fortran语言,但身为本科生,也只能浅尝辄止。对于那些曾经挣扎着写出自己第一段程序的人,我感同身受。我精读了丹尼尔·麦克拉肯(Daniel McCracken)的Fortran II大作[2],学会了各种编程规则,但还是不懂怎样写出第一段程序。动手能力跟不上理论知识,这该是很多人都会遇到的障碍吧。

在大学生活第一年结束前的那个夏天,我在多伦多帝国石油(Imperial Oil)公司找到一份工作,加入为精炼厂开发优化软件的小组。新泽西标准石油(Standard Oil of New Jersey)公司是帝国石油公司的股东,标准石油于1972年更名为埃克森(Exxon)。

回想起来,我在实习时的表现远低于平均水平。我花了整个夏天的时间编写一套体量庞大的COBOL程序,用来分析精炼数据。我不记得其具体功能,但它肯定没能正常工作。我其实并不清楚如何编程。COBOL缺乏对良好程序组织方式的支持,结构化编程也还未被发明出来。我的代码充斥着没完没了的IF语句,在我想到要做什么事时,将执行流程分支到另外某处。

我还尝试让Fortran程序在帝国石油的IBM 7010上运行,因为相对于COBOL而言,我对Fortran懂得多一点儿,而且Fortran大概更适合用来做数据分析。在与JCL(IBM的作业控制语言)搏斗了几周之后,我才发现7010上根本没有Fortran编译器。JCL错误信息如此晦涩难懂,以至于以前根本没人搞清楚过这个问题。

度过略有挫败感的暑假之后,我回到学校继续完成学业。我对编程的兴趣依然强烈。学校没正式开设计算机科学课程,但我高年级时的论文都与人工智能有关。人工智能在当时是热门主题。定理证明器、下国际象棋和跳棋的程序、自然语言的机器翻译似乎触手可及,看似只需要一点点程序设计就可以实现。

1964年毕业后,我不知何去何从,所以就像很多其他学生一样,打算直接读研究生。我申请了十来所美国大学(那时加拿大人不怎么申请美国学校),并有幸被其中几所录取,其中就有麻省理工学院和普林斯顿大学。普林斯顿大学说,完成博士学业通常需要3年时间,麻省理工学院说大概需要7年;普林斯顿大学提供全额奖学金,麻省理工学院说我得每周做30小时的研究助理工作——结论显而易见。而且,我的好友,高我一届的多伦多校友阿尔·阿霍,已就读于普林斯顿大学,于是我就去了普林斯顿大学。事实证明,这是一个超级幸运的选择。

1966年,好运再度降临。因为普林斯顿大学研究生李·瓦里安(Lee Varian)上一年在麻省理工学院干得不错,所以我得到了暑期去麻省理工学院实习的机会。我在那儿使用兼容分时系统(Compatible Time-Sharing System,CTSS)和密歇根算法译码器(Michigan Algorithm Decoder,MAD,ALGOL 58语言的分支)编写程序,为一种叫作Multics的新操作系统打造工具。我会在第2章中详谈Multics。(Multics本来拼作MULTICS,但小写字母版本看起来更顺眼,其他全大写字母单词我也都会写成比较顺眼的形式,如将UNIX写成Unix,哪怕这样写不符合史实。)

我在麻省理工学院名义上的老板是费尔南多·科巴托(Fernando Corbató)教授,人人都叫他“科尔比(Corby)”。他创建了CTSS,负责Multics,是一位了不起的绅士。1990年,科尔比因其为分时系统做的基础工作获得图灵奖。他于2019年去世,享年93岁。

除了带领团队设计、实现CTSS和Multics,科尔比还是输入密码访问计算机的发明人。批量计算很少用到这种方式,但运行共享文件系统的分时计算机的确需要某种安全机制来保护私有文件。

1966年夏天我在麻省理工学院时,系统自动为我生成了两个可拼读的短密码,我至今仍然想得起来。使用两个密码确有必要。夏日的某天,有人搞混了存储密码的文件和保存当日欢迎登录消息的文件。密码都是明文存储的,结果一登录系统就会看到所有人的密码。

我的办公室属于约瑟夫·魏岑鲍姆(Joseph Weizenbaum)教授,那个暑假他不在学校,记得办公室里也没有其他人。早在1966年,魏岑鲍姆就发表了对Eliza的描述。Eliza是模拟与罗杰斯学派心理学家对线],也是使用自然语言与计算机互动的早期尝试之一。它令人惊奇地有效,起码在我第一次看到时特别有效。我也乐意带领访客去看它。如今有许多模拟Eliza的网页程序,虽然这些程序很快就会“原形毕露”,但和它们聊几分钟还是很有意思的。

1967年夏天,终极好运从天而降:墨里山的贝尔实验室计算科学研究中心让我去实习,老板是道格·麦基尔罗伊(图1-4)。道格建议我研究内存分配评估问题,这也是他长期关注的方向。遵循最佳实习传统,我最终做出了与老板要求风马牛不相及的东西。我写了一套函数库,以方便在Fortran程序中做列表处理。整个夏天我都在墨里山的大型计算机GE 635上编写严密的汇编语言。GE 635实际上是重整过后更有条理的IBM 7094,同时也是Multics专用机GE 645的简化版。那差不多是我最后一次写汇编语言。尽管我所做的事从根上就走错了方向,但代码写得十分过瘾,让我与编程结下了不解之缘。

1967年实习时,我的办公室位于2号楼5层8号梯旁。上班第一天,我坐在办公室里(那些连实习生都有自己办公室的好日子啊),琢磨着该做些什么。上午11点,有个年纪略长的家伙出现在门口,说:“嗨,我是Dick。走,吃午饭去。”

我没听清楚他姓什么。不过我想,行,为什么不呢?那顿午饭怎么吃的我完全不记得了,只记得饭后那位迪克某某就去了其他地方。我沿着走廊找到他办公室门上的名牌,上面写着“Richard[4] Hamming”!这位和善的邻居原来是一位名人。他是纠错码的发明者,也是我选修过的一门数值分析课所用教材的作者。

我和迪克(图1-5)成了好朋友。他观点鲜明,不惧表达,我觉得这会让一些人不爽,但我乐意与他为伍,而且多年以来他的建议令我获益良多。

他挂了个部门负责人的头衔,但他的部门却没有员工,这看起来有点儿古怪。他告诉我,他花了很大力气才弄来这个不用负具体责任的职衔。很久以后,当我当上管理十几号员工的部门主管时,我才明白拥有一个不用负具体责任的职衔有多么令人羡慕。

1968年,他得到通知说自己获得了当年的图灵奖,这个奖现在被看作计算机科学领域的诺贝尔奖。我目睹了他的自嘲式反应:诺贝尔奖当时奖金价值10万美元,而图灵奖奖金价值2 000美元,他说自己得了2%个诺贝尔奖。这是第三届图灵奖,第一、二届分别颁给了艾伦·佩里斯(Alan Perlis)和莫里斯·威尔克斯(Maurice Wilkes),他们两位也是计算领域的先锋人物。迪克因其在数值方法、自动编码系统、错误侦测及错误纠正方面所做的工作而获奖。

迪克是促使我开始写书的人。写书是一件好事。他对大多数程序员评价甚低,因为他感觉他们没有得到像样的培训。至今他的话仍在我耳边萦绕:

“我们给他们一本词典和一套语法规则,说:‘孩子,你已经是伟大的程序员了。’”

“我们给他们一本词典和一套语法规则,说:‘孩子,你已经是伟大的程序员了。’”

他认为,应该像教写作一样教编程。好代码应该与坏代码风格迥异,应该教会程序员如何写出漂亮的、风格优雅的代码。

对于怎样才能做到这一点,我和他有分歧。但我听取他的意见,于1974年写了我的第一本书《编程格调》(The Elements of Programming Style),合著者是当时坐在我隔壁办公室的P. J.“比尔”·普劳格(P. J. “Bill” Plauger)。我们仿效威廉·斯特伦克(William Strunk)和E. B.怀特(E.B.White)的《风格的要素》(The Elements of Style)[5],展示写得差的代码片段,然后阐述如何对其进行改进。

《编程格调》这本书中的第一个例子来自迪克给我看的一本书。有一天,他冲进我办公室,手里拿着一本数值分析书,怒斥书中数值的部分写得有多烂。我只瞟到一段可怕的Fortran代码:

若你不是Fortran程序员,请听我解释。这段代码包括了两个嵌套的DO循环,这两个循环都在第14行结束。循环控制的索引变量从最低限步进到最高限,所以外循环I从1步进到N,内循环J也从1步进到N。变量V是个N行N列的数组;I遍历每一行,在每一行中,J遍历每一列。

I不等于J,除法结果为0;若I等于J(在对角线。在我看来,这有点过于炫技了。在编程时,“乱抖机灵”并非良策。

用更直截了当和显而易见的方式重写,得到下面这个更清楚的版本:遍历外循环时,内循环将第

写明白,别炫技。迪克于1976年从贝尔实验室退休,去了加利福尼亚州蒙特雷的美国海军研究生院(Naval Postgraduate School in Monterey,California)任教,直至1998年初逝世,享年82岁。据说,他有一门课被学生称为“汉明论汉明”(Hamming on Hamming),正与本节内容相呼应。

迪克无时无刻不在深思自己在做什么,为什么要这么做。他常说“算以获识,非算以得数”[6],他甚至有一条(用中文)写着这句话的领带。他很早就认为,电子计算将在贝尔实验室的工作中占到一半比例。同事们都不这么认为,但很快他的预测就成真了。他常说,周五下午宜哲思,所以他每逢这个时间就安坐思考,但也随时欢迎我这样的访客。

退休后的几年,迪克总结了关于职业生涯成功之道的建议,开设讲座,题为“You and Your Research”(你和你的研究)。你可以在网上找到相关内容。最早一次讲座于1986年3月在Bellcore(即贝尔通信研究院[7])举办,肯·汤普森开车载我一起去听。几十年来,我一直向学生们推荐这一讲座——非常值得阅读记录文本,或者观看视频。

1967年夏天,维克·维索斯基(Vic Vyssotsky)(图1-6)坐我对面办公室。他也是极聪明和有天分的程序员。维克和科尔比搭档,负责管理贝尔实验室的Multics研发工作。他会尽量抽空每天与我这个基层实习生谈话。维克逼着我给需要学编程的物理学家和化学家上Fortran课。给非程序员上编程课,原来也颇为有趣。这让我克服了对公众讲话的恐惧,也让我后来能轻松应对各种教学工作。

不久以后,维克搬去贝尔实验室的其他驻地,从事“卫兵”(Safeguard)导弹防御系统方面工作。后来,他又回到墨里山,担任计算科学研究中心的执行总监,成了在我上面好几级的老板。

1968年春天,我着手解决博士论文中我的导师彼得·韦纳(Peter Weiner)给的一个图划分(graph partitioning)问题(图1-7):给定一些由边线连接的节点,试将这些节点切分为大小相同的两组,且从一组中的节点到另一组中的节点的连接边数尽可能少。

表面上看,这来源于实际问题:如何将程序切分为多个部分,放到不同的内存页中,当程序运行时,程序页进出内存的交换量保持最小。节点代表代码块,边线代表代码块与代码块之间的可能交换,每条边有一个衡量交换频率的权值,从而可以估算出不同内存页中的代码块的交换代价。

本书不但书写Unix的历史,而且记录作者的回忆,一探Unix的起源,试图解释什么是Unix,Unix是如何产生的,以及Unix为何如此重要。除此之外,本书以轻松的口吻讲述了一群在贝尔实验室工作的发明天才的有趣往事,本书中每一个故事都是鲜为人知却又值得传播的宝贵资源。本书适合对计算机或相关历史感兴趣的人阅读。读者不需要有太多的专业技术背景,就可以欣赏Unix背后的思想,了解它的重要性。


发表回复

您的电子邮箱地址不会被公开。