序章:计算机的诞生与Unix的传奇
1969年,这一年,人类第一次将脚印留在月球表面,阿姆斯特朗的靴子踏上那片从未被涉足过的灰色尘土,全世界数亿人守在电视机前,见证了这个足以载入史册的时刻。然而,就在这场举世瞩目的科技壮举之外,在美国新泽西州一个不起眼的角落里,另一场静悄悄的革命也在悄然萌芽。这场革命没有媒体的聚光灯,没有欢呼的人群,但它对人类文明的深远影响,或许不亚于那场登月行动。这场革命的发起者,是一个名叫Ken Thompson的年轻人,他正和几个同事围在一台破旧的计算机终端前,眼睛里闪烁着某种近乎狂热的光芒。这台计算机型号是PDP-7,是数字设备公司(DEC)几年前推出的小型计算机,在那些财大气粗的大型机面前,它就像一个被遗弃在角落里的玩具。但对于Ken Thompson和他的团队来说,这台"玩具"是他们实现梦想的全部家当。没有人会想到,几年之后,他们在这台不起眼的机器上开发的系统,会成为整个计算机世界最重要的基石之一。这个系统的名字叫做Unix——一个简洁得近乎简陋的名字,却承载着一个改变世界的梦想。
Ken Thompson出生于1943年的新奥尔良,在加州大学伯克利分校完成了本科学业,后来加入了贝尔实验室。贝尔实验室,这个名字在计算机历史上有着非同寻常的分量。它是美国电话电报公司(AT&T)旗下最负盛名的研究机构,聚集了这个世界上最聪明的一批头脑。在这里,香农创立了信息论,巴丁、肖克利和布拉顿发明了晶体管,阿姆斯特朗发明了调频广播技术。当Ken Thompson来到贝尔实验室的时候,他已经是一个经验丰富的计算机科学家了,参与过Multics项目的开发。但Multics的故事,是一个关于野心与失败的故事。
要理解Unix的诞生,我们必须先理解它的"母体"——Multics。Multics,全称是"多路复用信息和计算服务"(Multiplexed Information and Computing Service),这个拗口的名字本身就透露着它的野心。1964年,贝尔实验室、通用电气和麻省理工学院联合启动了Multics项目,目标是创建一个前所未有的操作系统:一个能够支持数百名用户同时使用的大型分时系统。在那个年代,计算机还是一种稀缺而昂贵的资源,一台机器往往价值数百万美元,只能由专业人员操作,普通用户根本无法接近。Multics的愿景是彻底改变这种状况,让计算机像电话一样普及,让每个人都能轻松地使用计算资源。
这个愿景听起来无比美好,但实现起来却困难重重。Multics的设计者们在"完美"的道路上越走越远,添加了越来越多的功能,复杂得像一座迷宫。系统越来越庞大,越来越慢,越来越难以维护和理解。到1969年,项目已经进行了五年,却依然无法投入使用。通用电气退出了项目,麻省理工学院的科学家们也开始对这个无底洞失去耐心。最终,Multics被作为一个商业产品推向市场,但用户寥寥反响平平,最终在1989年彻底退出历史舞台。一位参与过Multics项目的工程师后来回忆说,Multics就像一个永远长不大的孩子,设计者们不断为它添加新功能,却从未想过让它真正"出生"。
然而,正是Multics的失败,为Unix的诞生提供了土壤。当贝尔实验室从Multics项目中撤出时,一些参与过该项目的工程师带走了宝贵的经验教训。Ken Thompson就是其中之一。他从Multics的失败中看到了一个问题:系统的设计者们都试图创建一个"全能"的系统,一个能够满足所有人所有需求的系统,但结果却适得其反。越是追求完美,系统就越是复杂;越是复杂,就越难以理解和使用。Ken Thompson决定走一条完全不同的道路。他想要的不是一个复杂的系统,而是一个简洁的系统;不是一个大而全的系统,而是一个专注于核心功能的系统;不是一个人完成所有工作的系统,而是一个由多个简单的程序组合而成的系统。这些想法,后来成为Unix设计哲学的基石。
Ken Thompson在PDP-7上开发的第一个Unix系统最初只是一个文件系统,甚至连一个正式的名字都没有。他们只是简单地叫它"the Bell Labs System"或者"Unics"(Uniplexed Information and Computing Service,一个对Multics名称的戏谑模仿)。有趣的是,据说当时Ken Thompson开发这个系统的一部分动机,是为了能够在午休时间玩一个他喜欢的游戏——Space Travel。在这个游戏中,玩家可以控制一艘宇宙飞船在太阳系中飞行,拜访不同的星球。最初的版本运行在GE-645大型机上,每次运行需要支付75美元的费用,这让Ken Thompson心疼不已。他决定在一个更便宜的机器上重新实现这个游戏,于是便有了后来的故事。
当Dennis Ritchie加入这个项目时,一切都开始改变。Dennis Ritchie比Ken Thompson小两岁,出生于纽约,同样在哈佛大学接受教育后加入了贝尔实验室。Ritchie和Thompson很快发现他们是一对完美的搭档:Thompson有着非凡的系统设计直觉,能够敏锐地嗅出简洁与优雅的味道;Ritchie则是一个严谨的思考者,擅长将想法转化为精确的实现。他们两人之间的合作,开启了计算机历史上最富有成果的伙伴关系之一。
1971年,Unix系统被迁移到了更强大的PDP-11上,这下终于有了一个真正可以用于日常工作的平台。Ken Thompson和Dennis Ritchie开始在贝尔实验室内部推广Unix系统,很快它就成为了实验室内部最受欢迎的操作系统。程序员们发现,与那些笨重复杂的大型机系统相比,Unix是那样的轻便、灵活和易于使用。几乎不需要什么培训,一个新手就能在几个小时内掌握基本的Unix操作,并开始有效地工作。这在当时简直是不可思议的事情。
但真正让Unix腾飞的,是C语言的诞生。1972年,Dennis Ritchie开发出了C语言,这是一种专门为编写操作系统而设计的编程语言。与当时流行的汇编语言相比,C语言更加易读易写,同时又保持着对硬件的高效控制能力。1973年,Ken Thompson用C语言重写了Unix系统,这是一个划时代的决定。在此之前,所有的操作系统都是用汇编语言编写的,这意味着每个操作系统都与其运行的特定硬件紧密绑定,无法移植到其他机器上。但Unix和C语言的结合改变了一切——现在,Unix可以在不同的硬件平台上运行,只需要为每个平台重新编译一次源代码。这个简单的想法,在当时却是一场革命。
C语言和Unix的结合,就像DNA的双螺旋一样,将两个伟大的创造紧密缠绕在一起,相互促进共同演化。C语言的设计受到了Unix的深刻影响,许多C语言的特性都是为了方便Unix系统的编写而特意添加的。而Unix系统也从C语言中获得了无与伦比的移植性和生命力。这一对"黄金搭档"的成功,引发了一场软件开发的范式转变:程序员们开始意识到,一个好的工具应该能够使复杂的工作变得简单,而不是让简单的事情变得复杂。
Unix的设计哲学,可以用一个简单的原则来概括:"做一件事,并把它做好"(Do One Thing and Do It Well)。这听起来像是老生常谈,但真正做到却极为困难。大多数软件系统都想做得太多,它们试图满足所有人的所有需求,结果却往往一事无成。但Unix的创造者们坚持了一条不同的道路:他们不追求功能的数量,而是追求每个功能的精致;他们不追求系统的庞大,而是追求组件的精简;他们不追求一个人完成所有的工作,而是追求多个简单程序的协作。
这种设计哲学体现在Unix系统的每一个角落。在Unix中,每个程序都专注于一个特定的任务:ls命令用来列出目录内容,grep命令用来搜索文本,cat命令用来显示文件内容,awk和sed命令用来处理文本数据。这些工具单独使用都很有用,但它们的真正威力在于组合。通过管道(pipe)机制,用户可以将一个程序的输出直接传递给另一个程序作为输入,就像工厂里的流水线一样。这种"管道和过滤器"的设计模式,让Unix用户能够用简单工具的组合来解决复杂问题,而这正是Unix最迷人之处。
另一个Unix的核心原则是"一切皆文件"(Everything is a file)。在Unix中,不仅普通文件是文件,目录是文件,设备也是文件,甚至进程间通信的通道也可以当作文件来处理。这种统一的抽象大大简化了系统的设计和使用。用户可以用相同的命令和操作方式来处理各种不同类型的数据,而不必为每种情况学习不同的方法。更重要的是,这种设计使得编写程序变得异常简单——如果你想让程序读写磁盘文件,你可以使用相同的代码;如果你想让程序读写键盘输入或网络数据,只需要改变"文件名"即可。
Unix还包含了另一个独特的设计决策:所有的系统配置都存储在纯文本文件中。在许多传统的操作系统中,系统配置被保存在二进制的数据库中,只有通过专门的工具才能查看和修改。但在Unix中,系统的所有配置——从用户账户到网络设置,从打印机队列到时区信息——都保存在可以直接读取和编辑的文本文件中。这带来了一些权衡:二进制配置文件可能更高效,但纯文本文件的可读性和可移植性无可比拟。Unix的设计者们的选择是明智的:一个系统管理员可以用任何一个文本编辑器来修改系统配置,可以用grep来搜索特定的设置,可以用diff来比较不同配置文件的差异,可以用shell脚本自动处理配置变更。这种透明性和灵活性,在四十年后的今天仍然让Unix系统管理员们受益无穷。
Unix的设计哲学不仅影响了操作系统本身,还深刻地影响了整个软件开发行业。Linux的创造者Linus Torvalds曾经这样评价Unix:"Unix是简单的,它只是需要一种好的品味才能理解。"这句话道出了Unix设计的精髓:真正的简单不是幼稚的简单,而是在理解了问题的本质之后提炼出的精华。Unix的创造者们没有被复杂的需求所迷惑,他们坚持着自己的设计原则,最终创造出了一个简洁而强大的系统。
当Unix在贝尔实验室内部蓬勃发展的时候,大洋彼岸的英国也发生着一些有趣的事情。1969年,就在Ken Thompson在PDP-7上开发第一个Unix系统的同一年,大西洋另一侧的Richard Miller在他的学术著作中提出了一个有趣的问题:"计算机的本质是什么?"(What is the essence of a computer?)这个问题看似简单,却触及了计算机科学最核心的哲学问题。
Miller的问题激发了人们对计算本质的深入思考。计算机看起来是一台复杂的机器,由数以百万计的晶体管和复杂的电路组成。但是,如果我们仔细思考,会发现这种复杂性是表面的。计算机做的所有事情,从简单的加减运算到复杂的数据处理,归根结底都是一些简单的基本操作的组合。如果我们有足够的时间和资源,理论上我们可以用最原始的材料——比如纸和笔——来完成计算机所做的任何计算。这就是所谓的"图灵完备性"概念:任何具有足够表达能力的系统,原则上都可以模拟任何其他系统。
这种思考方式对于操作系统设计有着深远的影响。如果我们能够理解计算机的本质,我们就可以用任何我们喜欢的方式来构建操作系统。Unix的设计者们正是抓住了这个洞见:操作系统不需要是一团纠缠不清的复杂代码,它可以是一组简洁的工具,每个工具各司其职,通过协作来完成复杂的任务。这种思想不仅体现在Unix的设计中,还深刻影响了后来的软件工程理念。
Richard Miller的这个问题还有一个更实际的意义:它帮助人们认识到,计算资源应该是可以被共享的。在早期的大型机时代,一台计算机价值数百万美元,只能由少数专业人员使用。但随着技术的发展,计算机变得越来越小、越来越便宜,科学家们开始思考一个问题:为什么不能让更多人同时使用一台计算机呢?这种"分时系统"(Time-Sharing System)的想法,正是Unix诞生的思想背景之一。
Multics项目本质上就是一个分时系统的尝试,尽管它因为过于复杂而失败了。但Unix继承了分时系统的理想,并用一个更加务实的方式实现了它。Unix的多用户支持允许许多人同时登录一台计算机,每个人都拥有自己的账户和文件空间,可以运行自己的程序。这种能力在今天看来理所当然,但在当时却是一项革命性的创新。Unix让计算机从少数人的专有工具变成了可以被广泛共享的资源,这为后来的个人计算机革命奠定了基础。
从ENIAC到Unix,从1975年到1983年,计算机世界走过了一条漫长的道路。ENIAC代表了计算机发展的第一阶段——那些笨重、昂贵、专属于少数人的巨型机器。分时系统代表了第二阶段——试图让计算机变得更加友好和可共享。而Unix则代表了一个新的起点——一个简洁、优雅、开放的系统,它让计算机的力量真正释放出来,让每个人都能成为计算机的主人。
Unix的成功不是偶然的,它是一群天才工程师集体智慧的结晶,是无数次尝试和失败之后的产物。在Unix的创造过程中,有太多值得我们铭记的名字:Ken Thompson,他设计了这个系统的基本架构,点燃了Unix的第一粒火种;Dennis Ritchie,他发明了C语言,让Unix得以跨越不同的硬件平台;Brian Kernighan,他编写了Unix的第一本用户手册,创造了"Unix"这个名字,还参与开发了许多Unix的核心工具;Douglas McIlroy,他发明了管道机制,这个想法成为Unix哲学的精髓之一;以及无数其他为Unix的发展做出贡献的人。这是一个关于协作和创新的故事,是关于如何通过简单的设计来解决复杂问题的故事。
1974年,Ken Thompson和Dennis Ritchie在《Communications of the ACM》上发表了第一篇详细介绍Unix的学术论文。这篇题为"UNIX Time-Sharing System"的论文,像一颗种子落入了肥沃的土地,迅速引发了学术界的广泛关注。各地的大学和研究机构开始尝试获取Unix的源代码,将它安装在自己的机器上,进行研究和实验。Unix很快就在大学里流行起来,成为计算机科学教育的重要工具。
更令人惊讶的是,AT&T竟然允许Unix以极其低廉的价格出售给大学和教育机构。最初的价格是每个站点20美元,后来甚至降到了每个站点50美元——与那些动辄数万美元的商业软件相比,这简直是白菜价。AT&T的这个决定,初衷可能只是为了让Unix在学术界有一个立足之地,但它的影响却远远超出了预期。通过这种方式,Unix的种子被播撒到了世界各地的大学和研究所,在那里生根发芽,培养出了一代又一代精通Unix的计算机科学家和工程师。这些人后来走向社会,将Unix的理念带入到各个行业,成为Unix文化最重要的传播者。
Unix在学术界的广泛传播还带来了另一个意想不到的结果:它成为了事实上的"计算机科学通用语言"。就像学习文学的学生需要阅读莎士比亚,学习绘画的学生需要研究文艺复兴大师的作品一样,学习计算机科学的学生也需要学习Unix。对于那个时代成长起来的计算机科学家来说,Unix不仅是一个操作系统,更是一种思维方式,一种看待计算机和软件的角度。他们学会了这套工具,吸收了它的设计哲学,然后把这些思想带入到他们的整个职业生涯中。
Brian Kernighan是这个时代最重要的Unix布道者之一。他是Unix早期最重要的贡献者之一,也是Unix文化最重要的记录者之一。1978年,Brian Kernighan和Dennis Ritchie合著出版了《The C Programming Language》一书,这本书后来成为编程语言书籍的经典之作,被翻译成数十种语言,销量超过数百万册。这本书还有一个更广为人知的昵称——"K&R",取自两位作者姓氏的首字母缩写。这本书以其简洁、清晰、权威的风格著称,是每一个C程序员必读的入门书籍。
1983年,美国计算机协会(ACM)授予Ken Thompson和Dennis Ritchie计算机界的最高荣誉——图灵奖(Turing Award)。这个奖项相当于计算机科学领域的诺贝尔奖,是对计算机科学家最高的认可。在颁奖典礼上,委员会高度评价了两位获奖者的贡献:"Unix系统的发明和发展对计算机科学的理论和实践都产生了深远的影响。他们的贡献不仅仅是创造了一个成功的操作系统,更重要的是,他们通过Unix展示了什么是好的软件设计,什么是简洁和优雅的编程风格。"
Unix的成功和广泛传播也带来了一个新的问题:不同的组织和公司开始基于Unix开发自己的版本,导致了Unix的分裂。1980年代,出现了许多不同的Unix变体:AT&T的System V,BSD(Berkeley Software Distribution),Sun Microsystems的Solaris,IBM的AIX,HP的HP-UX,等等。这些变体虽然都源自最初的Unix代码,但它们之间存在着微妙的差异,彼此之间并不完全兼容。对于软件开发者和系统管理员来说,这意味着他们需要为不同的Unix系统编写不同的程序和维护不同的配置,增加了不必要的工作量。
这种分裂让许多人开始怀念最初那个简洁、统一的Unix。Richard Stallman就是其中之一。1983年,在MIT人工智能实验室工作的Stallman宣布了一个雄心勃勃的计划:他要创建一个完全自由、开放的Unix兼容系统。这个计划被命名为GNU,代表"GNU's Not Unix"(GNU不是Unix)。这个递归的缩写方式是黑客文化的经典玩笑,类似于某人自我介绍时说"我是Stallman,G-stallman?Stall-man?不,是Richard Stallman",永远无法用一个有限的定义来限定自己。
GNU计划的愿景不仅仅是复制Unix的功能,更是要超越它。Stallman认为,软件应该是自由的——用户应该有权运行、复制、分发、研究、修改和改进软件。这种理念在当时是革命性的,因为那个时代的软件通常都是专有的,被严格地保护和保密。但Stallman认为,正是这种封闭的软件文化阻碍了计算机技术的发展;如果每个人都把代码藏起来,计算机世界将永远停留在黑暗的中世纪。
GNU计划很快就吸引了众多志同道合的程序员加入。他们开始从头编写一个完整Unix系统所需的所有组件:编译器(GCC)、文本编辑器(Emacs)、shell(Bash)、文件系统工具、调试器,以及许多其他的工具和应用程序。这些软件大多在1980年代中后期陆续发布,每一个都以其高质量和实用性赢得了广泛的好评。到1990年代初,GNU项目已经创建了一个功能完备的Unix兼容系统,几乎可以替代大多数商业Unix系统。
然而,这个系统还缺一个关键的组件:内核。内核是操作系统最核心的部分,负责管理系统资源、协调硬件设备、运行程序等。没有内核,再好的应用程序也只是空中楼阁。GNU计划最初打算使用一个叫HURD的内核,但这个内核的开发进展缓慢,迟迟无法投入使用。就在这个关键时刻,一个芬兰的年轻人站了出来,改变了一切。
Linus Torvalds,1969年12月28日出生于芬兰的赫尔辛基。正如Unix在1969年开始它的旅程一样,Torvalds也出生在这一年——历史有时候就是这样充满了奇妙的巧合。1991年,21岁的Torvalds是赫尔辛基