第三章 編程的美妙
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系統也可以通過我的終端仿真器閱讀到我建立的文件。
這花費了我大量的精力:編程——睡覺——編程——睡覺——編程——吃飯(餅干)——編程——睡覺——編程——洗澡(沖沖了事)——編程。隨著工作的進展,這個項目很明顯正在成長為一個操作系統。所以我轉變了看法,不再把它看成一個終端仿真器,而是一個操作系統。這個轉變出現在我馬拉松似的編程過程中的哪個時間段,是在白天還是晚上,我已經想不起來了。也許在這一刻之前我還穿著破舊的睡袍奮力敲擊著鍵盤,在為終端仿真器更多的功能;而轉瞬之前我擁有的功能是如此之多,以至於整個體系已經變成了一個。
我把它稱之為我的“gun-emac終端仿真程序”(gnu-emac of ternimal emulation programs)。gnu-emac終端仿真程序開始是一個編輯程序,但創造它的人又為它增加了一系列功能。設計者本想讓它成為一個可以用程序控制的編輯程序,但是其程序可控性的特點很快使一切都黯然失色,它成為了一個從地獄中冒出來的編輯程序。它除了廚房水池子外幾乎無所不包,這就是為什麼這個編輯程序指令的圖標有時竟是一個廚房水池。這個編輯程序的一大特點就是,其設計過程比任何其他編輯器都更復雜。
我的終端仿真器也是如此。它在不斷地擴張。
3、尋求網上幫助
來自:
[email protected](李納斯?托沃茲)
討論組:comp.os.minix
主題:Gcc-1.40和一個有關POSIX的問題
信息名稱:1991 Jul 3,
[email protected]
日期: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(bash的英文意為“重擊”——譯注)。
當你試著從磁盤運行或導入一個真實的程序時,一般都會有“臭蟲”(bug,IT業中稱軟件裡的瑕疵為“臭蟲”——譯注)出現在磁盤驅動程序或導引程序中,因為程序往往會不理解它讀到的東西,於是它就會在屏幕上顯示出相關的信息。這很重要,你可以從中知道哪兒出了毛病。
於是,我就到了這樣一個階段:我試圖導引外殼程序,屏幕上則顯示出外殼程序中每一個我尚未能執行的系統呼叫。我導入並運行外殼程序,屏幕上則出現類似“系統呼叫517沒有執行”這樣的信息。我日日夜夜盯著屏幕上顯示出來的系統呼叫,試著發現我在哪一條上面出了錯。這比拿到一個系統呼叫的單子,然後一一使他們可以被執行要有意思多了。人們需要看到事情的進展。
到了八月底或九月初的時候,我的外殼程序終於可以工作了。過了這一關,後面的任務就輕松多了。
這可是一件大事。
我的外殼程序可以運行後,我馬上開始著手其他幾個程序,比如拷貝程序和列表程序,這些都比外殼程序簡單得多。你所需的一發,外殼程序早就具備好了,所以一旦外殼程序完成,就好像是從0飛躍到100一樣,因為一切都已就緒。這時,我已經擁有了一切必要的條件,感覺就像上帝創世紀那樣,執掌一切地說:“讓那裡有光”,那裡就真的有了光。在此之前,的確是一無所有。
是的,我深感滿意。
這種滿意很重要,因為那個夏天我除了伏在電腦面前,其他什麼都沒做。這麼說一點也不誇張。芬蘭四月到八月的日子是一年中最美好的時光。人們到布滿小島的海上航船,去海灘上曬日光浴,到夏日小木屋中消閒。但是我卻在沒日沒夜地工作,不知哪一天是周末,哪一天是工作日。學生的黑色窗簾遮蔽了幾乎晝夜燦爛的陽光,也遮蔽了整修世界。有些天——或夜晚?——我會從床上爬起來後直接坐到離床僅幾英尺遠的電腦旁。
爸爸顯然在不斷催促媽媽讓我在暑假找份工作,但媽媽卻不在乎:我並沒有打攪她。薩拉會因為我有時上網使電話戰線而有點惱火。她也許會寫些毫不客氣的話。毫不誇張地說,我和電腦之外的世界幾乎沒有任何聯系。
當然,也許每周有一次,一個朋友會敲敲我的窗戶,而我如果沒在搗騰什麼重要的編碼時,會請他進來。我們會喝杯茶,也許還會擠在窄小的廚房裡看一小時的MTV。現在回想起來,對了,有時喬科會來敲我的窗戶,我們會出去喝點啤酒或玩司諾克台球。但是,誠實地說,那時我的生活也就這麼簡單了。
而我一點兒都不感覺自己是那種面色蒼白、可憐兮兮的失敗者。
外殼程序成功了。這意味著,我事實上已經建立起了可行的操作系統的基礎,而我自己則樂趣無窮。
外殼程序成功之後,我開始檢驗其中的內裝程序。接著我又編了足夠的新程序,可以真正干點什麼了。我用了MINIX中所有有用的東西。當我把外殼程序移到一個我為新的操作系統所建的特別區域中時,我開始把這個操作系統稱為“linux”。
坦率地說,我一開始並不想把它以linux的名稱發布出去,因為那顯得我太自我中心了。那麼,我為最終發布起的名字是什麼呢?Freax(Freaks的變形,該詞為“異想天開”之意——譯注。) 事實上,在一些早期完成的文件中,即那些說明如何匯編源代碼的文件中,有將近半年的時間我一直使用Freax這個名稱來指代這個操作系統。但這其實是無所謂的,因為當時還沒有任何人知道它,所以它其實並不需要什麼名字。
5、開放源代碼
來自:李納斯托沃茲
[email protected] (李納斯?托沃茲)
新聞組:comp.os.MINIX
題目:你在MINIX中最想看到什麼?
總結:關於我的新操作系統的小型民意調查。
信息編號:1991年8月25,
[email protected]
嗨,所有使用MINIX的人們,大家好!
我在編一個(免費的)用於386(486) AT clones的操作系統(只是一個愛好,不會成為一個像Gnu那樣大型的專業軟件)。我從四月起就在醞釀,現在已准備就緒。我想聽一聽人們對MINIX有哪些欣賞或不滿之處,因為我的操作系統和它有些相象(尤其是文件系統的物理排列方式)。
我目前已經裝上了bash (1.08)和gcc (1.40),看來一切進展順利,估計幾個月內我就會得出一些實用的東西。我想知道大多數人在這方面有什麼要求。任何建議都歡迎,但我可不保證一定會采納。
李納斯(
[email protected])
附:對了,它不受任何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、 得將它作為商品。
4、 對其所作的改動和改進,5、 必須以源代碼的形式將其公開(而6、 不7、 是二進制,8、 這是不9、 公開的。)
10、 如果不11、 同12、 意以上規定,13、 則無權對它進行復14、 制或從事任何行為。
你不妨自己設想一下。你為這個程序傾注了六個月的心血,你希望它是有用的,並且自己也能從中有所收獲,但你肯定不想讓它白白被人占去便宜。我想讓大家都能夠看到它和使用它,同時也可以隨意對其進行改動和改進。但是,我也希望能確保我自己可以及時了解他們做過哪些改動。我希望自己有權使用源程序,這樣,假如別人做了什麼改進,我也可以利用它。我認為,要使linux發展成最完美的技術就必須保持它的純潔性。如果有銅臭滲透進來,事情就要變黑暗了。所以,如果不讓錢的問題摻和進來,就不會有貪欲的參與。
盡管我沒興趣拿linux去賺錢,但別的人卻不這麼認為,他們在給別人一份已經下載到軟盤上的拷貝時都要索取回報。到了二月份,參加UNIX用戶會議的人,幾乎人人手上都有一張裝有Linux系統的軟盤。這些人也問我,他們能不能把Linux作為商品出售,比如說,只要五塊錢,為的是收回軟盤和時間上的成本。這聽起來還有點道理,但問題在於,這樣做就會侵犯了我的版權。
顯然,我已經到了反思“linux是非賣品”這一立場的時候了。
那時,linux已經在網上引發了很多討論,這使得我很自信,再沒有人能夠竊取我的勞動成果了——而這曾經是我最大的擔憂。至少,假如真有誰這樣做了,他也難逃眾人的譴責。如果有人想篡奪Linux並將其變為一個商業項目,必將會在網上掀起黑客的反對潮,會有無數黑客似的人物大聲斥責道:“嘿,那是Linux,住手。”當然,措辭可不會如此文雅。
事情的發展已經勢不可擋:世界各地的黑客們每天都在共同分享彼此提出的修改建議。
我們正在集體創造一個最好的操作系統,這種發展軌道已經不可改變。正因為如此——因為linux已廣為人知,我才覺得把它作為商品也是可以接受的。
但是,在使我自己看起來像個慈善先生之前,還有另一個關鍵的因素使我做出了這一決定。事實是,為了使linux有用,我曾依賴過很多在網上免費下載的工具——我把自己放到了巨人的肩膀上。這些免費軟件中最重要的是GCC編譯器,它是理查德?斯多曼的傑作,並且已經在公共執照協會(GPL)上注冊了版權。在GPL條款之下,錢不是問題,只要有人願意買,你可以賣一百萬美元。但是,你必須提供軟件來源。而得到或買到你的來源的人,將擁有和你一樣多的對於該程序的。這實在是很高明的一招。我認可GPL的原則,但是和那些認為所有的軟件創新都應該在GPL下向全世界公開的頑固的GPL信仰者不同,我認為發明者本人有決定如何處置自己的發明的權利。
於是,我拋棄了自己舊有的版權聲明,采納了GPL的內容,一個斯多曼也曾經和他的律師一道簽署過的文件(因為有律師的參與,該文件被搞得洋洋灑灑有好幾頁)。
新的版權聲明被放進了0.12版本中。但是,我記得在發布當晚我從睡夢中醒來,想到商業利益將可能有點古怪,因為當時所涉及的商業利益真是不多。但不知怎的,我覺得自己應該小心。我的擔心之一是——現在仍然是——有人將絲毫不尊重我的版權地將linux擄去。我擔心,在現實中,如果有個美國人侵犯了我的版權,我無法對其提起訴訟。現在這仍是我的擔心。狀告某人侵權很容易,而我的擔心是,有的人會即使被起訴也繼續從事這種違法行為,除非加諸某種強制執行的法律行動他們才會停止。同時我也不斷地擔心,在像中國這樣的地方,企業並不承認GPL的效力,從而也不會尊重我的版權。
事實上,這些地方的法律體系對侵犯版權的制止在當時並不得力(中國已經簽署了一系列的國際公約,李納斯在這裡談的是1991年的情況——譯注),而且,為防止違法行為的投入在這些地方被認為是不劃算的。大軟件公司和唱片公司曾作過努力,但是成效不大。
不過,事實減輕了我的擔憂。有的人確實會暫時侵犯我的版權,但是他們往往也是那些尊重版權、反饋改進意見、使系統功能得以提高的人。他們將是系統升級過程中的一分子。相反,那些不尊重版權的人們則不會利用這些升級,他們的顧客也會離他們而去——我希望。
總的來說,我從兩個方面看版權。比如一個每月掙五十美元的人,他可能會為一個軟件花費二百五十美元嗎?如果花一點錢買非法拷貝軟件,而把五個月的工資用於吃飽肚子,我一點不覺得他不道德。這種侵權是道義上可以接受的。去追捕這種“侵權者”是不道德的,更不要說簡直就是愚蠢的。就linux而言,誰在乎如果只將其用於個人目的時,一個人是否真正遵循了GPL呢?那些想藉此賺大錢的人們,才是真正不道德的,不管他們是在美國還是非洲,也不管程度如何。
貪欲從來就不是善的。
8、MINIX對linux
引人注目並非全是好事。
我從不擅長處理對抗,但也被迫站出來為linux和我的尊嚴辯護,因為安德魯?塔南鮑姆不斷攻擊我的Linux取代了他的MINIX操作系統。我們都是網蟲,所以論戰是通過電子信件進行的。
他只穿著件T恤就渾身冒火,能怪誰呢?
在還沒有linux討論組之前,我一般都是在MINIX討論組上宣布有關Linux的信息和尋找對這個操作系統感興趣的人。對此,安德魯怎麼會高興呢?
所以,開始的時候,他對我入侵他的討論組有些不快。很顯然,他也很不高興自己的操作系統正在被一個來自芬蘭雪原的新發明奪去光彩,而且看來有眾多的軟件設計者正在加入進去。同時,他對應該如何創建操作系統持與我對立的觀點。那時,安德魯屬於主張以微內核的方法建立操作系統的計算機科學家陣營。他把MINIX做成適用於微內核和Amoeba(一種他當時正在創建的也適用於微內核的系統)的形式。
適用於微內核的系統在八十年代晚期和九十年代早期十分盛行,而linux的成功威脅到了這一運動。所以他不斷地在網上帖一些難聽的帶攻擊性的帖子。
微內核的理論依據是,操作系統是非常復雜的,所以要通過模式化來減少復雜性。微內核方法的原則,即核心的核心,是晝減少功能。它的主要功能是傳播。電腦所提供的一系列不同的服務都是通過微內核的傳播渠道實現的。因此,應盡量分割問題的空間,使其不再復雜。
我認為這種做法很愚蠢。
是的,每一個單獨的部分是簡單的,但是相互作用的多種功能如果放在一起就要復雜得多,而linux就是後者的情況。想一想自己的大腦。每一個單獨的部分都很簡單,但是各部分的相互作用構成了一個復雜的系統。這是一個整體比個別更大的問題。拿一個問題來說,如果你簡單地將問題一分為二,說半個問題要容易一半,那麼你就忽略了一個事實,即:你必須要考慮到兩個半個之間的聯系所帶來的復雜性。微內核的理論是,如果把核分為五十份,那麼每一份都只有五十分之一的復雜性。但是每個人都忽視了一個事實,即各部分之間的聯系事實上比源系統更加復雜,而且那些個別部分也不是那麼簡單。
這是我對微內核最重要的反駁:你想實現的簡單化是錯誤的簡單化。
開始時,linux是一個較小的軟件,而且簡單得多,沒有必要進行模式化。所以用Linux可以比MINIX更直截了當地做很多事。我最初發現MINIX的缺陷是,如果你同時運行五個軟件,五個軟件都要讀不同的文件,那麼五項任務要一個一個地先後進行。換句話說,你要向系統發出五次請求:“我可以讀文件X嗎?”文件系統主管讀取的後台駐留程序先接受一個請求,對其進行回應,然後再接受一個,再進行回應……
linux系統只有一個核,在這個系統之下,五個不同的過程都對核進行系統呼叫。核必須要十分小心,不會將其混淆,但是它會很自然地讓各個過程各行其是。因此Linux更加快捷高效。
MINIX的另一個毛病是:盡管你有了源代碼,但是許可證並不允許你做很多事情。拿布魯斯?伊文斯來說,他對MINIX做了重大改進,使其更易在386上使用,但是他卻無法將其所做的改進納入原系統之中,因為MINIX限制人們對其進行修改。從實用的角度來說,這不啻是一個災難。使用者哪怕為了得到一個可使用的系統都要經過多個步驟,這真是太不實用了。
就這樣,我與安德魯?塔南鮑姆結束了交戰,那是在1992年年初。想象一下,在一個暴風雪過後的早晨,你看見這樣一條信息:
來自:安德魯塔南鮑姆
[email protected](安德魯?塔南鮑姆)
新聞組:comp.os.MINIX
題目:linux過時了。
日期:1992年1月29日,格林威治時間12:12:50
我在美國待了幾個星期,所以沒來得及對linux做多少評論(不是說如果我在,我就會說什麼)。但是,Linux確實值得一評。我現在就有話要說。
正如你們所知,MINIX只是我的愛好,每當晚上我寫煩了書,如果當時沒有什麼戰爭、革命、CNN直播的參議院聽政會,我就會擺弄MINIX。我的真正職業是大學教授和操作系統領域中的研究人員。
由於我的職業,我想我知道在今後的十年左右時間裡操作系統會向何處發展。有兩個方面引人注意:
1)微內核對Monolithic system
大多數操作系統是獨立一體的,也就是說,整個操作系統是一個單獨的a.out文件,一個“核形式”運行。這種二進制中有管理過程、存儲管理、文件系統及其他。這類操作系統目前有UNIX,MS-DOS,VMS,MVS,OS/360,MULTIC以及其他很多。
另一種則是基於微內核的系統,在這種系統中大部分OS都作為單獨過程進行,還有許多通過溝通在核外運行。核的任務是管理信息仁慈,控制中斷的情況,低層次的過程管理,還可能有I/O。這種形式的操作系統有RC400,Amoeba,Chorus,Mach,以及尚未發行的WindowsNT。
在我詳盡論述兩者的利弊之前,可以說那些設計了這兩個操作系統的人們之間的急診已基本結束。微內核勝出。Monolithic system唯一的優點在於運行上,而現在有足夠的證據證明,微內核系統也能和Monolithic system一樣快。
MINIX是一個基於微內核的系統。文件系統和存儲管理相分離,在核外運行。I/O驅動也是分離的(在核中,只是因為英特爾中央處理器中的大腦是死的這一原因,才很難尋求其他的做法)。
linux是Monolithic風格的系統。這一做法是回到七十年代的一大退步,就像對一個令人激動的C程序以BASIC語言重新編寫。對我來說,在1991年還寫一個Monolithic system的系統是一個不折不扣的壞主意。
2)不分界域性(Portability)
很久很久以前有一種4004CPU,它成熟後變成了8008,接著它接受了整形手術,就成了8080。由8080誕生了8086,接下來是8088,再後來是80286、80386、80486,一直到了第n代。同時還出現了RISC芯片,有些能以100MIPS運行。200MIPS的速度以及更高能在近幾年中出現。這些都不會馬上消失,而是會很快從80*86發展開去。它們會通過在軟件中解析80386來運行舊式的MS-DOS程序。我認為任何一個架構設計OS都是極大的錯誤,因為它會很快消失。
MINIX的設計就是不分界域性,並已從英特爾ported到680*0(Atari,Amiga,蘋果),SPAC,以及NS32016。linux緊緊地與80*86聯系在一起,方向錯了。
別誤解我,我並非不喜歡linux,主要是Linux會使所有那些想在BSD UNIX上運轉MINIX的人棄我而去。坦誠地說,對那些想獲得一個“現代的”免費OS的人們,我想建議他們找一個基於微內核的、portable的操作系統,如GNU之類。
安德魯?塔南鮑姆(
[email protected])
附:順便說一下,Amoeba有一個UNIX仿真器(在用戶的空間中運行),但是還遠未完成。若有人有志在此方面努力的話,請告訴我。運行Amoeba需要幾個386,其中一個要有16M,所有的都必須具備WD以太網卡。
於是,我知道有必要維護自己的榮譽了,所以就有了下面的反擊:
來自:李納斯本尼迪克特托沃茲
[email protected](李納斯?本尼迪克特?托沃茲)
題目:回復“linux是過時的”
日期:1992年1月29日,格林威治時間23:14:26
組織:赫爾辛基大學
看到這種言論,我想我得有所回應了。先向那些已經聽夠了對linux系統進行的議論的MINIX用戶們說聲抱歉。我很想能“對誘餌視而不見”,但是……該是我好好地自我辯護的時候了。
安德魯塔南鮑姆寫道12595@star,cs,vu,
[email protected](安德魯?塔南鮑姆)寫道:
>我在美國待了幾個星期,所以沒來得及對linux做多少評論(不是說如果我在,我就會說什麼)。但是,Linux確實值得一評。我現在就有話要說。
>正如你們所知,MINIX只是我的愛好,每當晚上我寫煩了書,如果當時沒有什麼戰爭、革命、直播的參議院聽政會,我就會擺弄MINIX。我的真正職業是大學教授和操作系統領域中的研究人員。
你用這個作為MINIX局限性的借口?對不起,但是你輸了。我的借口比你的還多,而linux在很多領域還是勝MINIX一籌。更別說MINIX的大部分似乎是由布魯斯?伊文斯編寫的了。
反駁一:你說你把MINIX當作愛好來玩——那麼,請問是誰在拿MINIX掙錢呢?又是誰在免費發送linux呢?再來談談愛好。讓MINIX能免費獲得,我對MINIX的最大抱怨就會消失。Linux在很大程度上對我是一個愛好(但是一個很嚴肅的愛好,最棒的一種愛好)。我沒有從我的愛好中賺一分錢,它也不是我在大學要修的課程之一。我是純粹用我自己的時間,在自己的機器上做出來的。
反駁二:你是教授和研究人員。這真是一個MINIX出現核心缺陷的好借口。我只能希望Amoeba不會像MINIX那樣垮掉。
>1.微內核對Monolithic system
沒錯,linux是Monolithic的,我同意微內核是好一點兒。如果不是你的話題有爭議性,我可能會同意你的大中分意見。從理論角度(及審美角度)而言,Linux輸了。如果GNU的kernel在去年春天就已完善的話,我可能就不會開始這個工程。而事實是,GNU還沒有完善,也遠非如此。如果現在就已實現的這一點而論,Linux才大獲全勝。
>MINIX是一個基於微內核的系統。linux是Monolithic的系統。
如果這是判斷一個kernel好壞的唯一標准,你的觀點就對了。但你沒提到的是,MINIX在微內核方面的表現並不出色,而且對核內多元任務的操作仍存在著問題。如果我做的是一個在多線文件系統上有問題的OS的話,我就不會這麼快來責備別人。而事實上,我竭盡所能來使人們忘記軟件設計者在此問題上的慘敗。
(是的,我知道MINIX擁有眾多黑客支持者,但他們只是黑客。而布魯斯?伊文斯告訴我有很多可以競爭的機會。)
>2.不分界域性
“不會界域性是給那些寫不出新程序的人們准備的。”
——我,現在剛說的,口出狂言
事實上,linux比MINIX更具有分界域性。“你說什麼?”我聽見你說。是真的——但卻不是在你所說的意義上。我使Linux盡量符合標准(我當時手邊並沒有POSIX標准)。把程序移植到Linux上比到MINIX上要容易得多。
我同意,不分界域性是個好東西,但是只有在它確實有意義的地方才是個令人向往的特性。沒有必要專門使一個操作系統太具有不分界域性:能粘到可移植的API上就行了。操作系統的實質就是利用硬件的特點,並將其隱藏在一層高級的呼叫後面。而linux就是如此,它比任何kernel都更多地利用了386的特性。當然這便利真正意義上的kernel變得不可移植,但是這也使設計大為簡化,是一個可以接受的權宜之計,因為這首先保證了Linux的誕生。
我也同意,linux又太不具有不分界域性了。去年一月我擁有了自己的386,而Linux系統的創建在一定程度上成為了一個讓我認識386的項目。如果要成為一個真正的項目,必須能夠在不分界域性方面做一些事情。但是,我最初的設計思想就是沒有考慮到不分界域性,如果我這樣說並不是太過分地為自己辯護。去年四月我開始這個項目時,認為不會有什麼人會真的使用它。我很高興我的這個想法錯了。隨著我對源代碼的發布,每個人都可以免費來裝截Linux,哪怕還不是很方便。
李納斯
附:很抱歉我有時言辭過激。如果你沒有其他的操作系統可供選擇的話,MINIX已經挺好的了。如果你有五到十個386機器閒著沒用,那麼Amoeba也會不錯,只是我確定無疑是沒有的。我一般不會勃然大怒,但是在涉及到linux的問題時,我是有點容易感情用事。
在這件事上還有一些口舌,那是我唯一一次發火。但是我要說明的問題是:的確有反對的聲音出現,哪怕在早先的日子裡(或者我還證明了這一點:當你參加網上論壇時,一定要小心從事,打字錯誤和語法錯誤會永遠糾纏著你)。
我和李納斯把家人和朋友留在露營地,開始沿著一條清流的小溪做一次午後散步。我們的露營地是在東西亞拉(Eastern Sierra)一個叫格魯夫爾溫泉(Grover Hot Springs)的地方。此時是七月四日國慶日的周末,這裡的風光秀美得好像是把《國家地理雜志》上的照片原封不動搬下來似的。“現在是柯達一刻,”李納斯一邊背誦著廣告詞,一邊停下來欣賞著突兀的峭壁背景下鋪滿野花的草地。隨後,我們在溪邊坐下。我讓他描述一下他的生活,尤其是自從linux越出了其發源地——即由他認識的那些參加新聞討論組的狂熱愛好者組成的小圈子——而廣泛地傳播開來之後,他的生活有何變化。
“這種感覺一定很棒,”我說道,“那些年你一直跳不出戶,除了你的電腦之外只和這個世界保持著僅有的一點點聯系。突然間,這個星上的每一個角落都有人認識到你正在進行的偉大工作,你成了這個對你寄予厚望的發展中的linux世界的中心……”
“我從不認為這對我來說是什麼大事情,”他回答道,“我真的不認為是這樣。對我來說,linux確實是那種我隨時都在思考的東西,但這主要是因為總有問題需要我去解決。我確實為它投入了很多,但主要是因為它是一個智力的挑戰,而不是因為任何感情的因素。
“我喜歡有這麼多的人給我從事這個事業的動力,我曾認為自己已接受於完成它了,但我一直沒有真正做到這一點。人們始終給我更多繼續的理由,以及更多困擾的棘手難是,這使得繼續完善linux變得更為有趣。否則,我可能早就干其他事情去了。但我沒有,因為這是我喜歡的工作。做這件事充滿樂趣。我懷疑,我對自己的大鼻子或其他這方面的事情的提成,顯然比在Linux上花費的精力還要多。”
幾個星期後,在斯坦福購物中心,李納斯為怎樣挑選一雙慢跑鞋而犯愁。“你一般每星期跑多少裡地?”售貨員問李納斯。李納斯不由得笑了起來:在過去十年裡他還從未?上過一裡地。鍛煉不是過去的首選功課。但在他感到疲憊的時候,李納斯承認他願意走出過度的自我監禁式生活。
“塔芙一定求過你,要你幫我去掉大肚子。”他開著開玩笑,一邊拍著自己的肚子。
“告訴她,她的要求你本周內絕不可能達到。”我回答道。
接下來的一個半小時,我們開始在斯坦福校園裡兜圈,以便找到一個可以合法停車的地方。然後,在伸展了一下胳膊腿之後,我們開始跑了起來。我們越過干涸的湖裡狹窄的泥土小道來到林中,向著我們的目標——山頂巨大的衛星接收天線——前進。當然,我們根本沒有跑到那兒。我一邊邁著不尋常的輕快步伐奔跑,一邊很驚訝李納斯能夠僅僅以一裡的距離落在我後面而不被甩開。接著他終於不行了,幾分鐘後,我們在邊的草上上舒展地躺了下來。
“你的家裡人對因linux而發生的一切事情的反應是怎樣的?”我問道,“他們對此一定感到非常的激動。”
“我不認為有誰真的對此很在意,”他回答道,“我不是說沒有人真的關心這件事。但我一直花費我最多的時間在編程序上,這一次也與以前沒什麼不同,他們不至於為此而有什麼更多的關切。”
“那麼,你一定曾對你的親屬們說過些什麼。比如當你和你爸爸一同出動時,你是否曾對他說:‘嘿,你可能不會相信我一天到晚在計算機上鼓搗的那個玩藝兒現在怎麼樣了,現在已經有好幾百人在用它了……”
“沒有,”他回答道,“我只是覺得沒有必要與家人和朋友分享這些,我從來也沒有想過要把它推薦給更多的人。我想起了在我寫linux程序時,拉素曾經決定要買Xenix,UNIX的SCO系統版(微軟開發的用於PC機的UNIX版本)。我記得他曾經試著勸說我‘不要在這上面犯錯誤了。’他的意思是叫我不要再繼續寫下去了。但我不在意他的話,最終,在這個問題上他也有所轉變。但對我來說,Linux仍然不是什麼大事情。在我看來,人們使用它固然是好事情,能夠從中獲得反饋意見也很棒,同時這些卻並不是那麼重要。我不想傳播什麼福音。我為人們使用我的代碼而感到驕傲,但我從來也沒有過要與所有人共同分享它的念頭。我從來沒有認為這是世界上最重要的事情。我也不認為有幾百人用我的軟件有任何的重要性可言,以至要告訴我爸爸。不是的,它對我來說更多的是一種樂趣。直到今天我也還是這麼認為。”
“那麼,你甚至都沒有想過告訴你的父母、家人和朋友這些事嗎?你自己真的不為這些事情而激動嗎?”我問道,沒有掩飾我的懷疑。
他沉吟了幾秒鐘,然後回答道:“我不記得我當時是否感到過激動。”
李納斯買了一部新車,一部按他的定義很有“樂趣”的寶馬Z3雙座敞篷車,車身是金屬藍,完善的男孩子的汽車顏色。他選中這款顏色是因為沒有他所中意的亮黃色。這黃色的寶馬,他解釋道,“看起來就像尿。”幾年來,他去位於聖克拉拉的Transmeta公司總部上班時,總是將他的龐蒂亞克車盡可能停在離大門口近的地方。但現在,他卻將心愛的寶馬車停在他辦公室外的窗前,按他的廉潔這樣可以停在陰影中避免暴曬。於是,現在李納斯在電腦前工作時就可以不時地欣賞一下他的新車了。
大約在一年多以前,我們曾經首次在一起外出旅行——開著我特意租來的白色野馬敞篷車翻山去聖克塔克魯茲。在我們這次旅行期間,李納斯曾停下來觀察我們所參觀的桑拿浴場和釀酒廠外停著的運動型轎車。現在,我們是在他自己的運動轎車裡翻山越嶺。當他在十七號公路上駛過彎路時,他臉上浮起微笑。