|
https://m.toutiao.com/is/eAdhbA5/ 計算器曾經(jīng)是真實器物,后來成了手機應(yīng)用。與之相比,計算機本質(zhì)上沒有特別多不同之處。計算機如今能以高達每秒十億次的極快速度做算術(shù)[1],但在20世紀(jì)70年代,運算速度遠(yuǎn)遠(yuǎn)低于每秒百萬次。 20世紀(jì)60年代和20世紀(jì)70年代典型的計算機有一個由數(shù)十種指令組成的指令集,它可以執(zhí)行:算術(shù)(加、減、乘、除),從主存儲器中讀出信息,將信息保存到主存儲器,以及與磁盤或其他連接設(shè)備通信。另外還有一件至關(guān)重要的事:其中有一些指令負(fù)責(zé)依據(jù)之前的計算結(jié)果,即已做完的事,決定后續(xù)執(zhí)行什么指令——這決定了計算機下一步做什么。這樣一來,計算機就掌控了自己的命運。 指令和數(shù)據(jù)存放在同一個主存儲器中,這個主存儲器通常被叫作RAM,也就是“隨機存儲器”(random access memory)。將一系列指令裝載到RAM,計算機就會根據(jù)指令內(nèi)容執(zhí)行不同任務(wù)。這就是你點擊Word或Chrome瀏覽器圖標(biāo)時發(fā)生的事——操作系統(tǒng)將那個程序的指令裝入內(nèi)存,開始運行。 使用某種編程語言,為執(zhí)行某項要完成的任務(wù)創(chuàng)建操作序列,這就是所謂的編程。直接創(chuàng)建所需指令是有可能的,但這項工作實在繁難,哪怕是寫很小的程序也是如此,所以編程領(lǐng)域的大部分進步都與創(chuàng)造接近人類表達計算方式的編程語言有關(guān)。稱為編譯器的程序(當(dāng)然得先把它寫出來)將高級語言(接近人類語言)翻譯為針對特定類型計算機的指令序列。 歸根結(jié)底,如同Word或瀏覽器等普通程序一樣,操作系統(tǒng)也是由那些指令構(gòu)建而成的,只是它更為龐大和復(fù)雜。操作系統(tǒng)的任務(wù)是控制所有其他要運行的程序,并管理它們與計算機其他部分的交互。 這樣講太抽象了,用一個具體的小例子來說明什么是編程吧。假設(shè)我們想根據(jù)矩形的長和寬計算其面積。用人類語言可以這樣說:“面積是長和寬的乘積?!睂W(xué)校教師會在黑板上寫出面積計算的公式: 面積 = 長×寬 使用較高級別的編程語言時,我們會這樣寫: area = length * width 這就是今天大部分主流編程語言中的確切形式。編譯器將其翻譯為人類仍然可讀但主要面向計算機的機器指令序列。在一臺虛構(gòu)的簡單計算機上,該序列大概像下面這樣: load length multiply width store area最終,稱為匯編器(assembler)的程序把該序列轉(zhuǎn)換為人類不易讀懂的指令。這些指令能夠被載入計算機的主存儲器。執(zhí)行時,它們根據(jù)長和寬算出面積。當(dāng)然這里沒談及很多細(xì)節(jié)(如何指定編譯和加載,如何讓長和寬的數(shù)值進入計算機,如何輸出面積數(shù)值,等等),但本質(zhì)大抵如此。 如果你想看看可工作的示例,以下這段完整的C語言程序輸入長和寬,輸出面積: 這段程序能在任意一臺計算機上編譯和執(zhí)行。 每個人都至少知道Windows或macOS這些現(xiàn)代操作系統(tǒng)的名字,手機上運行的是Android和iOS等操作系統(tǒng)。 操作系統(tǒng)是控制計算機的程序,它給正在運行的程序分配資源。它管理主存儲器,當(dāng)運行中的程序有需要時,將主存分配給它們。在臺式計算機或筆記本式計算機上,操作系統(tǒng)讓你能夠同時運行瀏覽器、文字處理器、音樂播放器,或許還有我們的面積計算小程序,并且按需任意切換到其中之一。 操作系統(tǒng)也控制顯示,在收到程序請求時,使其在屏幕上可見。它還管理磁盤之類存儲設(shè)備,當(dāng)你保存Word文檔時,文檔就會被存下來,以備之后恢復(fù)并繼續(xù)工作。 操作系統(tǒng)還負(fù)責(zé)協(xié)調(diào)與互聯(lián)網(wǎng)之類的網(wǎng)絡(luò)進行通信,這樣你就能用瀏覽器搜索、與朋友聯(lián)絡(luò)、購物、分享寵物貓視頻,一切齊頭并進。 在程序發(fā)生錯誤時,操作系統(tǒng)保護其他程序不受影響,還要防止有害程序或用戶誤操作對系統(tǒng)自身造成的危害。 手機上的操作系統(tǒng)也是如此工作的。在底層,需要做許多動作來維持經(jīng)由移動網(wǎng)絡(luò)或無線網(wǎng)絡(luò)的通信。雖然細(xì)節(jié)常有不同,但手機應(yīng)用與Word這樣的程序在概念上完全一樣,并且用同樣的編程語言編寫。 現(xiàn)今的操作系統(tǒng)程序體量龐大,紛繁復(fù)雜。在20世紀(jì)60年代,它簡單得多,但相對于同時代的其他程序,它還是既龐大又復(fù)雜。一般而言,IBM或DEC(Digital Equipment Corporation,美國數(shù)字設(shè)備公司)等計算機制造商為各種不同硬件提供操作系統(tǒng)。每個制造商生產(chǎn)的硬件全無共通之處,有時甚至來自同一廠商的硬件都會有很大不同,所以操作系統(tǒng)也各自不同。 更加麻煩的是,操作系統(tǒng)用匯編語言寫成。匯編語言是人能讀懂的機器指令,與特定類型硬件的指令集緊密相關(guān)。每種計算機都有自己的匯編語言,所以操作系統(tǒng)是龐大且復(fù)雜的匯編語言程序,每個操作系統(tǒng)都針對特定硬件、使用特定語言編寫。 系統(tǒng)之間缺乏共通性,使用相互不兼容的低級語言,導(dǎo)致同時需要多個版本的程序:為某一操作系統(tǒng)編寫的程序,在移植到其他操作系統(tǒng)或硬件架構(gòu)上時,必須完全重寫。這種狀況阻礙了進步。如后文所述,Unix操作系統(tǒng)在所有類型的硬件上都保持一致,而且用較高級的語言寫成,只需付出相對較少的成本,即可從一種計算機移植到另一種計算機。 Unix起源貝爾實驗室退出Multics項目后,項目組成員得找其他事來做??稀丈▓D2-2)還是想做操作系統(tǒng),但實驗室管理層被Multics傷透了心,不肯給操作系統(tǒng)項目買硬件??虾推渌酥荒芗埳险劚?,設(shè)計操作系統(tǒng)的各種組件,無法開展具體的實現(xiàn)工作。 圖2-2 肯·湯普森,約1981年 恰在此時,肯找到一臺沒怎么用過的DEC PDP-7計算機。這種計算機的主要功能是做電路設(shè)計的輸入設(shè)備。 PDP-7于1964年推出,但計算機領(lǐng)域演進太快,到了1969年,它已經(jīng)過時。這臺機器本身不算很強大,只有8K(8192)個18位字長的內(nèi)存(16 KB),但其圖形顯示非常漂亮,所以肯就為它寫了個太空旅行游戲。在這個游戲里,玩家可以漫游太陽系、探訪各個行星。這個游戲有點讓人上癮,我玩了好幾個小時。 PDP-7還有一個好玩的外設(shè)——磁盤驅(qū)動器高聳,直直架著一塊磁盤。據(jù)傳,萬一盤片飛出來,站在它前面的人就有可能遇險。磁盤運轉(zhuǎn)速度遠(yuǎn)高于計算機讀寫速度。為了解決這個古怪的問題,肯寫了個磁盤調(diào)度算法來提升磁盤的總吞吐量。這個算法在任意磁盤上都可用,但主要是為PDP-7的這塊磁盤設(shè)計的。 如何測試這個算法呢?這需要往磁盤上裝載數(shù)據(jù),肯認(rèn)為他需要一個批量寫數(shù)據(jù)的程序。 “在某一時刻,我發(fā)現(xiàn)離實現(xiàn)一個操作系統(tǒng)僅有3周之遙了?!彼枰獙懭齻€程序,每周寫一個:用來創(chuàng)建代碼的編輯器;將代碼轉(zhuǎn)換為PDP-7能運行的機器語言的匯編器;再加上“內(nèi)核的外層——操作系統(tǒng)齊活了”。 正在那時,肯的太太休了3周假,帶著一歲大的兒子去加利福尼亞探望公婆,這樣肯就有了3周不受打擾的工作時間。正如他在2019年一次采訪中所說,“一周,一周,再一周,我們就有了Unix?!睙o論以何種方式來度量,這都體現(xiàn)了真正的軟件生產(chǎn)力。 肯和我都從貝爾實驗室退休幾年之后,我問他3周內(nèi)寫出Unix是否屬實。下面是他回復(fù)郵件的原文,談到的情況和最近那次采訪完全一致。 1969年年中至年末,有明確Unix特征的系統(tǒng)就已在運行,可以說那就是Unix誕生的時間了。
早期系統(tǒng)有一小群用戶,其中當(dāng)然包括肯和丹尼斯,還有道格·麥基爾羅伊、鮑勃·莫里斯、喬·奧桑納,以及撞了大運一般的我。每位用戶都有一個數(shù)字身份編號。有些編號代表系統(tǒng)功能而非人類用戶,例如根(root)用戶,或者說超級用戶,身份編號為0,此外還有一些特殊編號。人類用戶的編號從4開始。我記得丹尼斯是5,肯是6,我是9。在初版Unix系統(tǒng)中擁有個位數(shù)用戶身份編號,大概也算略具聲望了。 何以命名新PDP-7操作系統(tǒng)誕生沒多久,就得了一個名字,但具體過程不得其詳。 我記得自己站在辦公室門口,和幾個人討論,其中好像有肯、丹尼斯和彼得 · 諾伊曼。那時系統(tǒng)還沒名字。(如果我記憶準(zhǔn)確的話)我提議,從拉丁詞根看,Multics意圖提供“包羅萬象”的功能,而新系統(tǒng)頂多擇一而從,應(yīng)該拿uni來替代multi[3],叫它“UNICS”。 也有人說,UNICS這個名字是彼得·諾伊曼想出來的,代表“毫不復(fù)雜的信息與計算服務(wù)”(UNiplexed Information and Computing Service)。彼得回憶說:
彼得自謙地說記不起更多細(xì)節(jié),所以,無論是否應(yīng)當(dāng),我都獨占了為系統(tǒng)命名的榮耀。 UNICS后來變成了Unix,這名字顯然更好。(據(jù)傳,AT&T的律師們不喜歡Unics這個詞,因為它音近eunuchs[4]。)丹尼斯·里奇后來形容這個名字“正中Multics要害”,的確如此。 肯·湯普森小傳2019年5月,在新澤西州沃爾鎮(zhèn)舉辦的美國東部復(fù)古電腦節(jié)上,我和肯做了一次非正式的“爐邊談話”。我負(fù)責(zé)提幾個問題,然后安坐傾聽。以下內(nèi)容部分來自那次活動,讀者可以在YouTube上找到活動視頻。 肯生于1943年。他父親在美國海軍服役,肯小時候隨軍住過全世界很多地方,包括加利福尼亞、路易斯安那,還有幾年住在那不勒斯。 他喜歡鼓搗電器,后來去加利福尼亞大學(xué)伯克利分校讀電子工程。他說,電子學(xué)課程確實簡單,因為入學(xué)之前他已經(jīng)玩過10年電器。在伯克利分校,他迷上了電子計算。
大學(xué)最后一年,肯選了埃爾溫 · 伯利坎普(Elwyn Berlekamp)的課。伯利坎普當(dāng)時在伯克利分校任教授,后來不久就去了貝爾實驗室。畢業(yè)后那個夏天,肯沒申請讀研,因為他覺得自己還不夠優(yōu)秀。
1966年,肯拿到伯克利分校的碩士學(xué)位。貝爾實驗室和另外幾家公司都想招他,但他明確表態(tài)不想去任何一家公司上班。 招聘官一試再試。如肯所言:“貝爾實驗室問了6~8次,我都拒絕了——也是因為我沒有雄心壯志。貝爾實驗室招聘官敲我家門,我請他進屋。據(jù)他說,我還用姜餅和啤酒招待了他?!保ㄟ@大概是加利福尼亞的什么古怪減肥飲食吧。) 最后,肯接受邀請,由貝爾實驗室支付旅費,去新澤西看看,但是他只答應(yīng)去一天,而且主要是為了探訪高中時代就結(jié)識的朋友。他到達貝爾實驗室時,被一些名字打動了:
肯于1966年加入貝爾實驗室,開始做Multics研發(fā)工作,后來又寫了Unix。這些事前面已談過,此處不贅述。 肯對游戲的興趣由來已久。他從小就熱愛國際象棋。他不愿輸棋,但又會替輸了的對手惋惜,所以最終只能做個看客。1971年,他為PDP-11寫了一個國際象棋程序。這路子似乎行得通,于是他著手制作用于加速運算(如算出從指定點開始的合規(guī)走法)的特殊用途硬件。這些工作累積成了Belle項目(圖2-3)。Belle是肯與喬·康登(Joe Condon)從1976年至1980年開發(fā)的國際象棋計算機。 圖2-3 肯·湯普森與喬·康登(計算機歷史博物館供圖) Belle(圖2-4)賽績驕人。在與人類棋手的常規(guī)比賽中,斬獲2200等級分,成為第一臺榮升國際象棋大師的計算機。它還獲得了1980年世界計算機國際象棋大賽(World Computer Chess)冠軍。在被史密森學(xué)會(Smithsonian Institution)收藏之前,它還得過好幾次ACM計算機國際象棋錦標(biāo)賽冠軍。 圖2-4 Belle國際象棋計算機(計算機歷史博物館供圖) 丹尼斯·里奇曾經(jīng)為國際計算機象棋聯(lián)盟(International Computer Chess Association)寫過一篇短文,介紹肯·湯普森對計算機游戲的貢獻[5]。文章寫道,肯對游戲的廣泛興趣,遠(yuǎn)遠(yuǎn)不止國際象棋。文章還寫了1978年12月5日Belle在ACM計算機國際象棋錦標(biāo)賽上擊敗Blitz 6.5的過程。文中引用計算機圍棋先鋒蒙蒂·紐伯恩(Monty Newborn)及國際大師戴維·利維(David Levy)的評論:
國際象棋有贏、輸或和3種終局。“50步規(guī)則”規(guī)定,如果在50步棋以內(nèi),沒有吃子,或者兵沒有移動過,則棋手可以提出和局。這條規(guī)則能防止玩家在無法贏棋時干耗時間。 肯決定研究50步是否是合適的數(shù)字。他使用Belle和一些復(fù)雜的數(shù)據(jù)庫組織方式來評估所有4子或5子和局,發(fā)現(xiàn)如果采用最佳下法,其中部分棋局可以分出勝負(fù)。此時,肯在國際象棋圈已頗有名氣,時不時有特級大師來實驗室與Belle對弈,尤其是下殘棋。我曾經(jīng)只是因為周末剛好在實驗室,就見到了世界冠軍阿納托利·卡爾波夫(Anatoly Karpov)和維希·阿南德(Vishy Anand)。 肯熱愛飛行,常常自己或搭載乘客從莫里斯敦機場起飛,在新澤西上空巡航。在他的影響下,1127中心的其他成員也喜歡上了飛行。高峰時期,“1127空軍”擁有六七名私人飛行員。他們常常飛去看秋葉,或者到有意思的地方吃午飯。道格·麥基爾羅伊回憶說:
1992年12月,肯和弗雷德·格蘭普(Fred Grampp)到莫斯科駕駛一架米格29戰(zhàn)機,比他們平時開的賽斯納飛機更上一層級。圖2-5和圖2-6展示了肯起飛前和落地滑行的情形。 圖2-5 肯·湯普森準(zhǔn)備起飛(cat-v供圖) 圖2-6 肯·湯普森降落滑行(cat-v供圖) 肯和我都于2000年年末從貝爾實驗室退休。我去了普林斯頓大學(xué),他加入貝爾實驗室同事創(chuàng)辦的恩智斐(Entrisphere)公司。2006年,他加入谷歌公司,和羅布·派克及羅伯特·格里塞默(Robert Griesemer)一起發(fā)明了Go語言。我聽說他離開Entrisphere公司加入谷歌公司,去信詢問詳情。他回郵件說:
本文摘自《UNIX傳奇:歷史與回憶》 《UNIX傳奇》[美] 布萊恩·W.克尼漢(Brian,W.,Kernighan) 著
自1969年在貝爾實驗室的閣樓上誕生以來,Unix操作系統(tǒng)的發(fā)展遠(yuǎn)遠(yuǎn)超出其創(chuàng)造者們的想象。它帶動了許多創(chuàng)新軟件的開發(fā),影響了無數(shù)程序員,改變了整個計算機技術(shù)的發(fā)展軌跡。 |
|
|