• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 505  文章 - 1034  trackbacks - 0
            <2008年3月>
            2425262728291
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345


            子曾經(jīng)曰過:編程無他,唯手熟爾!

            常用鏈接

            留言簿(94)

            隨筆分類(649)

            隨筆檔案(505)

            相冊

            BCB

            Crytek

            • crymod
            • Crytek's Offical Modding Portal

            Game Industry

            OGRE

            other

            Programmers

            Qt

            WOW Stuff

            搜索

            •  

            積分與排名

            • 積分 - 911297
            • 排名 - 14

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            第三章 編程的美妙

            1、開始編程

            我真不知道該如何闡釋自己對編程的狂熱,但我可以試試。

            對于任何編程的人來說,編程是世界上最有趣的事。它比下棋之類的游戲更有樂趣得多,因為它可以由你自己來制訂游戲規(guī)則。而你制定什么樣的規(guī)則,也就會導(dǎo)出與此規(guī)則相符合的結(jié)果。

            然而,對于編程外行的人來說,它卻似乎是世上最枯燥的事。

            編程給人帶來的最初興奮的原因有部分是顯而易見的,那就是:通過編程你可以支配一臺計算機(jī),你叫計算機(jī)做什么,它就做什么,永遠(yuǎn)準(zhǔn)確無誤,而且毫無怨言。

            這本身就很有意思。

            但是計算機(jī)在一開始讓你入迷的盲從性,顯然不得它成為招人喜愛的伙伴。事實(shí)上,這種特性很快就讓人厭煩了。真正使編程令人欲罷不能的是:你能讓電腦做你想做的事,但是你還必須想出怎樣做到的辦法。

            我個人認(rèn)為,計算機(jī)科學(xué)和物理科學(xué)有很多相似之處。兩門學(xué)科都是在一個相當(dāng)基礎(chǔ)的層面上探討一個體系是怎樣運(yùn)行的。當(dāng)然,區(qū)別在于,在物理學(xué)中,你探究的是一個已經(jīng)存在的客觀世界的構(gòu)成。而在計算機(jī)科學(xué)中,你卻是在創(chuàng)造一個前所未有的體系。

            在電腦世界中,你就是創(chuàng)世者,你對所發(fā)生的一切擁有最終的控制。如果你功力深厚,你可以是上帝——在一個較小的層面上。

            我這么說恐怕要得罪地球上近一半的人口了。但是的確如此。你開始創(chuàng)造自己的世界,而唯一限制你的就是機(jī)器的性能,以及——在今天尤其如此——你自己的能力了。

             

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

            你可以建筑一個這樣的房子,有一個活板門,既穩(wěn)固又實(shí)用。但是每個人都可以看出一個僅僅以堅固實(shí)用為目的的樹上小屋和一個巧妙地利用樹本身特點(diǎn)的美妙小屋之間的差異。這是一個將藝術(shù)和工程融為一體的活計。編程與造樹上小屋有相似之外,這是它之所以被看成是一項既有魅力同時又有實(shí)際貢獻(xiàn)的活動的原因之一。在編程中,實(shí)用的考慮往往被置于有意思、美觀伶俐或有震撼力的考慮之后。

            編程是對創(chuàng)造的訓(xùn)練。

            探究計算機(jī)工作原理的過程,是吸引我走進(jìn)編程世界的最初原因。在這其中獲得的最大的樂趣在于,我認(rèn)識到了計算機(jī)科學(xué)與數(shù)學(xué)的類似:你必須從該體系自身的規(guī)則出發(fā),推演出整個世界,在物理科學(xué)中,你被客觀規(guī)律所束縛。但是在數(shù)學(xué)和編程中,只要能合乎邏輯地推演,就可以成立。思考數(shù)學(xué)問題,不會受到客觀世界的邏輯的限制,數(shù)學(xué)只是邏輯自洽的符號體系。正如任何一名數(shù)學(xué)家都明白的,人完全可以建構(gòu)出一套數(shù)學(xué)等式,以證明三加三等于二。事實(shí)上,你想有什么樣的體系就可以什么樣的體系。但是,隨著復(fù)雜程度的提高,你必須多加小心,不要弄出什么與你創(chuàng)造的體系不一致的東西。

            好的體系容不得任何錯誤。編程也與數(shù)學(xué)一樣是這么回事兒。

             

            人們對電腦如此著迷的原因之一,就是能從中獲得自己創(chuàng)造一個新世界的體驗,并貪圖到它到底能夠成為什么樣子。在數(shù)學(xué)中,人們往往按照客觀事物的可能性進(jìn)行思想實(shí)驗。比如,說到幾何時,大部分人想的是與我們的經(jīng)驗相符合的歐幾里得幾何學(xué)。但是電腦卻可以幫助人們形象化不同的幾何,并不僅僅是歐幾里得幾何學(xué)。在電腦的幫助下,人們可以形象化這些虛構(gòu)的世界,看到那些世界到底是什么樣子。還記得Mandelbrot set嗎——基于Benoit Mandelbrot等式的fractal images。要不是電腦,純粹的數(shù)學(xué)世界絕不能這樣形象地展示出來。Mandelbrot就是人為地制定了一些本不存在的與現(xiàn)實(shí)沒有一點(diǎn)關(guān)系的世界規(guī)則,卻創(chuàng)造出了的圖案。通過編程和電腦,你能夠構(gòu)筑一個新世界,有時其設(shè)計會是非常美妙的。

            但是在大部分時間中你卻不能欣賞自己創(chuàng)造的美妙世界。你只不過是在編寫執(zhí)行某一任務(wù)的程序。這時你就不是在創(chuàng)造一個新世界,而是在電腦世界中解決一個具體的問題。問題通過將思考結(jié)果應(yīng)用到問題中而得到解決。而能夠坐下來,盯著電腦屏幕,將一個問題徹頭徹尾地貫穿思考,就需要某種特定的人。

            比如,需要像我這種書呆子氣十足的人。

             

            操作系統(tǒng)是計算機(jī)的所有功能的基礎(chǔ)。而創(chuàng)造一個操作系統(tǒng)則是最終的挑戰(zhàn)。

            創(chuàng)造操作系統(tǒng),就是去創(chuàng)造一個所有應(yīng)用程序賴以運(yùn)行的基礎(chǔ)環(huán)境——從根本上來說,就是在制定規(guī)則:什么可以接受,什么可以做,什么不可以做。事實(shí)上,所有的程序都是在制定規(guī)則,只不過操作系統(tǒng)是在制定最根本的規(guī)則。

            創(chuàng)造操作系統(tǒng)就像在為你創(chuàng)造的這片土地制訂憲法,而其他在電腦上運(yùn)行的程序則是為憲法所允許的普通法律。

            有時,這些法律根本講不能,但這正是你要面對的問題。你需要找到解決辦法,并能夠意識到自己以正確的方法找到了正確的答案。

            還記得那些在課上總能答對問題的同學(xué)嗎?他們的答案比別人來得快,他們能這樣是因為他們沒有刻意去追求。他們不在乎他們應(yīng)該怎樣來答題。他們只不過找到了合理的考慮問題的方法。人們一聽到正確答案,一切聽起來就都是那么回事了。

             

            在電腦上也是這樣。你可以魯莽、生硬地行事,愚蠢地死死糾住問題不放,直到問題不再成為問題。也可以通過找到正確的方法,使問題突然消失。你可以從不同的角度看問題。直到靈光突現(xiàn)地認(rèn)識到:問題之所以成為問題只在于你的方法錯了。

            也許能夠證明這一點(diǎn)的最佳例子不是來源于計算機(jī)科學(xué),而是數(shù)學(xué)。故事發(fā)生在十七世紀(jì),日后將成為偉大的數(shù)學(xué)家的高斯還在上中學(xué)。一天,老師厭煩了授課,就讓學(xué)生們計算從1到100的數(shù)字的和。他原以為學(xué)生們要花一整天來計算這道題。沒想到初展才華的數(shù)學(xué)家僅花了五分鐘就得出了正確答案:5050。他解答這個問題的方法不是真的把所有這些數(shù)字一一加起來,這樣做既麻煩又愚蠢。他發(fā)現(xiàn)1加100等于101,2加99也等于101,然后3加98還是101,直到50加51等于101。不要幾秒種,他就注意到一共是50對101,所以答案是5050。

            也許這故事是虛構(gòu)的,但它想說明的道理卻很清楚:一個偉大的數(shù)學(xué)家不會采用平庸而繁瑣的方法,因為他能看到隱藏在問題背后的真正內(nèi)涵,并應(yīng)用這一理解去找到更為簡便的方法。

            在計算機(jī)科學(xué)中也絕對如此。

            沒錯,你能寫一個程序來求出總數(shù)。這對于今天的電腦來說不過小事一樁。但是一個偉大的編程者能憑借其聰明的頭腦就知道答案是什么。他知道怎樣寫出漂亮的程序,知道怎樣采用一種全新的但最終會被證明是正確的方法。

             

            不過還是很難說清楚,閉門冥思苦想地要找到解決某個問題的漂亮答案,為什么竟然有如此巨大的魅力?但是,你要是曾經(jīng)有過找到更好方法的經(jīng)歷,你就會明白,這簡直是無與倫比的感覺。

             

            2、長腿的終端仿真器

            我的終端仿真器(terminal emulator)長了腿。我經(jīng)常用它登錄到學(xué)校的電腦上,查閱電子郵件和參加MINIX討論組。但是問題是,我還想下載和上傳東西。也就是說,我必須能向磁盤里保存東西。為此,我的終端仿真器必須裝個磁盤驅(qū)動。還需要一個文件系統(tǒng)驅(qū)動,這樣才能查看磁盤里的東西,將我下載的內(nèi)容保存成文件。

            這是我在發(fā)明linux的過程中差點(diǎn)半途而廢的一步。我當(dāng)時覺得這太麻煩,也不值得。但是除此之外我也沒什么可做的。那年春天我在上課,課程很簡單,無需費(fèi)太多的心思。當(dāng)時我唯一的課外活動是每周三晚上參加同學(xué)聚會。我那時是一個社會“死物”(與“社會動物”相對——譯者),于是那聚會就成為我除了編程和學(xué)習(xí)之外唯一一個可以干點(diǎn)別的事情的場合。要不是那聚會,我可以說是徹底與世隔絕了。同學(xué)聚會是我接觸社會生活的僅有的地方,我?guī)缀跏敲看尾宦涞貐⒓印T摼蹠ξ沂侨绱酥匾灾劣谖矣袝r會因為想著將要參加它而失眠,因為一直擔(dān)著心不要因為缺乏社交風(fēng)度、或由于自己丑陋的大鼻子、或明顯缺少個女伴而出丑。這自然都是些典型的低級趣味。我之所以說這些,是因為要表明,當(dāng)時我真的沒有什么別的有意義的事情可做。而搞出驅(qū)動程序的工作卻很有意思。所以我對自己說,我要干下去。

            于是,我寫了一個磁盤驅(qū)動程序。因為我想把文件保存在我的MINIX文件系統(tǒng)中,也因為MINIX文件系統(tǒng)本身整理得很好,于是我讓自己的文件系統(tǒng)可以和MINIX文件系統(tǒng)兼容。這樣,我就可以在MINIX系統(tǒng)下閱讀我建立的文件并將它們存入同一張磁盤,以便MINIX系統(tǒng)也可以通過我的終端仿真器閱讀到我建立的文件。

            這花費(fèi)了我大量的精力:編程——睡覺——編程——睡覺——編程——吃飯(餅干)——編程——睡覺——編程——洗澡(沖沖了事)——編程。隨著工作的進(jìn)展,這個項目很明顯正在成長為一個操作系統(tǒng)。所以我轉(zhuǎn)變了看法,不再把它看成一個終端仿真器,而是一個操作系統(tǒng)。這個轉(zhuǎn)變出現(xiàn)在我馬拉松似的編程過程中的哪個時間段,是在白天還是晚上,我已經(jīng)想不起來了。也許在這一刻之前我還穿著破舊的睡袍奮力敲擊著鍵盤,在為終端仿真器更多的功能;而轉(zhuǎn)瞬之前我擁有的功能是如此之多,以至于整個體系已經(jīng)變成了一個。

            我把它稱之為我的“gun-emac終端仿真程序”(gnu-emac of ternimal emulation programs)。gnu-emac終端仿真程序開始是一個編輯程序,但創(chuàng)造它的人又為它增加了一系列功能。設(shè)計者本想讓它成為一個可以用程序控制的編輯程序,但是其程序可控性的特點(diǎn)很快使一切都黯然失色,它成為了一個從地獄中冒出來的編輯程序。它除了廚房水池子外幾乎無所不包,這就是為什么這個編輯程序指令的圖標(biāo)有時竟是一個廚房水池。這個編輯程序的一大特點(diǎn)就是,其設(shè)計過程比任何其他編輯器都更復(fù)雜。

            我的終端仿真器也是如此。它在不斷地擴(kuò)張。

             

            3、尋求網(wǎng)上幫助

            來自:torvalds@klaava.Helsinki.Fi(李納斯?托沃茲)

            討論組:comp.os.minix

            主題:Gcc-1.40和一個有關(guān)POSIX的問題

            信息名稱:1991 Jul 3, 100050.9886@klaava.Helsinki.Fi

            日期:

            各位網(wǎng)友好!

            由于我現(xiàn)在正在MINIX系統(tǒng)下做一個項目,對POSIX標(biāo)準(zhǔn)很感興趣。有誰能向我提供一個(最好)是機(jī)器可讀形式的最新的POSIX規(guī)則?能有FTP地址就更好了。

             

            好吧,這就是一個芬蘭小子希望檢驗一下自己的計算機(jī)技能限度的最早的公開證據(jù)。

            POSIX標(biāo)準(zhǔn)是一個可以適用于數(shù)以百計的UNIX系統(tǒng)呼叫中的任意一個的一套冗長規(guī)則,計算機(jī)要執(zhí)行任務(wù)(從讀、寫、開機(jī)和關(guān)機(jī)開始)就需要這個標(biāo)準(zhǔn)。POSIX則是指一個UNIX的標(biāo)準(zhǔn)體系,或一個由來自不同公司的代表所組成的一個組織,希望按照一個共同的標(biāo)準(zhǔn)進(jìn)行運(yùn)作。對于程序員開發(fā)的在該操作系統(tǒng)下的新應(yīng)用軟件或開發(fā)應(yīng)用軟件的新版本而言,標(biāo)準(zhǔn)是極其重要的。從POSIX這樣的系統(tǒng)呼叫(system call),尤其是重要的呼叫(call)中,我可以獲得一個操作系統(tǒng)應(yīng)該具有哪些功能的一個單子;然后我就可以通過自己的方式在自己的系統(tǒng)中實(shí)現(xiàn)每一個功能。通過編寫出這些標(biāo)準(zhǔn),我的系統(tǒng)軟件的源代碼將可以被別人使用,以開發(fā)新的應(yīng)用軟件。

            當(dāng)時我并不知道我本可以直接從POSIX公司買到這些規(guī)則的軟盤,但這無所謂。哪怕我能買得起,什么東西運(yùn)到芬蘭,往往會需要很長的時間。我不愿等上那么久,因此我四處搜求一個能從FTP地址上直接下載的版本。

            沒有人給我提供能找到POSI標(biāo)準(zhǔn)的來源。于是我開始了計劃B。

            我從學(xué)校找到運(yùn)行sun器(sun server)的sun微系統(tǒng)版的UNIX手冊。該手冊中有一個完全可以湊合使用的系統(tǒng)呼叫的基本版本。從用戶手冊中能看出系統(tǒng)呼叫的主要功能,以及為完成這些功能所需要完成的步驟。但是,從中看不出具體的方法,而只是標(biāo)明了最終的結(jié)果。于是我便著手從安德魯?塔南鮑姆的書中和別的材料中收集一些系統(tǒng)呼叫。最終有人給我寄來了那幾卷厚厚的POSIX標(biāo)準(zhǔn)。

            不過我發(fā)的那個郵件并沒有石沉大海。任何一個有相應(yīng)知識的人(只有具備相應(yīng)知識的人才會上MINIX的網(wǎng)站)都能看出我的計劃是要開發(fā)一個操作系統(tǒng),否則,我會需要POSIX規(guī)則呢?我的郵件引起了赫爾辛基工學(xué)院(我若不是對研究理論這么感興趣,可能會在這兒求學(xué))一個助教阿里?萊姆克(Ari Lemke)的好奇。阿里善意地給我回信說,他愿意為我在他們學(xué)校的FTP地址上建一個子目錄,這樣到時我可以把自己的操作系統(tǒng)發(fā)布上去,讓感興趣的人們下載。

             

            4、linux

            阿里?萊姆克一定是一個相當(dāng)樂觀的人。在我能拿出什么可以發(fā)布的東西之前 ,他就為我建立了一個子目錄:ftp.funel.fi。我有了密碼,一切都準(zhǔn)備就緒,就等著我去登錄然后上傳內(nèi)容了。但是我要再花上四個月才能找到一點(diǎn)我愿與世人分離的東西,或者至少與阿里或幾個與我保持郵件往來的熱衷于操作系統(tǒng)的狂熱分子分離的東西。

            我最初的目錄是想開發(fā)出一個最終可以取代MINIX的操作系統(tǒng)。

            這個系統(tǒng)不必比MINIX能干,但必須能勝任我最喜歡用MINIX做的事,以及其他我想做的事。比如,MINIX的終端仿真不僅太不方便,而且也不能進(jìn)行任務(wù)控制——即把暫不用的程序放入背景中,同時內(nèi)存管理也太簡化。順便說一下,它還是以蘋果的操作系統(tǒng)(Mac OS)而不是以DOS為支持的。

            開發(fā)操作系統(tǒng)就是搞明白系統(tǒng)呼叫應(yīng)該做什么,然后以你自己的方式編出能使系統(tǒng)呼叫得以執(zhí)行的程序。總有來說,共有幾百個系統(tǒng)呼叫。有些是多功能的,其余的則很單一。有些更基本的系統(tǒng)呼叫確實(shí)是十分復(fù)雜的,并需要有大量的基礎(chǔ)作為支持。比如,為完成“寫”和“讀”這兩種系統(tǒng)呼叫,你就必須建立一個磁盤驅(qū)動程序,以便能夠在磁盤里讀或?qū)憱|西。又比如“打開文件”的系統(tǒng)呼叫,你就必須創(chuàng)建一整套文件系統(tǒng)層,以便分析文件名和在磁盤上查找文件。要編寫“找開文件”的系統(tǒng)呼叫,更需要幾個月的工作。但這個程序一旦編寫出來,用于別的功能的程序都可以借鑒。

            早期的創(chuàng)建工作就是這樣。我不但從Sun服務(wù)器的操作系統(tǒng)手冊中查找標(biāo)準(zhǔn),也從其他書中查到可用的標(biāo)準(zhǔn),挑出一個一個的系統(tǒng)呼叫,然后為它們再編出可行的軟件。

            這工作很容易讓人感到灰心喪氣。

            原因是:表面上一切如故,你看不到任何進(jìn)展。你可以做幾個試驗性的程序,檢驗自己剛剛加上的東西是否可行。但這并不真的有什么用。在有的階段你不得不放棄剛才的想法,那一長串的系統(tǒng)呼叫都白干了。一個真正的程序在運(yùn)行之前,必須已經(jīng)接近完成。你必須首先運(yùn)行的程序是外殼(shell)程序,而在有這個外殼程序之前,要運(yùn)行什么很難的。而且,這個外殼程序包括了很多你所需的系統(tǒng)呼叫。它運(yùn)行起來之后,你才會從中找到一長串你尚需完成的功能。

            在UNIX中,外殼程序是一切程序之母。它的作用是引發(fā)以后的一系列二進(jìn)制語言程序(二進(jìn)制程序是以計算機(jī)可識別的1和0為符號編寫的程序。以機(jī)器語言編程,就是將二進(jìn)制的源代碼組合起來),這個外殼程序使你首先能登錄(當(dāng)然在真正的UNIX系統(tǒng)中,你運(yùn)行的第一個程序傳統(tǒng)上被稱為init,而init的確需要很多基礎(chǔ)的支持才能運(yùn)行。它是一種對正在運(yùn)行著的程序的控制工具。當(dāng)沒有任何程序運(yùn)行時,init就沒有用了)。

            因此,我做的第一件事不是創(chuàng)建init,而是建一個外殼程序。我執(zhí)行了約二十五個系統(tǒng)呼叫,正如我所說,這也是我要運(yùn)行的第一個真正的程序。這個外殼程序不是我自己編的。我下載了一個叫Borne Shell的外殼程序。它是UNIX的初始外殼程序之一,可以從互聯(lián)網(wǎng)上免費(fèi)下載,名字來源于一個難聽的雙關(guān)語。編寫該外殼程序的家伙名叫波恩(英文中的“忍受”或“出生”之意——譯注),所以這個程序就叫做“Borne Again Shell”(“再次忍受或再次降生外殼程序”——譯注),或一般被稱為BASH(bash的英文意為“重?fù)?#8221;——譯注)。

            當(dāng)你試著從磁盤運(yùn)行或?qū)胍粋€真實(shí)的程序時,一般都會有“臭蟲”(bug,IT業(yè)中稱軟件里的瑕疵為“臭蟲”——譯注)出現(xiàn)在磁盤驅(qū)動程序或?qū)б绦蛑校驗槌绦蛲鶗焕斫馑x到的東西,于是它就會在屏幕上顯示出相關(guān)的信息。這很重要,你可以從中知道哪兒出了毛病。

            于是,我就到了這樣一個階段:我試圖導(dǎo)引外殼程序,屏幕上則顯示出外殼程序中每一個我尚未能執(zhí)行的系統(tǒng)呼叫。我導(dǎo)入并運(yùn)行外殼程序,屏幕上則出現(xiàn)類似“系統(tǒng)呼叫517沒有執(zhí)行”這樣的信息。我日日夜夜盯著屏幕上顯示出來的系統(tǒng)呼叫,試著發(fā)現(xiàn)我在哪一條上面出了錯。這比拿到一個系統(tǒng)呼叫的單子,然后一一使他們可以被執(zhí)行要有意思多了。人們需要看到事情的進(jìn)展。

            到了八月底或九月初的時候,我的外殼程序終于可以工作了。過了這一關(guān),后面的任務(wù)就輕松多了。

             

            這可是一件大事。

            我的外殼程序可以運(yùn)行后,我馬上開始著手其他幾個程序,比如拷貝程序和列表程序,這些都比外殼程序簡單得多。你所需的一發(fā),外殼程序早就具備好了,所以一旦外殼程序完成,就好像是從0飛躍到100一樣,因為一切都已就緒。這時,我已經(jīng)擁有了一切必要的條件,感覺就像上帝創(chuàng)世紀(jì)那樣,執(zhí)掌一切地說:“讓那里有光”,那里就真的有了光。在此之前,的確是一無所有。

            是的,我深感滿意。

            這種滿意很重要,因為那個夏天我除了伏在電腦面前,其他什么都沒做。這么說一點(diǎn)也不夸張。芬蘭四月到八月的日子是一年中最美好的時光。人們到布滿小島的海上航船,去海灘上曬日光浴,到夏日小木屋中消閑。但是我卻在沒日沒夜地工作,不知哪一天是周末,哪一天是工作日。學(xué)生的黑色窗簾遮蔽了幾乎晝夜?fàn)N爛的陽光,也遮蔽了整修世界。有些天——或夜晚?——我會從床上爬起來后直接坐到離床僅幾英尺遠(yuǎn)的電腦旁。

            爸爸顯然在不斷催促媽媽讓我在暑假找份工作,但媽媽卻不在乎:我并沒有打攪她。薩拉會因為我有時上網(wǎng)使電話戰(zhàn)線而有點(diǎn)惱火。她也許會寫些毫不客氣的話。毫不夸張地說,我和電腦之外的世界幾乎沒有任何聯(lián)系。

            當(dāng)然,也許每周有一次,一個朋友會敲敲我的窗戶,而我如果沒在搗騰什么重要的編碼時,會請他進(jìn)來。我們會喝杯茶,也許還會擠在窄小的廚房里看一小時的MTV。現(xiàn)在回想起來,對了,有時喬科會來敲我的窗戶,我們會出去喝點(diǎn)啤酒或玩司諾克臺球。但是,誠實(shí)地說,那時我的生活也就這么簡單了。

            而我一點(diǎn)兒都不感覺自己是那種面色蒼白、可憐兮兮的失敗者。

            外殼程序成功了。這意味著,我事實(shí)上已經(jīng)建立起了可行的操作系統(tǒng)的基礎(chǔ),而我自己則樂趣無窮。

            外殼程序成功之后,我開始檢驗其中的內(nèi)裝程序。接著我又編了足夠的新程序,可以真正干點(diǎn)什么了。我用了MINIX中所有有用的東西。當(dāng)我把外殼程序移到一個我為新的操作系統(tǒng)所建的特別區(qū)域中時,我開始把這個操作系統(tǒng)稱為“linux”。

            坦率地說,我一開始并不想把它以linux的名稱發(fā)布出去,因為那顯得我太自我中心了。那么,我為最終發(fā)布起的名字是什么呢?Freax(Freaks的變形,該詞為“異想天開”之意——譯注。) 事實(shí)上,在一些早期完成的文件中,即那些說明如何匯編源代碼的文件中,有將近半年的時間我一直使用Freax這個名稱來指代這個操作系統(tǒng)。但這其實(shí)是無所謂的,因為當(dāng)時還沒有任何人知道它,所以它其實(shí)并不需要什么名字。

             

            5、開放源代碼

            來自:李納斯托沃茲torvalds@klaava.Helsinki.Fi (李納斯?托沃茲)

            新聞組:comp.os.MINIX

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

            總結(jié):關(guān)于我的新操作系統(tǒng)的小型民意調(diào)查。

            信息編號:1991年8月25,9541@klaava.Helsinki.Fi

             

            嗨,所有使用MINIX的人們,大家好!

            我在編一個(免費(fèi)的)用于386(486) AT clones的操作系統(tǒng)(只是一個愛好,不會成為一個像Gnu那樣大型的專業(yè)軟件)。我從四月起就在醞釀,現(xiàn)在已準(zhǔn)備就緒。我想聽一聽人們對MINIX有哪些欣賞或不滿之處,因為我的操作系統(tǒng)和它有些相象(尤其是文件系統(tǒng)的物理排列方式)。

            我目前已經(jīng)裝上了bash (1.08)和gcc (1.40),看來一切進(jìn)展順利,估計幾個月內(nèi)我就會得出一些實(shí)用的東西。我想知道大多數(shù)人在這方面有什么要求。任何建議都?xì)g迎,但我可不保證一定會采納。

            李納斯(torvalds@klaava.Helsinki.Fi)

            附:對了,它不受任何MINIX源代碼的影響,并有一個多線程的FS。記住。它不能安裝(比如使用386任務(wù)轉(zhuǎn)換文件等等),也許永遠(yuǎn)不會支持除了AT硬盤之外的東西。情況就是這樣。

             

            使用MINIX人群中最堅定的操作系統(tǒng)的狂熱者看到了火花。我沒有收到多少有關(guān)MINIX特點(diǎn)的建議,但卻有許多別的問題。

             

            >多告訴我們一點(diǎn)!它需要MMU嗎?

            回答:是的。

             

            >在多大程度上使用C語言?在裝截中會有什么困難?不會有人相信你的不可“半截性”,比如說我就想把它裝截到我的Amiga軟件上。

            回答:它大部分使用C語言,但大部分人不會把我寫的程序稱作C語言。它使用了我能想到并找到的386的特征,我也想通過它充分了解386。我的一些C文件幾乎和C語言一樣是組合起來的。

             

            如上所述,它也使用MMU,用于分頁和分類(還不能存進(jìn)軟盤里)。正是分類使它成為一個真正的386的依賴者(每項任務(wù)都有一個64mb的編碼和數(shù)據(jù)分類文件。

            甚至有幾個人提出愿意做試用版的試驗者。

            最后,把它發(fā)布出去并不需要太大的決心。我一直習(xí)慣與人交流程序,所以要做的唯一真正決定就是,我敢于向人們展示這一系統(tǒng)軟件的最佳時機(jī)是何時,才不會使自己感到不自在,或更確切地說,什么時候發(fā)布才使我將來不至于為此感到羞愧。

            我最終想實(shí)現(xiàn)的是有一個編譯器和一個能在linux內(nèi)部編程的真正的系統(tǒng)環(huán)境,而不必再用MINIX。但是當(dāng)gnu程序可以運(yùn)行時,我驕傲極了,愿意讓整個世界都看到它。同時,我也想聽到人們的反響。

            外殼程序能運(yùn)行時,我已為操作系統(tǒng)初步編了幾個程序。其實(shí)還不能做什么,但你能看出和UNIX很相似。事實(shí)上,它運(yùn)行起來像一個有點(diǎn)殘疾的UNIX。

            所以我決定將其發(fā)布出去。但我不會公開地告訴任何人,而是通過私人郵件告訴幾個人——也許總共只有五到十個人吧——告訴他們我已將其上傳到FTP地址上。其中包括阿里?萊姆克,布魯斯?伊文斯,以及其他幾個人。我還上傳了linux的源代碼和幾個用于初始運(yùn)行的小程序。我告訴人們要運(yùn)行這個系統(tǒng)應(yīng)該怎樣做。人們還是MINIX386版本——還必須有GCC編譯器,事實(shí)上是我自己版本的GCC。所以我把這些也傳了上去。

            我們有了一個給發(fā)布的內(nèi)容編號的協(xié)議。它其實(shí)只有心理意義。如果我認(rèn)為自己的東西已經(jīng)完善,我愿意將其定為1.0版本,而在此之前,我給出的編號就表示出距離1.0版本還有多遠(yuǎn)的距離。所以,我將上傳發(fā)布的那個版本的操作系統(tǒng)定為0.01版,讓大家知道它離最后完善還有很大的距離。

            對了,我想起了上傳那天的日期:

            我想只有一兩個人看了我的作品。因為他們必須先費(fèi)事地安裝一個特殊的編譯器,準(zhǔn)備一個空間以便導(dǎo)入并匯編我的指令,然后卻只能運(yùn)行一個外殼程序。

            基本上,運(yùn)行外殼程序就是這個版本所能做的一切。它也可以把源文件打印出來,大概有一萬行——如果字體小一點(diǎn)的話,大概不到一百頁紙(而現(xiàn)在大概要有一千萬行了)。

            我發(fā)布這一操作系統(tǒng)的主要原因之一,是要證明我此前并非在說大話,而是我確實(shí)有所作為。在互聯(lián)網(wǎng)上,說話沒有太多責(zé)任。不管你做什么,不管是操作系統(tǒng)還是性,太多的人在這個計算機(jī)的虛假空間里弄虛作假。所以在告訴了那么多人你在發(fā)明一個操作系統(tǒng)之后,能夠這樣說真好:

            “瞧,我真的做出了點(diǎn)什么。我沒有在騙你們。這就是我所做的……”

             

            6、linux有了用戶

            哦,阿里?萊姆克,是他為我把這個系統(tǒng)上載到FTP地址上鋪平了道路。

            他極不喜歡Freax 這個名字。倒喜歡我當(dāng)時正在使用的另一個名字——linux,并把我的郵件路徑命名為pub OS/Linux。我承認(rèn)我并沒有太堅持。但這一切都是他搞的。所以我既可以不慚愧地說自己不是那么以個人為中心,也不得不承認(rèn)自己并非完全沒有自我意識。并且我認(rèn)為,這是個不錯的名字。

            如上所述,我的操作系統(tǒng)并非很有用。比如,如果儲存太多的東西,或僅僅是因為不小心,系統(tǒng)就會馬上崩潰。而哪怕你并非不小心,如果讓它運(yùn)行時間稍長一點(diǎn),也會崩潰。但是在那個階段,它并不是給人運(yùn)行的,而是讓人看的。對了,是讓人仰慕的。

            所以它只是為給少數(shù)幾個熱衷于開發(fā)新的操作系統(tǒng)的人分離的。他們都是非常迷戀技術(shù)的人,甚至是技術(shù)迷當(dāng)中的特殊興趣小組。

            他們的反應(yīng)無一例外是積極的,但是這是一種“它要是能這樣或那樣就更好了”的肯定態(tài)度。或說:“看起來倒是挺酷,但是在我的電腦上根本就轉(zhuǎn)不起來。”

            我記得一個人在郵件中寫道,他真的很喜歡我的操作系統(tǒng),并用了至少一大段文字來描繪它的好處。接著他說我的系統(tǒng)吃掉了他的硬盤,而我的磁盤驅(qū)動程序則是“又嬌氣又脆弱”之類的。他丟失了他先前所有的文件,但他還是對我的操作系統(tǒng)持積極支持的態(tài)度。讀這樣的郵件很令人感動。事實(shí)上是一個軟件“臭蟲”毀了他的文件系統(tǒng)。

            我的就是這種反應(yīng)。我修補(bǔ)了幾個程序上的瑕疵,包括那個當(dāng)內(nèi)存用完時就會死機(jī)的漏洞,而且還取得了一個,經(jīng)GCC編譯器裝載到操作系統(tǒng)上,這樣我就可以編寫小的程序了。這也意味著使用者在運(yùn)行這個操作系統(tǒng)之前不必先導(dǎo)入我的GCC編譯器了。

             

            你是否渴望回到那樣的時代,當(dāng)男人像男子漢并且能自己編寫驅(qū)動程序?

            ——linux0.02版本的上載宣言

             

            十月初我發(fā)布了0.02版,包括了幾個對瑕疵做的補(bǔ)丁程序和一些增加的新程序。十一月我又發(fā)布了0.03版。

            我本來可能會在1991年底之前就洗手不干了。我已經(jīng)做了很多自認(rèn)為有意思的事。并非一切都絕對圓滿,但在軟件世界中,一旦你已解決了最根本的問題,興趣就容易很快地消失。我也是那樣。解決軟件中存在的小問題并不是什么吸引人的工作。但接下來發(fā)生了兩件讓我繼續(xù)下去的事,第一:由于失誤,我破壞了我的MINIX分區(qū);第二,人們不停地傳給我反饋的意見。

            那時,我在導(dǎo)入linux時仍要把MINIX作為主要的開發(fā)環(huán)境。我在Linux系統(tǒng)下做的大部分事只是這我寫的終端仿真器從學(xué)校的電腦上讀郵件和新聞。

            學(xué)校的電腦總是很難登錄,所以我編了個可以自動撥號的程序。但是在十二月時,我本想自動撥devtty1——這是系列電話線,但卻錯誤地?fù)艹闪薲evhda1,既硬盤分區(qū),結(jié)果是我無意中覆蓋了保存的MINIX中最重要東西的空間。是的,這也就意味著我不能再進(jìn)入MINIX的環(huán)境了。

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

            我可以重新裝入MINIX系統(tǒng),或者也可以將錯就錯,自認(rèn)linux已是足夠的好,以至不再需要MINIX了。我將通過在Linux下編程來編譯Linux,而只要我覺得需要MINIX中好的功能,我就把這些MINIX的優(yōu)點(diǎn)編到Linux中。無疑,這是觀念上重要的一步,因為你要擺脫原有的系統(tǒng)環(huán)境,使新的系統(tǒng)真的能夠自我包容。這一步十分重大,因此我將十一月底發(fā)布的版本命名為0.10版。幾個星期之后,就升級到了0.11版。

            正是從那時起,開始有人使用這個系統(tǒng)并可以用它來做一些事了。

            到那時為止,我已經(jīng)修補(bǔ)了一系列的漏洞。但沒有人向我提出新的建議。我記得為了滿足更多存儲的需要,我曾出過門,并將機(jī)器的內(nèi)存從4兆升級到8兆。我還出去買了個浮點(diǎn)協(xié)同處理器(floating point co-processor),因為人們開始問我linux是否能支持他們的浮點(diǎn)協(xié)同處理器。這個附加硬件使我的電腦能執(zhí)行浮點(diǎn)運(yùn)算(floating point math)。

            我記得是在十二月,德國的一個計算機(jī)只有2兆內(nèi)存卻試圖匯編Kernel的家伙,他也不能運(yùn)行GCC,因為那時的GCC需要1兆以上的內(nèi)存。于是,他問我linux是否能用一個無需太多內(nèi)存的較小的編譯器來進(jìn)行匯編。盡管我并不需要這個特別的功能,但我仍決定要為這個家伙實(shí)現(xiàn)這種功能。接著就出現(xiàn)了那個稱為page-to-disk的東西,這就意味著盡管他只有2兆的內(nèi)存,他也可以通過使用這個存儲盤使他的電腦看起來寬敞一些。那是在1991年圣誕節(jié)前后。我記得曾在

            而我也為此感到很驕傲。

             

            linux的用戶天天都在增加,我也不斷接到來自我曾向往的國度的電子郵件,包括澳大利亞和美國。關(guān)于此事,我在祖母家的圣誕聚會上對家人只字未提。不要問我為什么,我只是覺得沒有必要和我的父母、姐妹或任何親戚討論這件事。他們不懂計算機(jī)。至少,我認(rèn)為他們不懂計算機(jī)。

            就他們而言,我每天干的事就是把電話線連到調(diào)制解調(diào)器上。當(dāng)時的赫爾辛基,電話費(fèi)在夜間可以打很多折,所以我在家的大部分工作都在深夜進(jìn)行。但偶爾也會一整天地連在電話線上。我本想另接一條電話線,但是我母親的公寓所在的大樓十分古老,沒有額外的電話線,也不打算增加新的。那時我妹妹薩拉除了在電話上聊天之外也是無所事事,至少在我看起來是這樣。所以我們會偶爾為搶電話線打架。真的會打起來。她和朋友打電話時,我會強(qiáng)行用“貓”撥號,她就會聽到“嘀——嘀——”的聲音。這自然會打斷她,而她也就知道我確實(shí)、確實(shí)要上網(wǎng)收電子郵件了。

            我可沒說過自己是世界上最好的哥哥。

            Page-to-disk是一個相當(dāng)龐大的程序,因為它是MINIX沒有涉及到的東西。該程序出現(xiàn)在0.12版中,于1992年1月的第一個星期發(fā)布。人們馬上開始不僅僅把linux和MINIX相比較,而且開始和Coherent相比。后者是由TK開發(fā)的小型UNIXclone。從一開始,增加page-to-disk就使Linux在競爭中脫穎而出。

            那是linux起飛的開始。

            突然間,人們紛紛從MINIX轉(zhuǎn)向linux。那時Linux尚不能勝任MINIX的所有工作,但是它還是可以做人們真正需要的大部分重要的工作。而它擁有一項人們特別喜歡的功能:有了page-to-disk,你可以運(yùn)行超過你內(nèi)存的巨大程序。這意味著,當(dāng)超出內(nèi)存之后,你可以將一塊舊的內(nèi)存存到磁盤上,要記存到了哪兒,仍然使用那塊內(nèi)存來解決你的問題。這在1992年的第一個星期是一件不尋常的事。

            正是那個月,linux的用戶從我知道名字并與其有郵件往來的五到十個人,增加到了成百上千我不知是誰的人。我并不認(rèn)識每一個Linux的用戶,這多有意思。

             

            7、linux能換來金錢嗎?

            那時,互聯(lián)網(wǎng)上正有一個惡作劇在盛行。

            據(jù)說有一個叫克雷格的可憐男孩得了癌癥,正在死亡線上掙扎,而在網(wǎng)民中則流傳著一個連鎖郵件,讓人們向這個男孩郵寄明信片以表示對他的支持。實(shí)際上這是某人的一個惡作劇,可能根本就沒有克雷格這么個人,更別提什么癌癥了。但是這一呼吁竟招來了上百萬張明信片。所以我半開玩笑寺要求使用linux的人給我寄明信片,而不用給錢。這像是一個人們會感嘆“哦,上帝,又是一個要明信片的家伙!”的玩笑。在那時的個人電腦世界中,有一個有關(guān)軟件共享的牢固傳統(tǒng)。你下載了一個程序,就應(yīng)該給作者寄回十塊錢左右的回報。所以我收到了很多郵件問我是否要人們給我寄三十塊錢。就是在這種情況下,我覺得必須說點(diǎn)什么了。

            現(xiàn)在回想起來,我覺得那些錢一定會很有用的。我已欠了大約五千美元的學(xué)生貨款,同時每個月要為我的電腦支付約五十美元。我另外的主要消費(fèi)是比薩餅和啤酒。但是由于開發(fā)linux,我那時沒有時間外出,最多每周出去一次。我不花錢約女孩子,把錢都花在了為我的電腦增加硬件上。也許要是換一個人,就會向大家要錢了,哪怕是為了減輕他那日夜辛苦勞動的單身母親的負(fù)擔(dān)呢?唉,我那時卻沒有想到這一點(diǎn)。去告我吧!

            那時,我更想知道都有哪兒的人在使用linux。與收到錢相比,我更喜歡收到明信片。事實(shí)上,明信片確實(shí)在滾滾而來,從新西蘭、從日本、從荷蘭和美國。薩拉曾偶爾象征性地去取取信,突然意識到那總和他爭吵的哥哥竟有來自那么遙遠(yuǎn)的朋友。那是她第一次認(rèn)識到,在我總是占用電話線的時間里,我可能是在做一件會很有用的事情。那些明信片加起來足有幾千封,但它們現(xiàn)在早已不知去向了,一定是在我某次搬家時丟掉了。我的朋友艾溫坦說,我是他所見過的最不懷舊的人。

            實(shí)際上,我不要錢還有很多原因。在最初發(fā)布linux的時候,我覺得自己是在沿著幾個世紀(jì)以來的科學(xué)家們和其他學(xué)術(shù)界人士的腳印在前進(jìn),而他們的成就往往建立在別人所打下的基礎(chǔ)上——用牛頓的話來說,我是站在巨人的肩膀上。這樣做,我不僅僅是在與別人分離我的成果,別人也將會覺得我的工作是有用的。我還想聽到反響(當(dāng)然,是想聽到贊揚(yáng))。朝那些可能會幫助我改進(jìn)工作的反饋信息要錢是沒有 。我想,如果我不是長在芬蘭,我的態(tài)度會不完全不同。在芬蘭,只是一個人稍微顯露出一絲貪心的跡象,人們就會視之為可疑而不會羨嫉(自從諾基亞電話公司開始賺整個世界的錢并充實(shí)了很多芬蘭人的錢包之后,這一點(diǎn)已經(jīng)有了一些變化)。并且,對了,如果我不是在頑固的學(xué)究祖父和共產(chǎn)主義立場的父親影響下成長起來的話,無疑我會對這件不要錢的事持不同態(tài)度。

            無論如何,我不想把linux賣掉,我也不想失去對它的控制權(quán)。也就是說,我不想別人把它買掉。早在九月上傳每一個版本時,我就在有關(guān)復(fù)制的文件中表明了這個版權(quán)聲明。根據(jù)十九世紀(jì)的波恩公約,除非你將其出賣,你擁有自己所創(chuàng)造的一切東西的版權(quán)。作為版權(quán)所有者,我開始定下了以下關(guān)于Linux的規(guī)則:

            1、 人們可以免費(fèi)使用該操作系統(tǒng),2、 但不3、 得將它作為商品。

            4、 對其所作的改動和改進(jìn),5、 必須以源代碼的形式將其公開(而6、 不7、 是二進(jìn)制,8、 這是不9、 公開的。)

            10、 如果不11、 同12、 意以上規(guī)定,13、 則無權(quán)對它進(jìn)行復(fù)14、 制或從事任何行為。

            你不妨自己設(shè)想一下。你為這個程序傾注了六個月的心血,你希望它是有用的,并且自己也能從中有所收獲,但你肯定不想讓它白白被人占去便宜。我想讓大家都能夠看到它和使用它,同時也可以隨意對其進(jìn)行改動和改進(jìn)。但是,我也希望能確保我自己可以及時了解他們做過哪些改動。我希望自己有權(quán)使用源程序,這樣,假如別人做了什么改進(jìn),我也可以利用它。我認(rèn)為,要使linux發(fā)展成最完美的技術(shù)就必須保持它的純潔性。如果有銅臭滲透進(jìn)來,事情就要變黑暗了。所以,如果不讓錢的問題摻和進(jìn)來,就不會有貪欲的參與。

            盡管我沒興趣拿linux去賺錢,但別的人卻不這么認(rèn)為,他們在給別人一份已經(jīng)下載到軟盤上的拷貝時都要索取回報。到了二月份,參加UNIX用戶會議的人,幾乎人人手上都有一張裝有Linux系統(tǒng)的軟盤。這些人也問我,他們能不能把Linux作為商品出售,比如說,只要五塊錢,為的是收回軟盤和時間上的成本。這聽起來還有點(diǎn)道理,但問題在于,這樣做就會侵犯了我的版權(quán)。

            顯然,我已經(jīng)到了反思“linux是非賣品”這一立場的時候了。

            那時,linux已經(jīng)在網(wǎng)上引發(fā)了很多討論,這使得我很自信,再沒有人能夠竊取我的勞動成果了——而這曾經(jīng)是我最大的擔(dān)憂。至少,假如真有誰這樣做了,他也難逃眾人的譴責(zé)。如果有人想篡奪Linux并將其變?yōu)橐粋€商業(yè)項目,必將會在網(wǎng)上掀起黑客的反對潮,會有無數(shù)黑客似的人物大聲斥責(zé)道:“嘿,那是Linux,住手。”當(dāng)然,措辭可不會如此文雅。

            事情的發(fā)展已經(jīng)勢不可擋:世界各地的黑客們每天都在共同分享彼此提出的修改建議。

            我們正在集體創(chuàng)造一個最好的操作系統(tǒng),這種發(fā)展軌道已經(jīng)不可改變。正因為如此——因為linux已廣為人知,我才覺得把它作為商品也是可以接受的。

            但是,在使我自己看起來像個慈善先生之前,還有另一個關(guān)鍵的因素使我做出了這一決定。事實(shí)是,為了使linux有用,我曾依賴過很多在網(wǎng)上免費(fèi)下載的工具——我把自己放到了巨人的肩膀上。這些免費(fèi)軟件中最重要的是GCC編譯器,它是理查德?斯多曼的杰作,并且已經(jīng)在公共執(zhí)照協(xié)會(GPL)上注冊了版權(quán)。在GPL條款之下,錢不是問題,只要有人愿意買,你可以賣一百萬美元。但是,你必須提供軟件來源。而得到或買到你的來源的人,將擁有和你一樣多的對于該程序的。這實(shí)在是很高明的一招。我認(rèn)可GPL的原則,但是和那些認(rèn)為所有的軟件創(chuàng)新都應(yīng)該在GPL下向全世界公開的頑固的GPL信仰者不同,我認(rèn)為發(fā)明者本人有決定如何處置自己的發(fā)明的權(quán)利。

            于是,我拋棄了自己舊有的版權(quán)聲明,采納了GPL的內(nèi)容,一個斯多曼也曾經(jīng)和他的律師一道簽署過的文件(因為有律師的參與,該文件被搞得洋洋灑灑有好幾頁)。

            新的版權(quán)聲明被放進(jìn)了0.12版本中。但是,我記得在發(fā)布當(dāng)晚我從睡夢中醒來,想到商業(yè)利益將可能有點(diǎn)古怪,因為當(dāng)時所涉及的商業(yè)利益真是不多。但不知怎的,我覺得自己應(yīng)該小心。我的擔(dān)心之一是——現(xiàn)在仍然是——有人將絲毫不尊重我的版權(quán)地將linux擄去。我擔(dān)心,在現(xiàn)實(shí)中,如果有個美國人侵犯了我的版權(quán),我無法對其提起訴訟。現(xiàn)在這仍是我的擔(dān)心。狀告某人侵權(quán)很容易,而我的擔(dān)心是,有的人會即使被起訴也繼續(xù)從事這種違法行為,除非加諸某種強(qiáng)制執(zhí)行的法律行動他們才會停止。同時我也不斷地?fù)?dān)心,在像中國這樣的地方,企業(yè)并不承認(rèn)GPL的效力,從而也不會尊重我的版權(quán)。

            事實(shí)上,這些地方的法律體系對侵犯版權(quán)的制止在當(dāng)時并不得力(中國已經(jīng)簽署了一系列的國際公約,李納斯在這里談的是1991年的情況——譯注),而且,為防止違法行為的投入在這些地方被認(rèn)為是不劃算的。大軟件公司和唱片公司曾作過努力,但是成效不大。

            不過,事實(shí)減輕了我的擔(dān)憂。有的人確實(shí)會暫時侵犯我的版權(quán),但是他們往往也是那些尊重版權(quán)、反饋改進(jìn)意見、使系統(tǒng)功能得以提高的人。他們將是系統(tǒng)升級過程中的一分子。相反,那些不尊重版權(quán)的人們則不會利用這些升級,他們的顧客也會離他們而去——我希望。

            總的來說,我從兩個方面看版權(quán)。比如一個每月掙五十美元的人,他可能會為一個軟件花費(fèi)二百五十美元嗎?如果花一點(diǎn)錢買非法拷貝軟件,而把五個月的工資用于吃飽肚子,我一點(diǎn)不覺得他不道德。這種侵權(quán)是道義上可以接受的。去追捕這種“侵權(quán)者”是不道德的,更不要說簡直就是愚蠢的。就linux而言,誰在乎如果只將其用于個人目的時,一個人是否真正遵循了GPL呢?那些想藉此賺大錢的人們,才是真正不道德的,不管他們是在美國還是非洲,也不管程度如何。

            貪欲從來就不是善的。

             

            8、MINIX對linux

            引人注目并非全是好事。

            我從不擅長處理對抗,但也被迫站出來為linux和我的尊嚴(yán)辯護(hù),因為安德魯?塔南鮑姆不斷攻擊我的Linux取代了他的MINIX操作系統(tǒng)。我們都是網(wǎng)蟲,所以論戰(zhàn)是通過電子信件進(jìn)行的。

            他只穿著件T恤就渾身冒火,能怪誰呢?

            在還沒有l(wèi)inux討論組之前,我一般都是在MINIX討論組上宣布有關(guān)Linux的信息和尋找對這個操作系統(tǒng)感興趣的人。對此,安德魯怎么會高興呢?

            所以,開始的時候,他對我入侵他的討論組有些不快。很顯然,他也很不高興自己的操作系統(tǒng)正在被一個來自芬蘭雪原的新發(fā)明奪去光彩,而且看來有眾多的軟件設(shè)計者正在加入進(jìn)去。同時,他對應(yīng)該如何創(chuàng)建操作系統(tǒng)持與我對立的觀點(diǎn)。那時,安德魯屬于主張以微內(nèi)核的方法建立操作系統(tǒng)的計算機(jī)科學(xué)家陣營。他把MINIX做成適用于微內(nèi)核和Amoeba(一種他當(dāng)時正在創(chuàng)建的也適用于微內(nèi)核的系統(tǒng))的形式。

            適用于微內(nèi)核的系統(tǒng)在八十年代晚期和九十年代早期十分盛行,而linux的成功威脅到了這一運(yùn)動。所以他不斷地在網(wǎng)上帖一些難聽的帶攻擊性的帖子。

            微內(nèi)核的理論依據(jù)是,操作系統(tǒng)是非常復(fù)雜的,所以要通過模式化來減少復(fù)雜性。微內(nèi)核方法的原則,即核心的核心,是晝減少功能。它的主要功能是傳播。電腦所提供的一系列不同的服務(wù)都是通過微內(nèi)核的傳播渠道實(shí)現(xiàn)的。因此,應(yīng)盡量分割問題的空間,使其不再復(fù)雜。

            我認(rèn)為這種做法很愚蠢。

            是的,每一個單獨(dú)的部分是簡單的,但是相互作用的多種功能如果放在一起就要復(fù)雜得多,而linux就是后者的情況。想一想自己的大腦。每一個單獨(dú)的部分都很簡單,但是各部分的相互作用構(gòu)成了一個復(fù)雜的系統(tǒng)。這是一個整體比個別更大的問題。拿一個問題來說,如果你簡單地將問題一分為二,說半個問題要容易一半,那么你就忽略了一個事實(shí),即:你必須要考慮到兩個半個之間的聯(lián)系所帶來的復(fù)雜性。微內(nèi)核的理論是,如果把核分為五十份,那么每一份都只有五十分之一的復(fù)雜性。但是每個人都忽視了一個事實(shí),即各部分之間的聯(lián)系事實(shí)上比源系統(tǒng)更加復(fù)雜,而且那些個別部分也不是那么簡單。

            這是我對微內(nèi)核最重要的反駁:你想實(shí)現(xiàn)的簡單化是錯誤的簡單化。

            開始時,linux是一個較小的軟件,而且簡單得多,沒有必要進(jìn)行模式化。所以用Linux可以比MINIX更直截了當(dāng)?shù)刈龊芏嗍隆N易畛醢l(fā)現(xiàn)MINIX的缺陷是,如果你同時運(yùn)行五個軟件,五個軟件都要讀不同的文件,那么五項任務(wù)要一個一個地先后進(jìn)行。換句話說,你要向系統(tǒng)發(fā)出五次請求:“我可以讀文件X嗎?”文件系統(tǒng)主管讀取的后臺駐留程序先接受一個請求,對其進(jìn)行回應(yīng),然后再接受一個,再進(jìn)行回應(yīng)……

            linux系統(tǒng)只有一個核,在這個系統(tǒng)之下,五個不同的過程都對核進(jìn)行系統(tǒng)呼叫。核必須要十分小心,不會將其混淆,但是它會很自然地讓各個過程各行其是。因此Linux更加快捷高效。

            MINIX的另一個毛病是:盡管你有了源代碼,但是許可證并不允許你做很多事情。拿布魯斯?伊文斯來說,他對MINIX做了重大改進(jìn),使其更易在386上使用,但是他卻無法將其所做的改進(jìn)納入原系統(tǒng)之中,因為MINIX限制人們對其進(jìn)行修改。從實(shí)用的角度來說,這不啻是一個災(zāi)難。使用者哪怕為了得到一個可使用的系統(tǒng)都要經(jīng)過多個步驟,這真是太不實(shí)用了。

            就這樣,我與安德魯?塔南鮑姆結(jié)束了交戰(zhàn),那是在1992年年初。想象一下,在一個暴風(fēng)雪過后的早晨,你看見這樣一條信息:

             

            來自:安德魯塔南鮑姆ast@cs.vu.ni(安德魯?塔南鮑姆)

            新聞組:comp.os.MINIX

            題目:linux過時了。

            日期:

             

            我在美國待了幾個星期,所以沒來得及對linux做多少評論(不是說如果我在,我就會說什么)。但是,Linux確實(shí)值得一評。我現(xiàn)在就有話要說。

            正如你們所知,MINIX只是我的愛好,每當(dāng)晚上我寫煩了書,如果當(dāng)時沒有什么戰(zhàn)爭、革命、CNN直播的參議院聽政會,我就會擺弄MINIX。我的真正職業(yè)是大學(xué)教授和操作系統(tǒng)領(lǐng)域中的研究人員。

            由于我的職業(yè),我想我知道在今后的十年左右時間里操作系統(tǒng)會向何處發(fā)展。有兩個方面引人注意:

            1)微內(nèi)核對Monolithic system

            大多數(shù)操作系統(tǒng)是獨(dú)立一體的,也就是說,整個操作系統(tǒng)是一個單獨(dú)的a.out文件,一個“核形式”運(yùn)行。這種二進(jìn)制中有管理過程、存儲管理、文件系統(tǒng)及其他。這類操作系統(tǒng)目前有UNIX,MS-DOS,VMS,MVS,OS/360,MULTIC以及其他很多。

            另一種則是基于微內(nèi)核的系統(tǒng),在這種系統(tǒng)中大部分OS都作為單獨(dú)過程進(jìn)行,還有許多通過溝通在核外運(yùn)行。核的任務(wù)是管理信息仁慈,控制中斷的情況,低層次的過程管理,還可能有I/O。這種形式的操作系統(tǒng)有RC400,Amoeba,Chorus,Mach,以及尚未發(fā)行的WindowsNT。

            在我詳盡論述兩者的利弊之前,可以說那些設(shè)計了這兩個操作系統(tǒng)的人們之間的急診已基本結(jié)束。微內(nèi)核勝出。Monolithic system唯一的優(yōu)點(diǎn)在于運(yùn)行上,而現(xiàn)在有足夠的證據(jù)證明,微內(nèi)核系統(tǒng)也能和Monolithic system一樣快。

            MINIX是一個基于微內(nèi)核的系統(tǒng)。文件系統(tǒng)和存儲管理相分離,在核外運(yùn)行。I/O驅(qū)動也是分離的(在核中,只是因為英特爾中央處理器中的大腦是死的這一原因,才很難尋求其他的做法)。

            linux是Monolithic風(fēng)格的系統(tǒng)。這一做法是回到七十年代的一大退步,就像對一個令人激動的C程序以BASIC語言重新編寫。對我來說,在1991年還寫一個Monolithic system的系統(tǒng)是一個不折不扣的壞主意。

            2)不分界域性(Portability)

            很久很久以前有一種4004CPU,它成熟后變成了8008,接著它接受了整形手術(shù),就成了8080。由8080誕生了8086,接下來是8088,再后來是80286、80386、80486,一直到了第n代。同時還出現(xiàn)了RISC芯片,有些能以100MIPS運(yùn)行。200MIPS的速度以及更高能在近幾年中出現(xiàn)。這些都不會馬上消失,而是會很快從80*86發(fā)展開去。它們會通過在軟件中解析80386來運(yùn)行舊式的MS-DOS程序。我認(rèn)為任何一個架構(gòu)設(shè)計OS都是極大的錯誤,因為它會很快消失。

            MINIX的設(shè)計就是不分界域性,并已從英特爾ported到680*0(Atari,Amiga,蘋果),SPAC,以及NS32016。linux緊緊地與80*86聯(lián)系在一起,方向錯了。

            別誤解我,我并非不喜歡linux,主要是Linux會使所有那些想在BSD UNIX上運(yùn)轉(zhuǎn)MINIX的人棄我而去。坦誠地說,對那些想獲得一個“現(xiàn)代的”免費(fèi)OS的人們,我想建議他們找一個基于微內(nèi)核的、portable的操作系統(tǒng),如GNU之類。

             

            安德魯?塔南鮑姆(ast@cs.vu.nl)

             

            附:順便說一下,Amoeba有一個UNIX仿真器(在用戶的空間中運(yùn)行),但是還遠(yuǎn)未完成。若有人有志在此方面努力的話,請告訴我。運(yùn)行Amoeba需要幾個386,其中一個要有

             

            于是,我知道有必要維護(hù)自己的榮譽(yù)了,所以就有了下面的反擊:

             

            來自:李納斯本尼迪克特托沃茲torvalds@klaava.Helsinki.Fi(李納斯?本尼迪克特?托沃茲)

            題目:回復(fù)“linux是過時的”

            日期:

            組織:赫爾辛基大學(xué)

             

            看到這種言論,我想我得有所回應(yīng)了。先向那些已經(jīng)聽夠了對linux系統(tǒng)進(jìn)行的議論的MINIX用戶們說聲抱歉。我很想能“對誘餌視而不見”,但是……該是我好好地自我辯護(hù)的時候了。

             

            安德魯塔南鮑姆寫道12595@star,cs,vu,niast@cs.vu.nl(安德魯?塔南鮑姆)寫道:

            >我在美國待了幾個星期,所以沒來得及對linux做多少評論(不是說如果我在,我就會說什么)。但是,Linux確實(shí)值得一評。我現(xiàn)在就有話要說。

            >正如你們所知,MINIX只是我的愛好,每當(dāng)晚上我寫煩了書,如果當(dāng)時沒有什么戰(zhàn)爭、革命、直播的參議院聽政會,我就會擺弄MINIX。我的真正職業(yè)是大學(xué)教授和操作系統(tǒng)領(lǐng)域中的研究人員。

             

            你用這個作為MINIX局限性的借口?對不起,但是你輸了。我的借口比你的還多,而linux在很多領(lǐng)域還是勝M(fèi)INIX一籌。更別說MINIX的大部分似乎是由布魯斯?伊文斯編寫的了。

            反駁一:你說你把MINIX當(dāng)作愛好來玩——那么,請問是誰在拿MINIX掙錢呢?又是誰在免費(fèi)發(fā)送linux呢?再來談?wù)剱酆谩W孧INIX能免費(fèi)獲得,我對MINIX的最大抱怨就會消失。Linux在很大程度上對我是一個愛好(但是一個很嚴(yán)肅的愛好,最棒的一種愛好)。我沒有從我的愛好中賺一分錢,它也不是我在大學(xué)要修的課程之一。我是純粹用我自己的時間,在自己的機(jī)器上做出來的。

            反駁二:你是教授和研究人員。這真是一個MINIX出現(xiàn)核心缺陷的好借口。我只能希望Amoeba不會像MINIX那樣垮掉。

             

            >1.微內(nèi)核對Monolithic system

            沒錯,linux是Monolithic的,我同意微內(nèi)核是好一點(diǎn)兒。如果不是你的話題有爭議性,我可能會同意你的大中分意見。從理論角度(及審美角度)而言,Linux輸了。如果GNU的kernel在去年春天就已完善的話,我可能就不會開始這個工程。而事實(shí)是,GNU還沒有完善,也遠(yuǎn)非如此。如果現(xiàn)在就已實(shí)現(xiàn)的這一點(diǎn)而論,Linux才大獲全勝。

            >MINIX是一個基于微內(nèi)核的系統(tǒng)。linux是Monolithic的系統(tǒng)。

            如果這是判斷一個kernel好壞的唯一標(biāo)準(zhǔn),你的觀點(diǎn)就對了。但你沒提到的是,MINIX在微內(nèi)核方面的表現(xiàn)并不出色,而且對核內(nèi)多元任務(wù)的操作仍存在著問題。如果我做的是一個在多線文件系統(tǒng)上有問題的OS的話,我就不會這么快來責(zé)備別人。而事實(shí)上,我竭盡所能來使人們忘記軟件設(shè)計者在此問題上的慘敗。

            (是的,我知道MINIX擁有眾多黑客支持者,但他們只是黑客。而布魯斯?伊文斯告訴我有很多可以競爭的機(jī)會。)

             

            >2.不分界域性

            “不會界域性是給那些寫不出新程序的人們準(zhǔn)備的。”

            ——我,現(xiàn)在剛說的,口出狂言

             

            事實(shí)上,linux比MINIX更具有分界域性。“你說什么?”我聽見你說。是真的——但卻不是在你所說的意義上。我使Linux盡量符合標(biāo)準(zhǔn)(我當(dāng)時手邊并沒有POSIX標(biāo)準(zhǔn))。把程序移植到Linux上比到MINIX上要容易得多。

            我同意,不分界域性是個好東西,但是只有在它確實(shí)有意義的地方才是個令人向往的特性。沒有必要專門使一個操作系統(tǒng)太具有不分界域性:能粘到可移植的API上就行了。操作系統(tǒng)的實(shí)質(zhì)就是利用硬件的特點(diǎn),并將其隱藏在一層高級的呼叫后面。而linux就是如此,它比任何kernel都更多地利用了386的特性。當(dāng)然這便利真正意義上的kernel變得不可移植,但是這也使設(shè)計大為簡化,是一個可以接受的權(quán)宜之計,因為這首先保證了Linux的誕生。

            我也同意,linux又太不具有不分界域性了。去年一月我擁有了自己的386,而Linux系統(tǒng)的創(chuàng)建在一定程度上成為了一個讓我認(rèn)識386的項目。如果要成為一個真正的項目,必須能夠在不分界域性方面做一些事情。但是,我最初的設(shè)計思想就是沒有考慮到不分界域性,如果我這樣說并不是太過分地為自己辯護(hù)。去年四月我開始這個項目時,認(rèn)為不會有什么人會真的使用它。我很高興我的這個想法錯了。隨著我對源代碼的發(fā)布,每個人都可以免費(fèi)來裝截Linux,哪怕還不是很方便。

            李納斯

             

            附:很抱歉我有時言辭過激。如果你沒有其他的操作系統(tǒng)可供選擇的話,MINIX已經(jīng)挺好的了。如果你有五到十個386機(jī)器閑著沒用,那么Amoeba也會不錯,只是我確定無疑是沒有的。我一般不會勃然大怒,但是在涉及到linux的問題時,我是有點(diǎn)容易感情用事。

             

            在這件事上還有一些口舌,那是我唯一一次發(fā)火。但是我要說明的問題是:的確有反對的聲音出現(xiàn),哪怕在早先的日子里(或者我還證明了這一點(diǎn):當(dāng)你參加網(wǎng)上論壇時,一定要小心從事,打字錯誤和語法錯誤會永遠(yuǎn)糾纏著你)。

             

            我和李納斯把家人和朋友留在露營地,開始沿著一條清流的小溪做一次午后散步。我們的露營地是在東西亞拉(Eastern Sierra)一個叫格魯夫爾溫泉(Grover Hot Springs)的地方。此時是

            “這種感覺一定很棒,”我說道,“那些年你一直跳不出戶,除了你的電腦之外只和這個世界保持著僅有的一點(diǎn)點(diǎn)聯(lián)系。突然間,這個星上的每一個角落都有人認(rèn)識到你正在進(jìn)行的偉大工作,你成了這個對你寄予厚望的發(fā)展中的linux世界的中心……”

            “我從不認(rèn)為這對我來說是什么大事情,”他回答道,“我真的不認(rèn)為是這樣。對我來說,linux確實(shí)是那種我隨時都在思考的東西,但這主要是因為總有問題需要我去解決。我確實(shí)為它投入了很多,但主要是因為它是一個智力的挑戰(zhàn),而不是因為任何感情的因素。

            “我喜歡有這么多的人給我從事這個事業(yè)的動力,我曾認(rèn)為自己已接受于完成它了,但我一直沒有真正做到這一點(diǎn)。人們始終給我更多繼續(xù)的理由,以及更多困擾的棘手難是,這使得繼續(xù)完善linux變得更為有趣。否則,我可能早就干其他事情去了。但我沒有,因為這是我喜歡的工作。做這件事充滿樂趣。我懷疑,我對自己的大鼻子或其他這方面的事情的提成,顯然比在Linux上花費(fèi)的精力還要多。”

            幾個星期后,在斯坦福購物中心,李納斯為怎樣挑選一雙慢跑鞋而犯愁。“你一般每星期跑多少里地?”售貨員問李納斯。李納斯不由得笑了起來:在過去十年里他還從未?上過一里地。鍛煉不是過去的首選功課。但在他感到疲憊的時候,李納斯承認(rèn)他愿意走出過度的自我監(jiān)禁式生活。

            “塔芙一定求過你,要你幫我去掉大肚子。”他開著開玩笑,一邊拍著自己的肚子。

            “告訴她,她的要求你本周內(nèi)絕不可能達(dá)到。”我回答道。

            接下來的一個半小時,我們開始在斯坦福校園里兜圈,以便找到一個可以合法停車的地方。然后,在伸展了一下胳膊腿之后,我們開始跑了起來。我們越過干涸的湖里狹窄的泥土小道來到林中,向著我們的目標(biāo)——山頂巨大的衛(wèi)星接收天線——前進(jìn)。當(dāng)然,我們根本沒有跑到那兒。我一邊邁著不尋常的輕快步伐奔跑,一邊很驚訝李納斯能夠僅僅以一里的距離落在我后面而不被甩開。接著他終于不行了,幾分鐘后,我們在邊的草上上舒展地躺了下來。

            “你的家里人對因linux而發(fā)生的一切事情的反應(yīng)是怎樣的?”我問道,“他們對此一定感到非常的激動。”

            “我不認(rèn)為有誰真的對此很在意,”他回答道,“我不是說沒有人真的關(guān)心這件事。但我一直花費(fèi)我最多的時間在編程序上,這一次也與以前沒什么不同,他們不至于為此而有什么更多的關(guān)切。”

            “那么,你一定曾對你的親屬們說過些什么。比如當(dāng)你和你爸爸一同出動時,你是否曾對他說:‘嘿,你可能不會相信我一天到晚在計算機(jī)上鼓搗的那個玩藝兒現(xiàn)在怎么樣了,現(xiàn)在已經(jīng)有好幾百人在用它了……”

            “沒有,”他回答道,“我只是覺得沒有必要與家人和朋友分享這些,我從來也沒有想過要把它推薦給更多的人。我想起了在我寫linux程序時,拉素曾經(jīng)決定要買Xenix,UNIX的SCO系統(tǒng)版(微軟開發(fā)的用于PC機(jī)的UNIX版本)。我記得他曾經(jīng)試著勸說我‘不要在這上面犯錯誤了。’他的意思是叫我不要再繼續(xù)寫下去了。但我不在意他的話,最終,在這個問題上他也有所轉(zhuǎn)變。但對我來說,Linux仍然不是什么大事情。在我看來,人們使用它固然是好事情,能夠從中獲得反饋意見也很棒,同時這些卻并不是那么重要。我不想傳播什么福音。我為人們使用我的代碼而感到驕傲,但我從來也沒有過要與所有人共同分享它的念頭。我從來沒有認(rèn)為這是世界上最重要的事情。我也不認(rèn)為有幾百人用我的軟件有任何的重要性可言,以至要告訴我爸爸。不是的,它對我來說更多的是一種樂趣。直到今天我也還是這么認(rèn)為。”

            “那么,你甚至都沒有想過告訴你的父母、家人和朋友這些事嗎?你自己真的不為這些事情而激動嗎?”我問道,沒有掩飾我的懷疑。

            他沉吟了幾秒鐘,然后回答道:“我不記得我當(dāng)時是否感到過激動。”

            李納斯買了一部新車,一部按他的定義很有“樂趣”的寶馬Z3雙座敞篷車,車身是金屬藍(lán),完善的男孩子的汽車顏色。他選中這款顏色是因為沒有他所中意的亮黃色。這黃色的寶馬,他解釋道,“看起來就像尿。”幾年來,他去位于圣克拉拉的Transmeta公司總部上班時,總是將他的龐蒂亞克車盡可能停在離大門口近的地方。但現(xiàn)在,他卻將心愛的寶馬車停在他辦公室外的窗前,按他的廉潔這樣可以停在陰影中避免暴曬。于是,現(xiàn)在李納斯在電腦前工作時就可以不時地欣賞一下他的新車了。

            大約在一年多以前,我們曾經(jīng)首次在一起外出旅行——開著我特意租來的白色野馬敞篷車翻山去圣克塔克魯茲。在我們這次旅行期間,李納斯曾停下來觀察我們所參觀的桑拿浴場和釀酒廠外停著的運(yùn)動型轎車。現(xiàn)在,我們是在他自己的運(yùn)動轎車?yán)锓皆綆X。當(dāng)他在十七號公路上駛過彎路時,他臉上浮起微笑。

            “你應(yīng)該得到這些。”我說。

            我從車內(nèi)的儲物箱里拿出一摞CD。

            “聽什么?平克?弗洛伊德?”我問道,“或者詹妮斯?喬普林?”

            “這是我小時候聽的音樂。我小時候從來沒有在音樂上花過錢,但我在我家的房間里撿到過它,我猜是我媽媽聽過的,盡管我記得她是艾爾維斯?卡斯蒂羅(Elvis Costello)的歌迷。”

            這是一個周五的下午,一個歡快而美好的加利福尼亞周五的下午,各種令人愉悅的感覺圍繞著我們:藍(lán)色的天空映入眼簾,火辣辣的陽光照在身上,鼻子里是山中桉樹的芳香和清新空氣的甜甜味道,耳中傳來的是平克?弗洛伊德的歌聲。在外人的眼里,我們看起來一定很像那種后青春期的陳腐過客,涂著防曬霜,放著經(jīng)典的搖滾曲調(diào)。不過,并沒有多少車超過了李納斯的新寶馬Z3。

            我們把車停在圣塔克魯茲以北一點(diǎn)兒的一號高速公路旁。路旁早停了些普通的車子,我們來到幾乎沒有什么人的空曠海灘上,舒舒服服地躺了下來。幾分鐘后, 我從背包里掏出錄音機(jī)。再一次的,我請他講一講linux早期的事情。

            李納斯用手指在沙灘上畫了個四方形,表示是他的臥室,然后又指出了他的床和計算機(jī)的位置。“我起床的第一件事就是檢查有新的電子郵件,”他說道,一邊用手指比劃著,“有些時候我一整天都呆在屋子里。我看郵件不僅僅是為了看有誰在和我聯(lián)系,而更多的是為了看是否附帶為我準(zhǔn)備了些特殊的問題,比如是否出現(xiàn)了新的狀況和問題,或者是一些我們已有解決方案的老問題又遇上了新情況。”

            李納斯告訴我,那個時候他的社會生活是“可憐”的。接著他認(rèn)為這樣說聽起來有點(diǎn)過分,所以他修正道,“可能比可憐稍微好一點(diǎn)。”

            “我并沒有成為一個完全的隱士,”他說道,“但是即使在linux出現(xiàn)之后,我一如既往地不善交際。我的大多數(shù)朋友都很善于與人相處,但我不行。你可以想象一下,如果從來沒有給女人打過電話,那約會的情況會是怎樣的呢?所以在那段時間里,我只有幾個常到我那里敲窗子、想和我喝杯茶的朋友。我不認(rèn)為有人會到處傳說我正在做一項偉大的事業(yè)、我將改變世界之類的話。我不認(rèn)為有人曾經(jīng)這么想過。”

            李納斯唯一有規(guī)律的社交活動是每周的學(xué)生聚會,在這兒他可以和其他主修科學(xué)的學(xué)生混在一起,這個聚會由一些對技術(shù)的熱愛勝過一切的人組成。

            “什么是我擔(dān)心的?正是一般的社交活動,也許提成不是一個準(zhǔn)確的詞匯,但這確實(shí)給我?guī)砹撕芏嗲榫w上的影響。在那個時候,只要一想到姑娘,linux系統(tǒng)就變得不再重要了。在某種程度上,今天也還是這樣,我仍然可以不把Linux當(dāng)回事。

            “在大學(xué)的頭些年,社會交際對我來說變得非常重要。這倒不是因為擔(dān)心別人會嘲笑我駝背什么的,這種渴望社會活動的感覺來自于對朋友和別的什么東西的向往。我喜歡去學(xué)生聚會的原因之一就是,這是一種無須過分社會化的社交活動。在這樣的晚上我融入了社會,而在其他時間我與計算機(jī)在一起。在學(xué)生聚會里玩遠(yuǎn)比linux更為感性,我從未為Linux感到心煩意亂,也從未因為Linux而睡不著覺。

            “過去和現(xiàn)在,能夠使我心煩意亂的,從本?上講并不是技術(shù),而是與之相關(guān)的社會因素。我為安德魯?塔南鮑姆的帖子如此心煩的原因,主要不是因為他所提出的技術(shù)觀點(diǎn)。

            “使linux越來越完善和有活力的原因之一是,我不斷地收到回饋的信息。這意味著Linux被人所注意,同時這也是一個正在形成的社會團(tuán)體,而我是這個社會團(tuán)體的領(lǐng)袖。這是一個明確的信號。這一毫無疑問是重要的,甚至比告訴爸爸媽媽我曾做了些什么更重要。我越來越關(guān)注那些使用Linux的人,至于我創(chuàng)造了一個社會圈子并獲得了他們的尊重之類,卻始終不是我關(guān)心的重點(diǎn),甚至現(xiàn)在也仍然不是。不過,這確實(shí)是一個最重要的事實(shí),也是我對塔南鮑姆的指責(zé)如此反應(yīng)過度的原因。”

            太陽已經(jīng)沒入了太平洋,到了該離開海灘的時候了。李納斯堅持要我駕駛他的車返回——以體驗一下這車究竟有多棒。我們要經(jīng)過一段又長路又多的九號路返回硅谷。

            李納斯告訴我,他與MINIX創(chuàng)造者之間的爭執(zhí),因為變得越來越富于攻擊性而不再適于在公眾面前進(jìn)行,最后不得不通過私人電子郵件進(jìn)行。接下來是幾個月的平靜。一天,塔南鮑姆給李納斯來了一個電子郵件,指出在《Byte》雜志的背面有一條五行字的廣告在推銷商業(yè)性的linux版本。

            “在我最后一次收到的來自安德魯?shù)碾娮余]件中,他問我是否真的在授意別人出售我的系統(tǒng)。我回信告訴他是的。然后我就再也沒有收到過來自他的訊息了。”

            大約一年后,當(dāng)李納斯到荷蘭去作他的首次公開演講時,有機(jī)會來自塔南鮑姆任教的大學(xué),并希望獲得那本改變了他一生的書籍——《操作系統(tǒng):設(shè)計與執(zhí)行》——的作者在該書上的親筆簽名。李納斯在門口等了許久,但塔南鮑姆并沒有出現(xiàn),因為那時他恰好外出了。就這樣,他們至今仍沒有見過面。

             

            在我首次公開演講的頭天晚上,我顫抖著躺在床上。房間里很冷,溫度也就剛好在零度以上一點(diǎn)。荷蘭的房間不像芬蘭那樣冬天有暖氣,而我這間漏網(wǎng)的大屋子甚至還有一扇大玻璃窗,就好像荷蘭永遠(yuǎn)只有夏天似的。但是,在

            在公開場合講話一直是我的短項。中學(xué)時,他們讓我說明一些我們曾吃力地研究過的東西,比如老鼠或其他什么的,而我總是講不好。我站在那里,說不出話來,然后開始傻笑。說真的,我并不喜歡這樣。當(dāng)我很不情愿地被老師叫到黑板前,當(dāng)著全班同學(xué)解答習(xí)題時,甚至比這還要難受。

            在阿姆斯特丹附近的埃德市(Eide),我接受了在這里舉行的荷蘭UNIX用戶第十五屆年會的邀請,將在會上做主題發(fā)言。我很想通過這次機(jī)會證明一下自己在公開場合的說話能力。在此之前一年,我也曾收到過來自西班牙的類似邀請,但我拒絕了。其實(shí)在那個時候,我是非常希望出國旅行的,但我想前往一游的愿望被害怕公開演講的心理抵消了(我現(xiàn)在仍然喜歡旅行,不過在今天,這已經(jīng)不像當(dāng)年那樣新鮮了。在那之前,我?guī)缀鯊奈措x開過芬蘭。那以前我唯一到過的地方就是瑞典,我們在那兒露營過幾次,或許還可以算上到莫斯科去看我爸爸那次,那時我才六歲)。

            拒絕到西班牙莊旅游一番的機(jī)會讓我有些懊惱。所以我告訴自己,如果還有第二次這樣的機(jī)會,我絕不放過。我躺在床上,另外一些思緒漸漸取代了我的回想:我能克服恐懼站在人前嗎?我還會像過去一樣囁嚅嗎?或者比這更糟,我會在將近四百名來賓面前舔著嘴唇傻笑嗎?

            要真是那樣,我就真是一個不折不扣的傻瓜。

            我對自己說些慣常的廢話以勸慰自己。來賓都希望我成功,如果不喜歡我的話他們根本就不會來,并且我也很熟悉演講的主題:在linux的核心產(chǎn)品中采用那些不同的技術(shù)決定的理由,以及開放源代碼的理由。然而,盡管如此,我還是不能讓自己確信演講會取得成功。我的腦子里像是有一臺停不下來的火車引擎一樣軋軋作響。

            演講到底怎樣?噢,來賓們看到我明顯地帶著驚慌站在他們面前,把通過Power Point——感謝上帝安排微軟發(fā)明了這種軟件——放映幻燈作為敷衍場面的救生工具,并在回答他們的問題時羞澀遲疑,但他們富有同情心地接受了我的表現(xiàn)。

            事實(shí)上,我的答疑是演講中最棒的一部分。在我演講完之后,馬歇爾?克爾克?邁克庫斯克(Marshall Kirk McKusik)——他現(xiàn)在在太陽微系統(tǒng)公司工作——走到我跟前,說他認(rèn)為演講很有趣。對這個表示我是如此感謝,我覺得我都想跪下來吻他的腳以示謝意了。在計算機(jī)領(lǐng)域里很少有讓我尊敬的人,克爾克卻是其中之一。正是因為在我第一次演講后,他對我是如此的友善。

            我的第一次演講就像是在進(jìn)行休克療法。接下來我還要遭遇許多類似的狀況,但這些經(jīng)歷開始讓我變得更自信了。

            大衛(wèi)一直在問我,伴隨著linux的不斷成長壯大,我的大學(xué)生活尤其是精神狀況有怎樣的變化。但我不記得有

             

            9、最后的沖刺

            1992年秋天我成了一名用瑞典語講授計算機(jī)基礎(chǔ)課的助教(這事的起因是,系里需要人用瑞典語上基礎(chǔ)課,但在這之前的幾年里,本系只有兩名能講瑞典語的主修生,拉爾斯和我,他們沒有更多的選擇,所以找上了我)。真實(shí),我甚至對?上講臺和演算習(xí)題都感到擔(dān)心,但這種情況持續(xù)得并不長,靠把注意力集中在講課內(nèi)容上并盡力不去自尋煩惱,我戰(zhàn)勝了自己的擔(dān)心。就這樣,三年后我晉升為研究班的助教,從此,我的工作不再是在講臺上講課 主要是在實(shí)驗室里繼續(xù)linux的發(fā)展完善研究。這可能也預(yù)示著一種趨勢:有人愿意付酬讓我從事Linux的研究。這也是我和Transmeta之間關(guān)系的基礎(chǔ)。

            大衛(wèi):“那么,linux是在什么時候開始成為一件大事情的?”

            我:“它到現(xiàn)在為止也還不是。”

             

            也許我說得太絕對了?好的,我可以作一點(diǎn)修正,在有許多人毋庸置疑地依賴著linux(作為他們計算機(jī)的操作系統(tǒng))而不是把它當(dāng)作玩具式的操作系統(tǒng)的情況下,它確實(shí)變得更像那么一回事了。當(dāng)他們開始不再只是把它作為修修補(bǔ)補(bǔ)的玩意之后,我就認(rèn)識到,如果出了什么問題的話,我就要對此負(fù)責(zé)任。或者說,我至少在精神上感到了某種責(zé)任感(至今還是如此)。在1992年,Linux從一個更像是游戲的玩意變成了一些人生活中不可或缺的一部分,成為他們的生計和生意。

             

            變化發(fā)生在1992年春天。過了大約一年半后,當(dāng)?shù)谝粋€X視窗系統(tǒng)在linux條件下運(yùn)行時,我開始著手進(jìn)行終端仿真。它意味著這個操作系統(tǒng)將有能力支持一個圖形用戶的界面,而用戶也可以在多視窗條件下工作。這個工作應(yīng)該歸功于麻省理工學(xué)院的X視窗項目(X Windowing Project)。這個工作的完成將帶來一個很大的改變。我還記得在此之前的大約一年半,我還和拉爾斯開玩笑,說總有一天我們會完成一個在Linux下運(yùn)行的X系統(tǒng)。但我絕沒想到這一天這么快地來到。一個名叫奧瑞斯特?扎布羅斯基(Orest Zborowski)的黑客能夠把X視窗裝載到Linux上去。

            對于我們有了圖形用戶界面的事實(shí),我有一個短暫的適應(yīng)過程。在最初的一年里我甚至都沒有把它作為通常的運(yùn)行環(huán)境,但是現(xiàn)在我簡直不能沒有它了,在我工作時總是同時開著許多窗口。

            奧瑞斯特的貢獻(xiàn)不僅使我們有了窗口,同時它還打開了通向未來的大門。Domain Socket可以用于能夠支持X視窗系統(tǒng)運(yùn)行的本地網(wǎng)絡(luò),但我們可以指望這些同樣的套接字(Socket)能讓linux有能力跳出本地網(wǎng)絡(luò),而可以異地連接計算機(jī)。沒有網(wǎng)絡(luò)化的功能,Linux只能對那些從不上網(wǎng)或只是在家撥號上網(wǎng)的人還有點(diǎn)用。

            靠著極大的樂觀主義精神,我們開始在這些新穎的套接字上開發(fā)linux的網(wǎng)絡(luò)工作功能,哪怕這些套接字本來完全不是為網(wǎng)絡(luò)工作而設(shè)計的。

             

            我相信這很容易做到。我們有一個關(guān)于版本發(fā)表的編號進(jìn)度表,原計劃是在1992年5月發(fā)表0.13版,由于有了恰當(dāng)?shù)膱D形用戶界面,我感到我們對一個完整的、可靠的并且支持網(wǎng)絡(luò)工作的操作系統(tǒng)這一既定目標(biāo)有了95%的把握,所以我把將要發(fā)表的新版重新命名為0.95版。

            嘿,我是不是很天真?請不要提到這個讓我難堪的話題。

            網(wǎng)絡(luò)功能的開發(fā)讓人很厭煩,我們花了差不多整整兩年的時間去完成它,以形成一個可以發(fā)表的東西。當(dāng)要加入網(wǎng)絡(luò)功能時,突然之間所有的新問題都冒了出來,全都與安全問題有關(guān)。你不知道誰在旁邊,也不知道他想要干些什么,你不得不足夠小心地防備惡意的垃圾郵件對你的系統(tǒng)的攻擊;同時,也再也不能完全控制有人想和你的系統(tǒng)連接的企圖了。此外,許多人使用著不同的網(wǎng)絡(luò)設(shè)備,依靠TCP/IP網(wǎng)絡(luò)通訊協(xié)議這樣的網(wǎng)絡(luò)工作標(biāo)準(zhǔn),很難讓所有的超時(time-outs)正確。這些問題看起來好像要一直久拖不決下去。

            到1993年末,我們大致上有了一個網(wǎng)絡(luò)工作能力的解決方案,盡管部分人還很難讓它正常地工作。我們還不能在沒有8-bit boundaries的情況下解決網(wǎng)絡(luò)問題。

            我過分樂觀地將新版本定名為0.95版,而不甚樂觀的實(shí)際情況卻將這種樂觀變成了一種束縛。又花了我們將近兩年的時間,1.0版才得以問世。在此期間,我們?nèi)匀恍枰煌5匕l(fā)布各種有關(guān)瑕疵修和添加功能的新版本。但在0.95和1.0之間,卻沒有那么多的數(shù)字可以作為序號,這讓我們著實(shí)有些瘋狂。等到0.99也用過之后,我們只好在它后面加上數(shù)字以簡要表示附加的序列,接著又開始依靠字母來表示,比如0.99版第15A次后面緊接著0.99版第15B次,0.99第15Z次是最后一個以此方式命名的版本,因為,原本應(yīng)該命名為0.99版第16A次的版本正是我們已經(jīng)完成了的linux 1.0版。

            1994年5月,新版本終于在赫爾辛基大學(xué)計算機(jī)科學(xué)系的禮堂里閃亮登場。現(xiàn)在回過頭去看,完成這一版本的過程完全可以說混亂不堪的。

            但是,沒有任何東西可以阻擋linux的普及。我們有了自己的討論組,取名為comp.os.linux,這是一個從我和安德魯?塔南鮑姆激烈戰(zhàn)斗的劫后灰燼中誕生出來的小團(tuán)體,一個極具吸引力的游牧部落。當(dāng)時,還或多或少地主導(dǎo)著互聯(lián)網(wǎng)的Internet Cabal,每月都會針對每個討論組吸引了多少讀者發(fā)布一個非官方的統(tǒng)計報告,盡管這不是一個可以完全依賴的統(tǒng)計報告,但卻是你可以找到的有關(guān)你的站點(diǎn)——在這里是指有多少人對Linux感興趣——的普及程度的最好的參考信息。Alt.sex(一個著名的性問題網(wǎng)站,以另類性愛為其訴求——譯注)站點(diǎn)那時是最受歡迎的(不過我對它并不熱衷,我確實(shí)上過它一兩次,不過是為了看看它吸引人的究竟是些什么玩意罷了。我更像是你那種類型的清心寡欲者。我寧愿和我的浮點(diǎn)處理器呆在一起,也不愿參與到alt.sex上那些熱門話題中去——什么最新的做愛姿勢啦,以及什么關(guān)于深度愛撫者們的報告之類)。

            通過Cabal的月度統(tǒng)計,我可以很方便地追蹤我們兩個討論組(comp.os.linux.)在網(wǎng)上的聲望。而事實(shí)上我也確實(shí)做了這樣的跟蹤(雖然我可能是一些人心目中民于向強(qiáng)勢挑戰(zhàn)的英雄,但我卻從來也不像那些糊弄人的新聞所表達(dá)的那樣,是一個只知道科技的無私和利他主義的孩子)。到1992年秋天,我們的討論組成員估計已經(jīng)超過萬人,這里面有些人只是加入到討論組來自自到底發(fā)生了些什么,而并不是linux的使用者。每個月的統(tǒng)計結(jié)果出來的時候,首先提供的是一個普及率排名前四十名的討論組的簡要報告,如果你的討論組沒有擠進(jìn)前四十名的話,你可以從另一個地方取得在這四十名之外的其他討論組的完整報告,而我當(dāng)時就不得不經(jīng)常這樣做。

            我們的討論組的排名仍在緩慢爬升。終于有一天,它擠進(jìn)了前四十名。

            這真是太棒了!我是如此地感到高興,我記得我還為此寫了一篇文章,在其中我基本列舉出了包括MINIX的各種不同的操作系統(tǒng),并說:“嗨,你們瞧,我們比(微軟)視窗還要普及。”其實(shí),真正的原因是當(dāng)時的視窗系統(tǒng)還不能應(yīng)用于互聯(lián)網(wǎng)上。

            1993年,我們的討論組闖入排名前五位。那天晚上,我?guī)е薮蟮淖晕覞M足感躺到床上,為這樣一個事實(shí)而興奮無比:comp.os.linux和alt.sex不相上下,這意味著,linux應(yīng)得和性一樣普及了。

             

            在我的小世界里當(dāng)然不會有這樣的競賽。

            我真的沒有什么生活。在那個時候——正如我在前面已經(jīng)提到過的,彼德?安文組織了一次在線捐活動,共籌得了三千元幫助我買計算機(jī)。在1993年圣誕節(jié),我的計算機(jī)升級為486DX266——它在此后還要陪伴我好些年。在那個時候我的生活不過如此:吃、睡、到學(xué)校、編程、讀電子郵件。我的朋友們越來越走向社會,我對此已習(xí)以為常。

            十分坦白地說,我的大多數(shù)朋友也是失敗者。

            在埃德的那次演講幾乎使我確信我能應(yīng)付任何事情,既然連站在一群儼然陌生的人面前并成為他們注意的中心這樣難堪的事我都可以應(yīng)付,我的信心在其他方面也漸漸建立了起來。我被迫就linux的修補(bǔ)和升級問題迅速做出了決定,而每一次這樣的決定,都讓我感到作為一個成長中的團(tuán)體的領(lǐng)袖,我是稱職的。在所有的決定中,純粹的技術(shù)決定并不成其為問題,困難的是用老練的技巧向一個人指出你更樂于采用另一個人的建議而不是他的。有時候,我只是這樣簡單地對他說:“這東西用起來很不錯,我們就用它吧。”

            我從不認(rèn)為接受不同于自己的想法是找到最佳解決方案的辦法,而認(rèn)為這可以防止在提出不同的競爭的程序員之間形成對立。盡管當(dāng)時我可能不是這樣想的,但這樣做也有助于獲得別人的信任。信任不是沒有用的,在人們相信你時,他們更容易領(lǐng)會你的建議。

            當(dāng)然,你首先要建立別人之所以信任你的基礎(chǔ)。對我而言,我猜想主要不是因為我發(fā)明了linux的核心部分,而是因為我最終做出了將它放到互聯(lián)網(wǎng)上、并且對所有希望使用或改進(jìn)它的人公開源代碼的決定。

             

            多從未想過自己在計算機(jī)之外的現(xiàn)實(shí)生活因為linux而有所改變,我也從未想過要做一位領(lǐng)導(dǎo)者。這一切的發(fā)生完全是一種偶然。

            在一些關(guān)鍵性的發(fā)展階段中,一個五人核心開發(fā)小組開始擔(dān)當(dāng)大多數(shù)的開發(fā)任務(wù),他們由此覺得自己好像是一個篩子,有責(zé)任維持這個領(lǐng)域的工作。

            我很早就明白,最好的領(lǐng)導(dǎo)者不是讓手下做他要求他們做的事情,而是讓手下做他們自己想要做的事。同時,最好的領(lǐng)導(dǎo)者也明白,當(dāng)手下犯錯時,要讓他們自己有能力糾正而不要總是自己出面糾正。最佳的領(lǐng)導(dǎo)者是能夠讓手下自作主張的人。

            讓我換一個表述。

            linux所取得的許多成功,其實(shí)可以歸結(jié)為我的缺點(diǎn)所致:

            1、 我很懶散。

            2、 我喜歡授權(quán)給其他人。

            黑客們,不,程序員們,把在linux和其他開放源代碼的項目上工和放在比睡覺、鍛煉身體、小圈子聚會,以主,有時是性生活更優(yōu)先的地位。因為他們喜歡編程,更因為他們樂于成為一個全球協(xié)作努力的活動的一部分——Linux是世界上最大的協(xié)作項目,這一努力將給所有喜歡它的人帶來最好最美的技術(shù)。這種努力是如此率真,又是如此有趣。

            好了,我現(xiàn)在聽起來就像是在不知羞恥地自吹自擂。開放源代碼的黑客(程序員)們,不是特蕾莎修女在高技術(shù)領(lǐng)域的翻版,他們也在每個項目的“貢獻(xiàn)者名單”和“歷史記錄”等文件中將他們的名字和貢獻(xiàn)聯(lián)系在了一起。最為多產(chǎn)的貢獻(xiàn)者,將獲得那些希望獲得代碼和雇傭頂尖程序員的產(chǎn)的注意。此外,黑客們的很大一部分動力,也來自于靠實(shí)實(shí)在在的貢獻(xiàn)獲得同行的認(rèn)可和尊重的企圖,這是一個重要的激勵因素。每個人都想影響自己的同行、提高自己的聲譽(yù)、改善自己的社會地位。

            開放源代碼的發(fā)展項目給黑客們提供了這樣的機(jī)會。

            不用說,我在1993年也如同在1992年、1991年一樣將大部分時間花在了電腦前,這看來應(yīng)該有所改變了。

             

            10、塔芙

            跟隨著我爺爺?shù)膶W(xué)院教學(xué)生涯,我也成了赫爾辛基大學(xué)的一名助教,被分配在這年秋季學(xué)期里開始用瑞典語教授《計算機(jī)科學(xué)入門》課程。

            就這樣,我遇上了塔芙。她對我一生的影響甚至比《操作系統(tǒng):設(shè)計與執(zhí)行》一書對我的影響還要大。不過,我不會用這種影響的細(xì)節(jié)來讓你煩惱的。

            當(dāng)時,塔芙是我的班上十五個學(xué)生中的一個。她已經(jīng)有了一個學(xué)齡前教育學(xué)的學(xué)位(不像在美國,芬蘭要求學(xué)齡前兒童的教師要有大學(xué)學(xué)歷),她還想學(xué)習(xí)計算機(jī),卻不能取得像班上其他同學(xué)那樣的進(jìn)步。當(dāng)然,最后她還是?上去了。

            我們交往的過程是如此簡單。那是在1993年秋天,互聯(lián)網(wǎng)還沒有流行開來。因此,有一天,我在這個班布置的家庭作業(yè)就是給我發(fā)一個電子郵件(這要放在今天簡直要笑死人),我對學(xué)生說:“今天的家庭作業(yè):發(fā)給我一個電子郵件。”

            其他人的郵件不是一些供記錄的短語,就是一些沒什么意思的筆記。

            只有塔芙,她邀請我和她出去約會。

            我娶了第一個通過電子方式走近我的女人。

            塔芙是一個曾六次獲得過芬蘭空手道冠軍的幼兒園教師。她的家庭很獨(dú)特,盡管我認(rèn)為還不如我們家那么離奇。她有許多朋友。從我們在一起的第一刻起,她就像是最適合我的女人。經(jīng)過了幾個月的約會,我和我的貓?zhí)m迪就搬到她的公寓房間去了。

            在搬進(jìn)去后的最初兩周,我甚至都沒有動過一下我的計算機(jī)。

            不算上我服兵役的時間,這兩周是我自從我十歲那一年坐在外祖父膝蓋上擺弄計算機(jī)以來,離開計算機(jī)最長的一段時間了。不必詳細(xì)描述,但這確實(shí)是除去服兵役之外我離開計算機(jī)最長的時間的記錄了。不知為何,我并不為離開計算機(jī)而難受(再次聲明,具體情節(jié)對你來說并不感興趣)。對于這一切,我曾經(jīng)看見她有幾次嘀咕過什么“母性的勝利”,而我爸爸和妹妹可能只是感到困惑罷了。

            不久,塔芙去找了只貓來和蘭迪做伴。

            晚上我們都有很好的安排,或是就我們倆人在一起,或是找?guī)讉€朋友一塊兒玩。早上五點(diǎn)我們就起床了,她去上班,而我也好早點(diǎn)兒到學(xué)校去,在沒人打擾的情況下讀一讀與linux有關(guān)的電子郵件。ÿ   


            posted on 2008-03-08 23:14 七星重劍 閱讀(555) 評論(0)  編輯 收藏 引用 所屬分類: 亂七八糟
            日本久久久精品中文字幕| 久久777国产线看观看精品| 久久精品国产一区| 久久er99热精品一区二区| 久久香综合精品久久伊人| 蜜臀久久99精品久久久久久| 久久伊人精品青青草原高清| 国产精品久久久久久搜索| 久久精品一区二区| 97久久超碰成人精品网站| 无码精品久久久久久人妻中字| 18禁黄久久久AAA片| 久久人人爽人人爽人人片AV不| 亚洲欧洲久久久精品| 久久亚洲精品国产精品婷婷| 久久无码AV一区二区三区| 波多野结衣AV无码久久一区| 国产亚洲精久久久久久无码77777| 久久人人爽人人爽人人爽| 无遮挡粉嫩小泬久久久久久久| 无码国内精品久久人妻| 99久久人妻无码精品系列蜜桃| 国产欧美一区二区久久| 国产综合免费精品久久久| 久久精品国产亚洲精品| 久久国产精品无| 久久成人国产精品免费软件| 久久精品人人槡人妻人人玩AV | 久久精品这里热有精品| 久久97精品久久久久久久不卡| 99久久婷婷国产综合精品草原| 精品久久久久久无码人妻热| 色综合久久夜色精品国产| 精品无码久久久久久尤物| 日本福利片国产午夜久久| 亚洲精品视频久久久| 久久天天躁狠狠躁夜夜96流白浆| 久久91精品久久91综合| 亚洲日韩欧美一区久久久久我| 久久精品午夜一区二区福利| 国产精品成人无码久久久久久|