饭饭TXT > 海外名作 > 《乐者为王》作者:[美]李纳斯·托沃兹 大卫·戴蒙【完结】 > 乐者为王.txt

第三章 编程的美妙

作者:美-李纳斯·托沃兹 大卫·戴蒙 当前章节:15457 字 更新时间:2026-6-22 19:12

1 、开始编程

我真不知道该如何阐释自己对编程的狂热,但我可以试试。

对于任何编程的人来说,编程是世界上最有趣的事。它比下棋之类的游戏更有乐趣得多,因为它可以由你自己来制订游戏规则。而你制定什么样的规则,也就会导出与此规则相符合的结果。

然而,对于编程外行的人来说,它却似乎是世上最枯燥的事。

编程给人带来的最初兴奋的原因有部分是显而易见的,那就是:通过编程你可以支配一台计算机,你叫计算机做什么,它就做什么,永远准确无误,而且毫无怨言。

这本身就很有意思。

但是计算机在一开始让你入迷的盲从性,显然不得它成为招人喜爱的伙伴。事实上,这种特性很快就让人厌烦了。真正使编程令人欲罢不能的是:你能让电脑做你想做的事,但是你还必须想出怎样做到的办法。

我个人认为,计算机科学和物理科学有很多相似之处。两门学科都是在一个相当基础的层面上探讨一个体系是怎样运行的。当然,区别在于,在物理学中,你探究的是一个已经存在的客观世界的构成。而在计算机科学中,你却是在创造一个前所未有的体系。

在电脑世界中,你就是创世者,你对所发生的一切拥有最终的控制。如果你功力深厚,你可以是上帝――在一个较小的层面上。

我这么说恐怕要得罪地球上近一半的人口了。但是的确如此。你开始创造自己的世界,而唯一限制你的就是机器的性能,以及――在今天尤其如此――你自己的能力了。

想象一下建在树上的小屋的情形。

你可以建筑一个这样的房子,有一个活板门,既稳固又实用。但是每个人都可以看出一个仅仅以坚固实用为目的的树上小屋和一个巧妙地利用树本身特点的美妙小屋之间的差异。这是一个将艺术和工程融为一体的活计。编程与造树上小屋有相似之外,这是它之所以被看成是一项既有魅力同时又有实际贡献的活动的原因之一。在编程中,实用的考虑往往被置于有意思、美观伶俐或有震撼力的考虑之后。

编程是对创造的训练。

探究计算机工作原理的过程,是吸引我走进编程世界的最初原因。在这其中获得的最大的乐趣在于,我认识到了计算机科学与数学的类似:你必须从该体系自身的规则出发,推演出整个世界,在物理科学中,你被客观规律所束缚。但是在数学和编程中,只要能合乎逻辑地推演,就可以成立。思考数学问题,不会受到客观世界的逻辑的限制,数学只是逻辑自洽的符号体系。正如任何一名数学家都明白的,人完全可以建构出一套数学等式,以证明三加三等于二。事实上,你想有什么样的体系就可以什么样的体系。但是,随着复杂程度的提高,你必须多加小心,不要弄出什么与你创造的体系不一致的东西。

好的体系容不得任何错误。编程也与数学一样是这么回事儿。

人们对电脑如此着迷的原因之一,就是能从中获得自己创造一个新世界的体验,并贪图到它到底能够成为什么样子。在数学中,人们往往按照客观事物的可能性进行思想实验。比如,说到几何时,大部分人想的是与我们的经验相符合的欧几里得几何学。但是电脑却可以帮助人们形象化不同的几何,并不仅仅是欧几里得几何学。在电脑的帮助下,人们可以形象化这些虚构的世界,看到那些世界到底是什么样子。还记得 Mandelbrot set 吗――基于 Benoit Mandelbrot 等式的 fractal images 。要不是电脑,纯粹的数学世界绝不能这样形象地展示出来。

Mandelbrot 就是人为地制定了一些本不存在的与现实没有一点关系的世界规则,却创造出了的图案。通过编程和电脑,你能够构筑一个新世界,有时其设计会是非常美妙的。

但是在大部分时间中你却不能欣赏自己创造的美妙世界。你只不过是在编写执行某一任务的程序。这时你就不是在创造一个新世界,而是在电脑世界中解决一个具体的问题。问题通过将思考结果应用到问题中而得到解决。而能够坐下来,盯着电脑屏幕,将一个问题彻头彻尾地贯穿思考,就需要某种特定的人。

比如,需要像我这种书呆子气十足的人。

操作系统是计算机的所有功能的基础。而创造一个操作系统则是最终的挑战。

创造操作系统,就是去创造一个所有应用程序赖以运行的基础环境――从根本上来说,就是在制定规则:什么可以接受,什么可以做,什么不可以做。事实上,所有的程序都是在制定规则,只不过操作系统是在制定最根本的规则。

创造操作系统就像在为你创造的这片土地制订宪法,而其他在电脑上运行的程序则是为宪法所允许的普通法律。

有时,这些法律根本讲不能,但这正是你要面对的问题。你需要找到解决办法,并能够意识到自己以正确的方法找到了正确的答案。

还记得那些在课上总能答对问题的同学吗?他们的答案比别人来得快,他们能这样是因为他们没有刻意去追求。他们不在乎他们应该怎样来答题。他们只不过找到了合理的考虑问题的方法。人们一听到正确答案,一切听起来就都是那么回事了。

在电脑上也是这样。你可以鲁莽、生硬地行事,愚蠢地死死纠住问题不放,直到问题不再成为问题。也可以通过找到正确的方法,使问题突然消失。你可以从不同的角度看问题。直到灵光突现地认识到:问题之所以成为问题只在于你的方法错了。

也许能够证明这一点的最佳例子不是来源于计算机科学,而是数学。故事发生在十七世纪,日后将成为伟大的数学家的高斯还在上中学。一天,老师厌烦了授课,就让学生们计算从 1 到 100 的数字的和。他原以为学生们要花一整天来计算这道题。没想到初展才华的数学家仅花了五分钟就得出了正确答案: 5050 。他解答这个问题的方法不是真的把所有这些数字一一加起来,这样做既麻烦又愚蠢。他发现 1 加 100 等于 101,2 加 99 也等于 101 ,然后 3 加 98 还是 101 ,直到 50 加 51 等于 101 。不要几秒种,他就注意到一共是 50 对 101 ,所以答案是 5050 。

也许这故事是虚构的,但它想说明的道理却很清楚:一个伟大的数学家不会采用平庸而繁琐的方法,因为他能看到隐藏在问题背后的真正内涵,并应用这一理解去找到更为简便的方法。

在计算机科学中也绝对如此。

没错,你能写一个程序来求出总数。这对于今天的电脑来说不过小事一桩。但是一个伟大的编程者能凭借其聪明的头脑就知道答案是什么。他知道怎样写出漂亮的程序,知道怎样采用一种全新的但最终会被证明是正确的方法。

不过还是很难说清楚,闭门冥思苦想地要找到解决某个问题的漂亮答案,为什么竟然有如此巨大的魅力?但是,你要是曾经有过找到更好方法的经历,你就会明白,这简直是无与伦比的感觉。

2 、长腿的终端仿真器

我的终端仿真器( terminal emulator )长了腿。我经常用它登录到学校的电脑上,查阅电子邮件和参加 MINIX 讨论组。但是问题是,我还想下载和上传东西。也就是说,我必须能向磁盘里保存东西。为此,我的终端仿真器必须装个磁盘驱动。还需要一个文件系统驱动,这样才能查看磁盘里的东西,将我下载的内容保存成文件。

这是我在发明 Linux 的过程中差点半途而废的一步。我当时觉得这太麻烦,也不值得。但是除此之外我也没什么可做的。那年春天我在上课,课程很简单,无需费太多的心思。当时我唯一的课外活动是每周三晚上参加同学聚会。我那时是一个社会“死物”,于是那聚会就成为我除了编程和学习之外唯一一个可以干点别的事情的场合。要不是那聚会,我可以说是彻底与世隔绝了。同学聚会是我接触社会生活的仅有的地方,我几乎是每次不落地参加。该聚会对我是如此重要,以至于我有时会因为想着将要参加它而失眠,因为一直担着心不要因为缺乏社交风度、或由于自己丑陋的大鼻子、或明显缺少个女伴而出丑。这自然都是些典型的低级趣味。我之所以说这些,是因为要表明,当时我真的没有什么别的有意义的事情可做。而搞出驱动程序的工作却很有意思。所以我对自己说,我要干下去。

于是,我写了一个磁盘驱动程序。因为我想把文件保存在我的 MINIX 文件系统中,也因为 MINIX 文件系统本身整理得很好,于是我让自己的文件系统可以和 MINIX 文件系统兼容。这样,我就可以在 MINIX 系统下阅读我建立的文件并将它们存入同一张磁盘,以便 MINIX 系统也可以通过我的终端仿真器阅读到我建立的文件。

这花费了我大量的精力:编程――睡觉――编程――睡觉――编程――吃饭(饼干)――编程――睡觉――编程――洗澡(冲冲了事)――编程。随着工作的进展,这个项目很明显正在成长为一个操作系统。所以我转变了看法,不再把它看成一个终端仿真器,而是一个操作系统。这个转变出现在我马拉松似的编程过程中的哪个时间段,是在白天还是晚上,我已经想不起来了。也许在这一刻之前我还穿着破旧的睡袍奋力敲击着键盘,在为终端仿真器更多的功能;而转瞬之前我拥有的功能是如此之多,以至于整个体系已经变成了一个。

我把它称之为我的“ gnu-emac 终端仿真程序”( gnu-emac of ternimal emulation programs )。 gnu-emac 终端仿真程序开始是一个编辑程序,但创造它的人又为它增加了一系列功能。设计者本想让它成为一个可以用程序控制的编辑程序,但是其程序可控性的特点很快使一切都黯然失色,它成为了一个从地狱中冒出来的编辑程序。它除了厨房水池子外几乎无所不包,这就是为什么这个编辑程序指令的图标有时竟是一个厨房水池。这个编辑程序的一大特点就是,其设计过程比任何其他编辑器都更复杂。

我的终端仿真器也是如此。它在不断地扩张。

3 、寻求网上帮助

来自: torvalds@klaava.Helsinki.Fi (李纳斯 ? 托沃兹)

讨论组: comp.os.minix 主题: Gcc-1.40 和一个有关 POSIX 的问题

信息名称: 1991 Jul 3, 100050.9886@klaava.Helsinki.Fi 日期: 1991 年 7 月 3 日 ,格林威治时间 10 : 00 : 50

各位网友好!

由于我现在正在 MINIX 系统下做一个项目,对 POSIX 标准很感兴趣。有谁能向我提供一个(最好)是机器可读形式的最新的 POSIX 规则?能有 FTP 地址就更好了。

好吧,这就是一个芬兰小子希望检验一下自己的计算机技能限度的最早的公开证据。

POSIX 标准是一个可以适用于数以百计的 UNIX 系统呼叫中的任意一个的一套冗长规则,计算机要执行任务(从读、写、开机和关机开始)就需要这个标准。 POSIX 则是指一个 UNIX 的标准体系,或一个由来自不同公司的代表所组成的一个组织,希望按照一个共同的标准进行运作。对于程序员开发的在该操作系统下的新应用软件或开发应用软件的新版本而言,标准是极其重要的。从 POSIX 这样的系统呼叫( system call ),尤其是重要的呼叫( call )中,我可以获得一个操作系统应该具有哪些功能的一个单子;然后我就可以通过自己的方式在自己的系统中实现每一个功能。通过编写出这些标准,我的系统软件的源代码将可以被别人使用,以开发新的应用软件。

当时我并不知道我本可以直接从 POSIX 公司买到这些规则的软盘,但这无所谓。哪怕我能买得起,什么东西运到芬兰,往往会需要很长的时间。我不愿等上那么久,因此我四处搜求一个能从 FTP 地址上直接下载的版本。

没有人给我提供能找到 POSI 标准的来源。于是我开始了计划 B 。

我从学校找到运行 sun 器 (sun server) 的 sun 微系统版的 UNIX 手册。该手册中有一个完全可以凑合使用的系统呼叫的基本版本。从用户手册中能看出系统呼叫的主要功能,以及为完成这些功能所需要完成的步骤。但是,从中看不出具体的方法,而只是标明了最终的结果。于是我便着手从安德鲁 ? 塔南鲍姆的书中和别的材料中收集一些系统呼叫。最终有人给我寄来了那几卷厚厚的 POSIX 标准。

不过我发的那个邮件并没有石沉大海。任何一个有相应知识的人 ( 只有具备相应知识的人才会上 MINIX 的网站 ) 都能看出我的计划是要开发一个操作系统,否则,我会需要 POSIX 规则呢?我的邮件引起了赫尔辛基工学院 ( 我若不是对研究理论这么感兴趣,可能会在这儿求学 ) 一个助教阿里 ? 莱姆克 (Ari Lemke) 的好奇。阿里善意地给我回信说,他愿意为我在他们学校的 FTP 地址上建一个子目录,这样到时我可以把自己的操作系统发布上去,让感兴趣的人们下载。

4 、 Linux

阿里 ? 莱姆克一定是一个相当乐观的人。在我能拿出什么可以发布的东西之前,他就为我建立了一个子目录: ftp.funel.fi 。我有了密码,一切都准备就绪,就等着我去登录然后上传内容了。但是我要再花上四个月才能找到一点我愿与世人分离的东西,或者至少与阿里或几个与我保持邮件往来的热衷于操作系统的狂热分子分离的东西。

我最初的目录是想开发出一个最终可以取代 MINIX 的操作系统。

这个系统不必比 MINIX 能干,但必须能胜任我最喜欢用 MINIX 做的事,以及其他我想做的事。比如, MINIX 的终端仿真不仅太不方便,而且也不能进行任务控制――即把暂不用的程序放入背景中,同时内存管理也太简化。顺便说一下,它还是以苹果的操作系统 (Mac OS) 而不是以 DOS 为支持的。

开发操作系统就是搞明白系统呼叫应该做什么,然后以你自己的方式编出能使系统呼叫得以执行的程序。总有来说,共有几百个系统呼叫。有些是多功能的,其余的则很单一。有些更基本的系统呼叫确实是十分复杂的,并需要有大量的基础作为支持。比如,为完成“写”和“读”这两种系统呼叫,你就必须建立一个磁盘驱动程序,以便能够在磁盘里读或写东西。又比如“打开文件”的系统呼叫,你就必须创建一整套文件系统层,以便分析文件名和在磁盘上查找文件。要编写“找开文件”的系统呼叫,更需要几个月的工作。但这个程序一旦编写出来,用于别的功能的程序都可以借鉴。

早期的创建工作就是这样。我不但从 Sun 服务器的操作系统手册中查找标准,也从其他书中查到可用的标准,挑出一个一个的系统呼叫,然后为它们再编出可行的软件。

这工作很容易让人感到灰心丧气。

原因是:表面上一切如故,你看不到任何进展。你可以做几个试验性的程序,检验自己刚刚加上的东西是否可行。但这并不真的有什么用。在有的阶段你不得不放弃刚才的想法,那一长串的系统呼叫都白干了。一个真正的程序在运行之前,必须已经接近完成。你必须首先运行的程序是外壳 (shell) 程序,而在有这个外壳程序之前,要运行什么很难的。而且,这个外壳程序包括了很多你所需的系统呼叫。它运行起来之后,你才会从中找到一长串你尚需完成的功能。

在 UNIX 中,外壳程序是一切程序之母。它的作用是引发以后的一系列二进制语言程序 ( 二进制程序是以计算机可识别的 1 和 0 为符号编写的程序。以机器语言编程,就是将二进制的源代码组合起来 ) ,这个外壳程序使你首先能登录 ( 当然在真正的 UNIX 系统中,你运行的第一个程序传统上被称为 init ,而 init 的确需要很多基础的支持才能运行。它是一种对正在运行着的程序的控制工具。当没有任何程序运行时, init 就没有用了 ) 。

因此,我做的第一件事不是创建 init ,而是建一个外壳程序。我执行了约二十五个系统呼叫,正如我所说,这也是我要运行的第一个真正的程序。这个外壳程序不是我自己编的。我下载了一个叫 Borne Shell 的外壳程序。它是 UNIX 的初始外壳程序之一,可以从互联网上免费下载,名字来源于一个难听的双关语。编写该外壳程序的家伙名叫波恩,所以这个程序就叫做“ Borne Again Shell ”,或一般被称为 BASH 。

当你试着从磁盘运行或导入一个真实的程序时,一般都会有“臭虫” (bug) 出现在磁盘驱动程序或导引程序中,因为程序往往会不理解它读到的东西,于是它就会在屏幕上显示出相关的信息。这很重要,你可以从中知道哪儿出了毛病。

于是,我就到了这样一个阶段:我试图导引外壳程序,屏幕上则显示出外壳程序中每一个我尚未能执行的系统呼叫。我导入并运行外壳程序,屏幕上则出现类似“系统呼叫 517 没有执行”这样的信息。我日日夜夜盯着屏幕上显示出来的系统呼叫,试着发现我在哪一条上面出了错。这比拿到一个系统呼叫的单子,然后一一使他们可以被执行要有意思多了。人们需要看到事情的进展。

到了八月底或九月初的时候,我的外壳程序终于可以工作了。过了这一关,后面的任务就轻松多了。

这可是一件大事。

我的外壳程序可以运行后,我马上开始着手其他几个程序,比如拷贝程序和列表程序,这些都比外壳程序简单得多。你所需的一发,外壳程序早就具备好了,所以一旦外壳程序完成,就好像是从 0 飞跃到 100 一样,因为一切都已就绪。这时,我已经拥有了一切必要的条件,感觉就像上帝创世纪那样,执掌一切地说:“让那里有光”,那里就真的有了光。在此之前,的确是一无所有。

是的,我深感满意。

这种满意很重要,因为那个夏天我除了伏在电脑面前,其他什么都没做。这么说一点也不夸张。芬兰四月到八月的日子是一年中最美好的时光。人们到布满小岛的海上航船,去海滩上晒日光浴,到夏日小木屋中消闲。但是我却在没日没夜地工作,不知哪一天是周末,哪一天是工作日。学生的黑色窗帘遮蔽了几乎昼夜灿烂的阳光,也遮蔽了整修世界。有些天――或夜晚?――我会从床上爬起来后直接坐到离床仅几英尺远的电脑旁。

爸爸显然在不断催促妈妈让我在暑假找份工作,但妈妈却不在乎:我并没有打搅她。萨拉会因为我有时上网使电话战线而有点恼火。她也许会写些毫不客气的话。毫不夸张地说,我和电脑之外的世界几乎没有任何联系。

当然,也许每周有一次,一个朋友会敲敲我的窗户,而我如果没在捣腾什么重要的编码时,会请他进来。我们会喝杯茶,也许还会挤在窄小的厨房里看一小时的 MTV 。现在回想起来,对了,有时乔科会来敲我的窗户,我们会出去喝点啤酒或玩司诺克台球。但是,诚实地说,那时我的生活也就这么简单了。

而我一点儿都不感觉自己是那种面色苍白、可怜兮兮的失败者。

外壳程序成功了。这意味着,我事实上已经建立起了可行的操作系统的基础,而我自己则乐趣无穷。

外壳程序成功之后,我开始检验其中的内装程序。接着我又编了足够的新程序,可以真正干点什么了。我用了 MINIX 中所有有用的东西。当我把外壳程序移到一个我为新的操作系统所建的特别区域中时,我开始把这个操作系统称为“ Linux ”。

坦率地说,我一开始并不想把它以 Linux 的名称发布出去,因为那显得我太自我中心了。那么,我为最终发布起的名字是什么呢? Freax (Freaks 的变形,该词为“异想天开”之意――译注。 ) 事实上,在一些早期完成的文件中,即那些说明如何汇编源代码的文件中,有将近半年的时间我一直使用 Freax 这个名称来指代这个操作系统。但这其实是无所谓的,因为当时还没有任何人知道它,所以它其实并不需要什么名字。

5 、开放源代码

来自:李纳斯托沃兹 torvalds@klaava.Helsinki.Fi ( 李纳斯 ? 托沃兹 ) 新闻组: comp.os.MINIX

题目:你在 MINIX 中最想看到什么?

总结:关于我的新操作系统的小型民意调查。

信息编号: 1991 年 8 月 25 , 9541@klaava.Helsinki.Fi 嗨,所有使用 MINIX 的人们,大家好 !

我在编一个 ( 免费的 ) 用于 386 (486) AT clones 的操作系统 ( 只是一个爱好,不会成为一个像 GNU 那样大型的专业软件 ) 。我从四月起就在酝酿,现在已准备就绪。我想听一听人们对 MINIX 有哪些欣赏或不满之处,因为我的操作系统和它有些相象 ( 尤其是文件系统的物理排列方式 ) 。

我目前已经装上了 bash (1.08) 和 gcc (1.40) ,看来一切进展顺利,估计几个月内我就会得出一些实用的东西。我想知道大多数人在这方面有什么要求。任何建议都欢迎,但我可不保证一定会采纳。

李纳斯 (torvalds@klaava.Helsinki.Fi) 附:对了,它不受任何 MINIX 源码的影响,并有一个多线程 FS 。记住,它不能安装 ( 比如使用 386 任务转换文件等等 ) ,也许永远不会支持除了 AT 硬盘之外的东西。情况就是这样。

使用 MINIX 人群中最坚定的操作系统的狂热者看到了火花。我没有收到多少有关 MINIX 特点的建议,但却有许多别的问题。

> 多告诉我们一点 ! 它需要 MMU 吗?

回答: 是的。

> 在多大程度上使用 C 语言?在装截中会有什么困难?不会有人相信你的不可“半截性”,比如说我就想把它装截到我的 Amiga 软件上。

回答: 它大部分使用 C 语言,但大部分人不会把我写的程序称作 C 语言。它使用了我能想到并找到的 386 的特征,我也想通过它充分了解 386 。我的一些 C 文件几乎和 C 语言一样是组合起来的。

如上所述,它也使用 MMU ,用于分页和分类 ( 还不能存进软盘里 ) 。正是分类使它成为一个真正的 386 的依赖者 ( 每项任务都有一个 64mb 的编码和数据分类文件。

甚至有几个人提出愿意做试用版的试验者。

最后,把它发布出去并不需要太大的决心。我一直习惯与人交流程序,所以要做的唯一真正决定就是,我敢于向人们展示这一系统软件的最佳时机是何时,才不会使自己感到不自在,或更确切地说,什么时候发布才使我将来不至于为此感到羞愧。

我最终想实现的是有一个编译器和一个能在 Linux 内部编程的真正的系统环境,而不必再用 MINIX 。但是当 gnu 程序可以运行时,我骄傲极了,愿意让整个世界都看到它。同时,我也想听到人们的反响。

外壳程序能运行时,我已为操作系统初步编了几个程序。其实还不能做什么,但你能看出和 UNIX 很相似。事实上,它运行起来像一个有点残疾的 UNIX 。

所以我决定将其发布出去。但我不会公开地告诉任何人,而是通过私人邮件告诉几个人――也许总共只有五到十个人吧――告诉他们我已将其上传到 FTP 地址上。其中包括阿里 ? 莱姆克,布鲁斯 ? 伊文斯,以及其他几个人。我还上传了 Linux 的源代码和几个用于初始运行的小程序。我告诉人们要运行这个系统应该怎样做。人们还是 MINIX386 版本――还必须有 GCC 编译器,事实上是我自己版本的 GCC 。所以我把这些也传了上去。

我们有了一个给发布的内容编号的协议。它其实只有心理意义。如果我认为自己的东西已经完善,我愿意将其定为 1.0 版本,而在此之前,我给出的编号就表示出距离 1.0 版本还有多远的距离。所以,我将上传发布的那个版本的操作系统定为 0.01 版,让大家知道它离最后完善还有很大的距离。

对了,我想起了上传那天的日期: 1991 年 9 月 17 日 。

我想只有一两个人看了我的作品。因为他们必须先费事地安装一个特殊的编译器,准备一个空间以便导入并汇编我的指令,然后却只能运行一个外壳程序。

基本上,运行外壳程序就是这个版本所能做的一切。它也可以把源文件打印出来,大概有一万行――如果字体小一点的话,大概不到一百页纸 ( 而现在大概要有一千万行了 ) 。

我发布这一操作系统的主要原因之一,是要证明我此前并非在说大话,而是我确实有所作为。在互联网上,说话没有太多责任。不管你做什么,不管是操作系统还是性,太多的人在这个计算机的虚假空间里弄虚作假。所以在告诉了那么多人你在发明一个操作系统之后,能够这样说真好:

“瞧,我真的做出了点什么。我没有在骗你们。这就是我所做的……”

6 、 Linux 有了用户

哦,阿里 ? 莱姆克,是他为我把这个系统上载到 FTP 地址上铺平了道路。

他极不喜欢 Freax 这个名字。倒喜欢我当时正在使用的另一个名字―― Linux ,并把我的邮件路径命名为 pub OS/Linux 。我承认我并没有太坚持。但这一切都是他搞的。所以我既可以不惭愧地说自己不是那么以个人为中心,也不得不承认自己并非完全没有自我意识。并且我认为,这是个不错的名字。

如上所述,我的操作系统并非很有用。比如,如果储存太多的东西,或仅仅是因为不小心,系统就会马上崩溃。而哪怕你并非不小心,如果让它运行时间稍长一点,也会崩溃。但是在那个阶段,它并不是给人运行的,而是让人看的。对了,是让人仰慕的。

所以它只是为给少数几个热衷于开发新的操作系统的人分离的。他们都是非常迷恋技术的人,甚至是技术迷当中的特殊兴趣小组。

他们的反应无一例外是积极的,但是这是一种“它要是能这样或那样就更好了”的肯定态度。或说:“看起来倒是挺酷,但是在我的电脑上根本就转不起来。”

我记得一个人在邮件中写道,他真的很喜欢我的操作系统,并用了至少一大段文字来描绘它的好处。接着他说我的系统吃掉了他的硬盘,而我的磁盘驱动程序则是“又娇气又脆弱”之类的。他丢失了他先前所有的文件,但他还是对我的操作系统持积极支持的态度。读这样的邮件很令人感动。事实上是一个软件“臭虫”毁了他的文件系统。

我的就是这种反应。我修补了几个程序上的瑕疵,包括那个当内存用完时就会死机的漏洞,而且还取得了一个,经 GCC 编译器装载到操作系统上,这样我就可以编写小的程序了。这也意味着使用者在运行这个操作系统之前不必先导入我的 GCC 编译器了。

你是否渴望回到那样的时代,当男人像男子汉并且能自己编写驱动程序?

―― Linux0.02 版本的上载宣言

十月初我发布了 0.02 版,包括了几个对瑕疵做的补丁程序和一些增加的新程序。十一月我又发布了 0.03 版。

我本来可能会在 1991 年底之前就洗手不干了。我已经做了很多自认为有意思的事。并非一切都绝对圆满,但在软件世界中,一旦你已解决了最根本的问题,兴趣就容易很快地消失。我也是那样。解决软件中存在的小问题并不是什么吸引人的工作。但接下来发生了两件让我继续下去的事,第一:由于失误,我破坏了我的 MINIX 分区;第二,人们不停地传给我反馈的意见。

那时,我在导入 Linux 时仍要把 MINIX 作为主要的开发环境。我在 Linux 系统下做的大部分事只是这我写的终端仿真器从学校的电脑上读邮件和新闻。

学校的电脑总是很难登录,所以我编了个可以自动拨号的程序。但是在十二月时,我本想自动拨 devtty1 ――这是系列电话线,但却错误地拨成了 devhda1 ,既硬盘分区,结果是我无意中覆盖了保存的 MINIX 中最重要东西的空间。是的,这也就意味着我不能再进入 MINIX 的环境了。

那就是我要做出抉择的一刻。

我可以重新装入 MINIX 系统,或者也可以将错就错,自认 Linux 已是足够的好,以至不再需要 MINIX 了。我将通过在 Linux 下编程来编译 Linux ,而只要我觉得需要 MINIX 中好的功能,我就把这些 MINIX 的优点编到 Linux 中。无疑,这是观念上重要的一步,因为你要摆脱原有的系统环境,使新的系统真的能够自我包容。这一步十分重大,因此我将十一月底发布的版本命名为 0.10 版。几个星期之后,就升级到了 0.11 版。

正是从那时起,开始有人使用这个系统并可以用它来做一些事了。

到那时为止,我已经修补了一系列的漏洞。但没有人向我提出新的建议。我记得为了满足更多存储的需要,我曾出过门,并将机器的内存从 4 兆升级到 8 兆。我还出去买了个浮点协同处理器 (floating point co-processor) ,因为人们开始问我 Linux 是否能支持他们的浮点协同处理器。

这个附加硬件使我的电脑能执行浮点运算 (floating point math) 。

我记得是在十二月,德国的一个计算机只有 2 兆内存却试图汇编 Kernel 的家伙,他也不能运行 GCC ,因为那时的 GCC 需要 1 兆以上的内存。于是,他问我 Linux 是否能用一个无需太多内存的较小的编译器来进行汇编。尽管我并不需要这个特别的功能,但我仍决定要为这个家伙实现这种功能。接着就出现了那个称为 page-to-disk 的东西,这就意味着尽管他只有 2 兆的内存,他也可以通过使用这个存储盘使他的电脑看起来宽敞一些。那是在 1991 年圣诞节前后。我记得曾在 12 月 23 日 那一天加班加点,努力使 page-to-disk 运行。到了 12 月 24 日 ,它已经可以在某种程度上运行了,但是每隔一会儿就死机。最后到 12 月 25 日 ,也就是圣诞节那天,它终于成功了。这可以说是我为满足别人而不是为自己的需要而增加的第

一项功能。

而我也为此感到很骄傲。

Linux 的用户天天都在增加,我也不断接到来自我曾向往的国度的电子邮件,包括澳大利亚和美国。关于此事,我在祖母家的圣诞聚会上对家人只字未提。不要问我为什么,我只是觉得没有必要和我的父母、姐妹或任何亲戚讨论这件事。他们不懂计算机。至少,我认为他们不懂计算机。

就他们而言,我每天干的事就是把电话线连到调制解调器上。当时的赫尔辛基,电话费在夜间可以打很多折,所以我在家的大部分工作都在深夜进行。但偶尔也会一整天地连在电话线上。我本想另接一条电话线,但是我母亲的公寓所在的大楼十分古老,没有额外的电话线,也不打算增加新的。那时我妹妹萨拉除了在电话上聊天之外也是无所事事,至少在我看起来是这样。所以我们会偶尔为抢电话线打架。真的会打起来。她和朋友打电话时,我会强行用“猫”拨号,她就会听到“嘀――嘀――”的声音。这自然会打断她,而她也就知道我确实、确实要上网收电子邮件了。

我可没说过自己是世界上最好的哥哥。

Page-to-disk 是一个相当庞大的程序,因为它是 MINIX 没有涉及到的东西。该程序出现在 0.12 版中,于 1992 年 1 月的第一个星期发布。人们马上开始不仅仅把 Linux 和 MINIX 相比较,而且开始和 Coherent 相比。后者是由 TK 开发的小型 UNIXclone 。从一开始,增加 page-to-disk 就使 Linux 在竞争中脱颖而出。

那是 Linux 起飞的开始。

突然间,人们纷纷从 MINIX 转向 Linux 。那时 Linux 尚不能胜任 MINIX 的所有工作,但是它还是可以做人们真正需要的大部分重要的工作。而它拥有一项人们特别喜欢的功能:有了 page-to-disk ,你可以运行超过你内存的巨大程序。这意味着,当超出内存之后,你可以将一块旧的内存存到磁盘上,要记存到了哪儿,仍然使用那块内存来解决你的问题。这在 1992 年的第一个星期是一件不寻常的事。

正是那个月, Linux 的用户从我知道名字并与其有邮件往来的五到十个人,增加到了成百上千我不知是谁的人。我并不认识每一个 Linux 的用户,这多有意思。

7 、 Linux 能换来金钱吗 ?

那时,互联网上正有一个恶作剧在盛行。

据说有个叫克雷格的可怜男孩得了癌症,正在死亡线上挣扎,而在网民中则流传着一个连锁邮件,让人们向这个男孩邮寄明信片以表示对他的支持。实际上这是某人的一个恶作剧,可能根本就没有克雷格这么个人,更别提什么癌症了。但是这一呼吁竟招来了上百万张明信片。所以我半开玩笑寺要求使用 Linux 的人给我寄明信片,而不用给钱。这像是一个人们会感叹“哦,上帝,又是一个要明信片的家伙 ! ”的玩笑。在那时的个人电脑世界中,有一个有关软件共享的牢固传统。你下载了一个程序,就应该给作者寄回十块钱左右的回报。所以我收到了很多邮件问我是否要人们给我寄三十块钱。就是在这种情况下,我觉得必须说点什么了。

现在回想起来,我觉得那些钱一定会很有用的。我已欠了大约五千美元的学生货款,同时每个月要为我的电脑支付约五十美元。我另外的主要消费是比萨饼和啤酒。但是由于开发 Linux ,我那时没有时间外出,最多每周出去一次。我不花钱约女孩子,把钱都花在了为我的电脑增加硬件上。也许要是换一个人,就会向大家要钱了,哪怕是为了减轻他那日夜辛苦劳动的单身母亲的负担呢?唉,我那时却没有想到这一点。去告我吧 !

那时,我更想知道都有哪儿的人在使用 Linux 。与收到钱相比,我更喜欢收到明信片。事实上,明信片确实在滚滚而来,从新西兰、从日本、从荷兰和美国。萨拉曾偶尔象征性地去取取信,突然意识到那总和他争吵的哥哥竟有来自那么遥远的朋友。那是她第一次认识到,在我总是占用电话线的时间里,我可能是在做一件会很有用的事情。那些明信片加起来足有几千封,但它们现在早已不知去向了,一定是在我某次搬家时丢掉了。我的朋友艾温坦说,我是他所见过的最不怀旧的人。

实际上,我不要钱还有很多原因。在最初发布 Linux 的时候,我觉得自己是在沿着几个世纪以来的科学家们和其他学术界人士的脚印在前进,而他们的成就往往建立在别人所打下的基础上――用牛顿的话来说,我是站在巨人的肩膀上。这样做,我不仅仅是在与别人分离我的成果,别人也将会觉得我的工作是有用的。我还想听到反响 ( 当然,是想听到赞扬 ) 。朝那些可能会帮助我改进工作的反馈信息要钱是没有。我想,如果我不是长在芬兰,我的态度会不完全不同。在芬兰,只是一个人稍微显露出一丝贪心的迹象,人们就会视之为可疑而不会羡嫉 ( 自从诺基亚电话公司开始赚整个世界的钱并充实了很多芬兰人的钱包之后,这一点已经有了一些变化 ) 。并且,对了,如果我不是在顽固的学究祖父和共产主义立场的父亲影响下成长起来的话,无疑我会对这件不要钱的事持不同态度。

无论如何,我不想把 Linux 卖掉,我也不想失去对它的控制权。也就是说,我不想别人把它买掉。早在九月上传每一个版本时,我就在有关复制的文件中表明了这个版权声明。根据十九世纪的波恩公约,除非你将其出卖,你拥有自己所创造的一切东西的版权。作为版权所有者,我开始定下了以下关于 Linux 的规则:

1 、人们可以免费使用该操作系统,但不得将它作为商品。

2 、 对其所作的改动和改进,必须以源代码的形式将其公开(而不是二进制,这是不公开的。 )

3 、如果不同意以上规定,则无权对它进行复制或从事任何行为。

你不妨自己设想一下。你为这个程序倾注了六个月的心血,你希望它是有用的,并且自己也能从中有所收获,但你肯定不想让它白白被人占去便宜。我想让大家都能够看到它和使用它,同时也可以随意对其进行改动和改进。但是,我也希望能确保我自己可以及时了解他们做过哪些改动。我希望自己有权使用源程序,这样,假如别人做了什么改进,我也可以利用它。我认为,要使 Linux 发展成最完美的技术就必须保持它的纯洁性。如果有铜臭渗透进来,事情就要变黑暗了。所以,如果不让钱的问题掺和进来,就不会有贪欲的参与。

尽管我没兴趣拿 Linux 去赚钱,但别的人却不这么认为,他们在给别人一份已经下载到软盘上的拷贝时都要索取回报。到了二月份,参加 UNIX 用户会议的人,几乎人人手上都有一张装有 Linux 系统的软盘。这些人也问我,他们能不能把 Linux 作为商品出售,比如说,只要五块钱,为的是收回软盘和时间上的成本。这听起来还有点道理,但问题在于,这样做就会侵犯了我的版权。

显然,我已经到了反思“ Linux 是非卖品”这一立场的时候了。

那时, Linux 已经在网上引发了很多讨论,这使得我很自信,再没有人能够窃取我的劳动成果了――而这曾经是我最大的担忧。至少,假如真有谁这样做了,他也难逃众人的谴责。如果有人想篡夺 Linux 并将其变为一个商业项目,必将会在网上掀起黑客的反对潮,会有无数黑客似的人物大声斥责道:“嘿,那是 Linux ,住手。”当然,措辞可不会如此文雅。

目录
设置
设置
阅读主题
字体风格
雅黑 宋体 楷书 卡通
字体大小
适中 偏大 超大
保存设置
恢复默认
手机
手机阅读
扫码获取链接,使用浏览器打开
书架同步,随时随地,手机阅读
首 页 < 上一章 章节列表 下一章 > 尾 页