《Unix传奇》:众神的创世记
引言
尼爾·蓋曼有部小說《美國眾神》,這是一本很有意思的書。它說的是在美國這片歷史并不長的土地上,隨著移民文化而到來的各路新舊大神,彼此之間的陰謀與斗爭。
書中有一個讓我覺得很新奇的設(shè)定,就是新生事物也有著各自的神。例如高速公路之神、計算機之神、互聯(lián)網(wǎng)之神等。這些神所獲得的祭祀,就是來自人類頻繁的使用。
當(dāng)我看到布萊恩·W·克尼漢(Brian W. Kernighan)所著的《Unix傳奇》一書時,我忽然發(fā)現(xiàn),現(xiàn)代操作系統(tǒng)終于也有了自己的神。
不過,這并不是某一個人的故事,而是前后幾十年間,一批又一批頂尖智慧的頭腦共同創(chuàng)造出一個新世界的傳奇。就是這樣一群卓爾不凡之人,可稱為Unix操作系統(tǒng)的眾神。
這是一長串閃耀著光芒的名字,在這串智慧珍珠之中最耀眼的有肯·湯普森、丹尼斯·里奇、道格·麥基爾羅伊、阿爾·阿霍、彼得·溫伯格、比爾·喬伊,還有布萊恩·克尼漢……
要講述眾神創(chuàng)世的故事,自然要先從他們的神殿說起。
計算機科學(xué)的神殿
從美國的金融中心紐約市出發(fā),向北30多公里就會到達新澤西州的墨里山。此處風(fēng)光秀麗,景色迷人,誰能想到聞名世界的科技殿堂就座落于此,這就是著名的貝爾實驗室。
貝爾實驗室由AT&T(美國電話電報公司)創(chuàng)建,其初衷是為了解決建設(shè)全國電話系統(tǒng)時遇到的科技問題。隨著時間的推進,以及科技的不斷發(fā)展,貝爾實驗室在計算機科學(xué)領(lǐng)域做出了諸多開創(chuàng)性的貢獻。
要說這個實驗室有多牛叉,先上一組數(shù)字,這里誕生了9項諾貝爾獎和5項圖靈獎。可以想象,在這里能占著一張辦公桌的,那都是頂尖的人物。
那么,為什么貝爾實驗室能吸引到如此之多的大神,而且還能引領(lǐng)計算機科學(xué)的創(chuàng)新呢?
答案就是寬松的研究環(huán)境、開放自由的學(xué)術(shù)氛圍,以及由技術(shù)專家擔(dān)任的管理團隊。當(dāng)然,充足的資金和優(yōu)渥的待遇也是重要條件,反正AT&T公司是不差錢的主。
在貝爾實驗室,管理層不會下達明確的目標和指令,研究者完全可以按照自己的意愿去工作。這看起來似乎有些不可思議,連要做什么都不知道,誰能保證投的錢不會打水漂,會不會有人上班就是在摸魚呢。
這就是前沿科學(xué)的特點,它無法被設(shè)計,研究成果大多是在頂級的智慧群體之中交流、碰撞出來。所以在貝爾實驗室想要站住腳,光靠腦子好使還不行。必須要充分融入這個集體之中,能提出自己獨到的見解,也能無私地為他人提供幫助。
因此貝爾實驗室根本不擔(dān)心會有人在摸魚,拿不出成果的人在這里自然也待不下去。能留下的,也會不斷成長,最終成為神殿里的一員大神。
這樣看來,大神們做的就是極具難度的開創(chuàng)性研究,出成果確實不容易。但研究成功,則是改變世界的創(chuàng)新。從投資的角度看,十個項目里能成功一個,就足以在業(yè)界保持領(lǐng)先了,付出的成本對AT&T來說還是很劃算的。
這就是貝爾實驗室能夠獲得成就的原因所在。接下來我們要說的就是眾神開發(fā)Unix的創(chuàng)世之旅。
第二系統(tǒng)效應(yīng)
計算機最基礎(chǔ)的軟件是操作系統(tǒng),它可以看成是機器與人之間的一層接口。操作系統(tǒng)本就是計算機的一部分,沒有操作系統(tǒng)的機器,則空有強大的計算能力卻發(fā)揮不出應(yīng)有的效能來。
麻省理工學(xué)院在1964年推出了CTSS(兼容分時系統(tǒng)),就是將CPU的算力按時間分片,可以支持多人同時操作。那時計算機是非常寶貴的資源,這一設(shè)計可以讓更多人使用計算機,自然CTSS得到了許多關(guān)注。
麻省理工的研究者們決定趁熱打鐵,他們要在CTSS的基礎(chǔ)上研發(fā)一套更好的操作系統(tǒng),稱之為Multics。目標是可以成為通用的信息處理系統(tǒng)。同時麻省理工也希望,其他有實力的研究機構(gòu)與企業(yè)能參與到研發(fā)與生產(chǎn)中來。
因為貝爾實驗室在很早就開始了對計算機操作系統(tǒng)的研究,因此獲得了麻省理工學(xué)院的青睞,由貝爾實驗室來負責(zé)操作系統(tǒng)軟件的開發(fā)。而通用電氣則負責(zé)計算機硬件的制造和生產(chǎn)。
在為Multics進行設(shè)計的時候,麻省理工的研究員們將自己諸多的美好理想都加了進去。這樣其實會產(chǎn)生一個問題,就是新系統(tǒng)會被過度設(shè)計,而太復(fù)雜的設(shè)計是很難被開發(fā)出來的。
這種現(xiàn)象就是“第二系統(tǒng)效應(yīng)”,第一版的成功會讓人過于自信,從而在第二版上又過于超前,結(jié)果導(dǎo)致系統(tǒng)開發(fā)出來復(fù)雜難用。
果然,經(jīng)過三年的辛苦開發(fā),Multics復(fù)雜得連貝爾實驗室的諸位大神都看不下去,以致于貝爾實驗室宣布退出Multics的開發(fā)工作。實在是不想再把寶貴的人力搭進這樣一個華而不實的系統(tǒng)里去了。
雖然Multics未獲成功,但參與過此項目的大神們動了念頭想自己搞一個操作系統(tǒng)出來。這個意料之外的產(chǎn)物就是后來對業(yè)界影響巨大的Unix操作系統(tǒng)。
Unix的誕生
參與過Multics項目的肯·湯普森,決心繼續(xù)進行操作系統(tǒng)的開發(fā)。但貝爾實驗室被Multics搞得精疲力盡,不愿意再支持肯的想法。
于是肯自己找了一臺過時的DEC PDP-7計算機,開始搗騰起操作系統(tǒng)來。這里需要說明的是,在上世紀六十年代的時候,計算機的配置相比于現(xiàn)在是極低的,而且造價高昂。
PDP-7只有16K字節(jié)的內(nèi)存,今天一個中等配置的手機內(nèi)存也是它的一百萬倍。要在這樣的設(shè)備上實現(xiàn)操作系統(tǒng)功能,就必須要擁有高超的編程技巧與算法功底。幸好,肯·湯普森就是這樣一位大神。
更為傳奇的是,肯實現(xiàn)最初版本的這套操作系統(tǒng)只花了三周時間,還正好是趁他太太帶著孩子去度假的空暇。從某種意義上說,全人類都要感謝肯的太太獨自帶娃所做出的貢獻。
系統(tǒng)有了,接下來就是得給它取個響亮的名字了。在一次同事之間工作中的閑聊中,布萊恩·克尼漢對此發(fā)表了自己的看法。
他認為之前做的Multics取名就是野心太大,因為其含有“包羅萬象”之意,結(jié)果迷失在復(fù)雜性的迷宮里。那么這套新的操作系統(tǒng)應(yīng)該是簡潔而功能聚焦的,要用“uni”代替“multi”,叫“UNICS”會比較有意義。
顯然,克尼漢的見解得到了諸位大神的肯定,“UNICS”的命名得以保留,并在后來調(diào)整為更合適的“UNIX”。而布萊恩·W·克尼漢也享受了Unix命名者的殊榮。
這一命名完美地契合了Unix系統(tǒng)所具有的獨特設(shè)計哲學(xué),那就是簡潔、專注。
設(shè)計哲學(xué)
肯·湯普森開發(fā)出來的原型Unix系統(tǒng),深得貝爾實驗室這幫大佬們的青睞。Unix的另一位熱心開發(fā)參與者丹尼斯·里奇,他和肯都希望能購置一臺比PDP-7更好的計算機。
但貝爾實驗室的管理層被失敗的Multics搞得心有余悸,說什么也不肯批這個條子。不過你以為這就讓能諸位大神們輕言放棄嗎?不可能的,大神們有的是暗渡陳倉的辦法。
因為貝爾實驗室每年要編寫提交許多專利文件,因此在文字處理上有著迫切需求。喬·奧桑納抓住了這個痛點,提出可以采購PDP-11用于編寫專利材料,Unix小組可以為其提供軟件。
肯·湯普森和丹尼斯·里奇如愿以償?shù)啬玫搅吮萈DP-7更好的PDP-11,兩位大神立即在新機器上展開工作。由此,在PDP-11機器上Unix完成了從原型到初版的開發(fā)。
在此之后,Unix就一直在實驗室里迭代。1975年5月,第六版Unix發(fā)布,從這一版本開始,Unix逐漸為外界所知,隱然有走紅之勢。
為什么這一版具有如此魅力?
因為現(xiàn)代操作系統(tǒng)的設(shè)計哲學(xué)(套路)就此形成,并穩(wěn)定下來了。這一哲學(xué)包含兩個方面,第一是簡潔,第二是專注。
先說簡潔,Unix的文件系統(tǒng)就是最佳示范。在Unix的世界里,一切皆文件。說到文件,我們首先想到的可能是打開一個文檔,并在里面輸入內(nèi)容,最后保存關(guān)閉。這是一個關(guān)于普通文件的典型操作過程,只需要五個系統(tǒng)調(diào)用(creat, open, read, write, close)就可以全部完成。
那么,對于其他外接的設(shè)備,也可以將其視為一個特殊文件,只需要用五個系統(tǒng)調(diào)用組合使用,就能完成讀寫數(shù)據(jù)的工作。
這一理念有多么偉大,打個簡單的比方就好理解了。拿開車來說,如果每個品牌的汽車駕駛方法都不一樣,你想學(xué)車,就要把所有的開車方法都學(xué)一遍,你肯定會認為這是吃飽了撐的。
五個基本的系統(tǒng)調(diào)用就是統(tǒng)一的駕駛方法,不同的設(shè)備就像不同品牌的汽車。你不必關(guān)心汽車之間的差異,反正你坐進駕駛室就知道應(yīng)該掛檔、踩油門、上路。
再說專注,Unix系統(tǒng)里有許多程序,這些程序各司其責(zé),只將一件事做好。例如echo就是回顯文本;cat就是顯示文件內(nèi)容;ls就是顯示磁盤目錄內(nèi)容。
那么,要實現(xiàn)復(fù)雜的功能怎么辦?答案是借助于shell、管道與重定向機制,將獨立的小程序組合起來,實現(xiàn)想要的功能。
這就是一種典型的分工合作思想。還是以汽車來說,現(xiàn)在的汽車廠商不可能自己生產(chǎn)所有的零部件,都是從零配件廠商采購之后,組裝成車。
這里面shell是供程序所運行的環(huán)境,管道是程序間數(shù)據(jù)流通的通道。管道機制是真正的神來之筆。道格·麥基爾羅伊最初有這個想法,但總是被實現(xiàn)問題所困擾,直到有一天啟發(fā)了肯·湯普森的思考。
如同被上帝親吻了腦門,肯猛然省悟了管道的機理。他只用了一個小時就在系統(tǒng)調(diào)用中實現(xiàn)了管道。這就是將程序的孤島給連接起來的豎線符:“|”。
舉例來說,ls可以顯示目錄下的文件名。但如果你想知道目錄下有多少個文件,你顯然不愿意在ls里加一段代碼再重新編譯一遍。那么正好還有一個wc程序,它可以統(tǒng)計空格或換行分隔開的單詞數(shù)。
你可能想到,要是能把這兩個程序組合起來使用,那不就解決問題了嗎?是的,一行命令就可以搞定:ls | wc
這就是Unix的迷人之處。
一門叫New B的語言
現(xiàn)在要說一下開發(fā)操作系統(tǒng)所使用的編程語言了。如果說操作系統(tǒng)是一座金碧輝煌的大廈,那么編程語言就是用來建造它的工具。
在上世紀七十年代初期,貝爾實驗室的大神們是為此困擾不已的,因為他們沒有稱手好用的工具。其實IBM早在1964年就創(chuàng)建了PL/I,作為系統(tǒng)級的編程語言。但因為它也是中了“第二系統(tǒng)效應(yīng)”的毒,包括了太多特性,以至于復(fù)雜難用。
后來劍橋大學(xué)教授馬丁·理查茲設(shè)計開發(fā)了一款名為BCPL(Basic Combined Programming Language)的系統(tǒng)編程語言。它比PL/I要簡單得多,因此Unix小組的成員們還能湊合著用。
但肯·湯普森這樣的大神是會止步于此的,基于PDP-7的環(huán)境,他自己又重新設(shè)計并開發(fā)了一門新的語言,稱之為B語言。從語言特性上來看,它和BCPL是非常接近的。
當(dāng)性能更好的PDP-11計算機到貨以后,好伙伴丹尼斯·里奇又對B語言進行了改造,使之能將新機器的性能發(fā)揮出來。這門語言被稱為“NB”,它是“New B”的縮寫。
我想作為一名中文閱讀者,你此刻一定忍不住響亮地念了出來,然后一種爽快感令身心通透。很好,我的感覺也是這樣。
這門叫“New B”的語言在后來經(jīng)過改進,正式定名為“C”語言,人類歷史從此翻開了新的篇章。這可以說就像普羅米修斯從太陽神的馬車上取得火種之后,將之獻給人類一樣偉大。
這不是我在唬人吹牛,C語言的出現(xiàn),將系統(tǒng)編程語言從石器時代帶入了鐵器時代。C語言簡單易用,而且功能強大。首先就用在了開發(fā)新版本的Unix,這大大地提高了效率,還保證了穩(wěn)定性。
其次,C語言使得系統(tǒng)移植變得輕而易舉了。在早先的年代,硬件的架構(gòu)是千差萬別的,在不同的機器上如果要開發(fā)相同的功能,就得寫出兩套代碼來。良好的可移植性,這也是Unix能夠流行起來的重要原因。
最后,也是最重要的,C語言在貝爾實驗室之外獲得了廣泛的使用。這讓全世界的專業(yè)人士以及業(yè)余愛好者們可以共同為Unix開發(fā)軟件,從而形成了一個強大的生態(tài)環(huán)境。
在上世紀九十年代初的芬蘭赫爾辛基大學(xué)計算機系,一位長著大鼻子的自卑青年,就是用C語言開發(fā)出了改變世界的Linux操作系統(tǒng),其實Linux本身也是遵循Unix系統(tǒng)調(diào)用接口規(guī)范的變種。這位青年就是Linus Torvalds。
即使直到今天,C語言也是系統(tǒng)編程領(lǐng)域的首選。尤其是當(dāng)下物聯(lián)網(wǎng)(IoT)概念火熱,C語言在諸多低功耗嵌入式系統(tǒng)中被廣泛應(yīng)用,居然還把這門40年前的語言捧上了編程語言排行榜的榜首位置。
C語言,真的很“New B”。
技術(shù)布道者們
貝爾實驗室在對各位技術(shù)大神的管理上,還有一點是為人所稱道的,就是鼓勵大家勤奮地寫作,出版圖書,積極傳播技術(shù)價值。這對于Unix系統(tǒng)的發(fā)展,以及C語言的普及都產(chǎn)生了強大的推動作用。
一項技術(shù)被發(fā)明出來,只有被廣泛使用才會有價值。貝爾實驗室的管理層是深知這個道理的,所以實驗室對于技術(shù)寫作的支持并沒有停留在口頭上,而是建立了有效的機制和可靠的保障。
首先,實驗室允許大神們在一段時期內(nèi)專心從事寫作,工資照發(fā)不誤。這樣一部優(yōu)秀的技術(shù)圖書可以盡可能快地得到出版。如果大神們白天要上班,只能在晚上或周末來寫書,那就不知道會拖成什么樣。
其次,圖書出版后,作者是可以獲得版稅的。當(dāng)然,版權(quán)還是屬于貝爾實驗室,但要是出的書爆款了,這收入也是很可觀的。沒有規(guī)定說計算機科學(xué)家就要安貧樂道,名利雙收的好事為什么要拒絕呢。
貝爾實驗室由此也形成了開放、互助、樂于分享的良好風(fēng)氣。一個人在寫作的時候遇到問題,隨時可以向他人求教,并得到有效的幫助;誰的稿子寫好了,首先就是讓身邊的同事們審閱,并得到認真的反饋。
所以貝爾實驗室所出的技術(shù)圖書質(zhì)量極高,作者們除了對內(nèi)容精益求精,在遣詞造句上也用心良苦。多少經(jīng)典著作成為技術(shù)愛好者的圣經(jīng)、高校的必修教材。許多都流傳至今,出現(xiàn)在程序員們的必讀書單上。
下面就列舉一些最耀眼的明珠吧。
- 《C程序設(shè)計語言》,Brian W. Kernighan / Dennis M. Ritchie,C語言的創(chuàng)造者親自寫的,“hello, wrold”就是這本書里走向世界;
- 《編譯原理》,Alfred V. Aho / Monica S.Lam / Ravi Sethi / Jeffrey D. Ullman,傳奇的龍書;
- 《計算機算法的設(shè)計與分析》,Alfred V.Aho / John E.Hopcroft / Jeffrey D.Ullman,算法經(jīng)典;
- 《C++程序設(shè)計原理與實踐》,Bjarne Stroustrup,C++之父教你怎么玩轉(zhuǎn)它;
- 《編程珠璣》,Jon Bentley,豆瓣上說這是歷史上最偉大的計算機科學(xué)著作之一;
- 《Unix編程環(huán)境》,Brian W.Kernighan / Rob Pike,Unix的命名者給你講它的編程哲學(xué);
- ……
失敗的商業(yè)化之路
在1980年之后,AT&T因其在通信行業(yè)的壟斷地位,被美國司法部給盯上。迫于壓力,AT&T不得不將公司進行拆分,而這也成為了AT&T衰落的開始,貝爾實驗室的命運也從此走向了沒落。
拆分之后,從科研部門分離出去的一個名為Unix系統(tǒng)實驗室(Unix System Laboratories, 簡稱USL)的機構(gòu)。USL雖然名為實驗室,但實際上是專注于運營支持,后來更是將業(yè)務(wù)擴大到銷售和推廣。
得益于AT&T早期將Unix免費分發(fā)給大學(xué)生們?nèi)ナ褂?#xff0c;無意中培養(yǎng)出了一批精通Unix系統(tǒng)的工程師,從而形成了一定規(guī)模的市場。USL則將Unix專業(yè)商品化,意欲有一番大作為。
本來應(yīng)該要好好培育這個市場,但是AT&T和USL卻向加州大學(xué)伯克利分校,就Unix的版權(quán)問題發(fā)起了訴訟。此事還要從早前AT&T將Unix免費發(fā)放給大學(xué)做研究說起。
加州大學(xué)伯克利分校的計算機系統(tǒng)研究組的比爾·喬伊和同事們,在原有的Unix基礎(chǔ)之上改造升級,形成了伯克利發(fā)行版(BSD)。而用戶是可以免費使用BSD發(fā)行版的。
AT&T顯然認為BSD版侵犯了自己的知識產(chǎn)權(quán),所以就有了起訴伯克利一事。但伯克利并沒有就此服輸,而是持續(xù)將原有代碼刪除,代之以新的實現(xiàn)。就是說功能一樣,但代碼實現(xiàn)是完全不一樣的。
這樣做也無法讓AT&T罷手,于是又發(fā)起新的訴訟。這一次法院判伯克利勝訴。這兩家在長期的官司中消耗了太多的時間與資本,可以說最后的結(jié)果是AT&T功虧一簣。
本來還想指著賣Unix來賺錢,一看市場上有那么多免費使用的版本。于是就想通過打官司禁止發(fā)行免費版,這就是整個想法都不對了,除了把Unix市場的水?dāng)嚋?#xff0c;誰也沒有得到好處。
Linux的橫空出世,讓受夠了Unix爭執(zhí)的技術(shù)人看到了新希望。Linus在設(shè)計Linux之初,遵循的就是POSIX規(guī)范。Unix用戶可以相當(dāng)平滑地過渡到Linux上,在此之后就是屬于Linux的時代了。
Unix以另一種方式,繼續(xù)著自己的傳奇。
結(jié)語
如今的貝爾實驗室所在地,已是人去樓空,一片破敗荒涼景象。是非成敗轉(zhuǎn)頭空,誰能想到這里的門檻曾是地球上最難踏進來的。
而大神們也都有了各自的歸宿。肯·湯普森在2000年之后退休,當(dāng)了陣子飛行員,算是真的放飛自我了。后來進入谷歌公司,與貝爾實驗室的老戰(zhàn)友羅布·派克共同推出了現(xiàn)在炙手可熱的Go語言。
丹尼斯·里奇在2011年駕鶴西去,不覺也已十年,或許他正在天堂里跟上帝探討宇宙的終極算法吧。
布萊恩·克尼漢則寫下了《Unix傳奇:歷史與回憶》一書,讓我們得以永遠銘記眾神的不朽光輝,還有那無比的榮耀!
總結(jié)
以上是生活随笔為你收集整理的《Unix传奇》:众神的创世记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ajax加php实现三级联动
- 下一篇: 【转载】async await 的前世