在《三體》的第一部中,作者描寫在虛擬游戲中牛頓和馮.諾伊曼拜訪秦始皇,說服秦王用三千萬秦兵組成人列計算機。歷史上馮.諾伊曼發(fā)明了奠定現(xiàn)代計算機基礎(chǔ)的馮.諾伊曼體系,在小說中,作者利用馮.諾伊曼向秦始皇介紹他的計劃巧妙地科普了一些計算機原理,只不過構(gòu)成計算機的不是半導(dǎo)體或晶體管,而是紀律嚴明的大秦士兵。
值得一提的是,這個情節(jié)在劉慈欣以前的短篇科幻小說《荊軻刺秦王》出現(xiàn)過,在《荊軻刺秦王》中,是荊軻而不是馮.諾伊曼向秦王推銷他的計劃。
那么,小說中的這個人列計算機是怎么回事呢?請看下面這段:
秦始皇揮手召來了三名士兵,他們都很年輕,與秦國的其他士兵一樣,一舉一動像聽從命令的機器。
"我不知道你們的名字,"馮?諾伊曼拍拍前兩個士兵的肩,"你們兩個負責(zé)信號輸入,就叫‘入1’、‘入2’吧,"他又指指最后一名士兵,"你,負責(zé)信號輸出,就叫 ‘出’吧,”他伸手撥動三名士兵,"這樣,站成一個三角形,出是頂端,入l和入2是底邊,"
"哼,你讓他們成楔形攻擊隊形不就行了?"秦始皇輕蔑地看著馮?諾伊曼。
牛頓不知從什么地方掏出六面小旗,三白三黑,馮?諾伊曼接過來分給三名士兵,每人一白一黑,說:
白色代表0,黑色代表1。好,現(xiàn)在聽我說,出,你轉(zhuǎn)身著著入1和入2,如果他們都舉黑旗,你就舉黑旗,其他的情況你都舉白旗,這種情況有三種:入1白,入2黑;入1黑,入2白;入1、入2都是白。"
"我覺得你應(yīng)該換個顏色,白旗代表投降。"秦始皇說。
興奮中的馮?諾伊曼沒有理睬皇帝,對三名士兵大聲命令:"現(xiàn)在開始運行!入1入2,你們每人隨意舉旗,好,舉!好,再舉!舉!"
入1和入2同時舉了三次旗,第一次是黑黑,第二次是白黑,第三次是黑白。出都進行了正確反應(yīng),分別舉起了一次黑和兩次白。
"很好,運行正確,陛下,您的士兵很聰明!"
“這事兒傻瓜都會,你能告訴朕,他們在干什么嗎?"秦始皇一臉困惑地問。
"這三個人組成了一個計算系統(tǒng)的部件,是門部件的一種,叫‘與門'。"馮?諾伊曼說完停了一會兒,好讓皇帝理解。
馮所介紹的,是計算機的基本構(gòu)件——‘與門’,在文中加粗的那一段,描述了與門的特點:當兩個輸入都為1時,輸出為1,其余情況輸出為0。用符號表示如下:
與門
而除了與門以外,還有或門,和非門,馮也用相似的手段,利用大秦士兵組成,他們用符號分別表示為:
或門
非門
與、或、非,這三種基本邏輯運算是整個計算機的基礎(chǔ)。在這三種運算的基礎(chǔ)上,我們得以構(gòu)建出一臺精密的計算機。
我們可以想象出來,由三千萬大秦士兵組成的一臺“計算機”,黑色和白色的棋子此起彼伏,而計算機的運算速度就取決于士兵們的反應(yīng)速度。
那么我們現(xiàn)實中的計算機是怎樣組成的呢?很簡單,原理同上,但是那些部件不是人,而是電子元器件,畢竟,電子的速度要比人快多了,同時它還很小。
雖然電子元器件相對于人來說很小,但是世界上第一臺電子計算機還是像一間屋子一樣大(但是相比于三千萬人來說,好多了不是嗎)。以我們今天對計算機(電腦)的印象來說很難理解,不僅是因為他的體積,而是它沒有顯示器,沒有鍵盤,沒有鼠標,并且,它能用來干什么?
計算機的功能本質(zhì)上來說只有一個——計算,而我們今天用電腦做的所有事情,上網(wǎng),玩游戲,看視頻,從本質(zhì)上來說都是計算機的計算過程,只不過是信息的表示模式不一樣罷了。
有了顯示器,我們可以更好地閱讀計算機計算的結(jié)果;有了鼠標和鍵盤,我們可以更加方便地輸入信息和指令。當你在玩游戲時,計算機接受你的鍵盤的摁鍵和鼠標的移動所產(chǎn)生的信號,從而計算出你的人物的移動,生命值的變化,通過圖像處理以后顯示在屏幕上,這一切,都是計算。
現(xiàn)代電子計算機已經(jīng)無數(shù)的更新?lián)Q代,我們在有了晶體管后由發(fā)明了半導(dǎo)體,通過集成電路技術(shù)制成的芯片,使得我們的計算機越來越小,操作系統(tǒng)和軟件的發(fā)展使得功能越來越豐富,但電子計算機結(jié)構(gòu)依然遵循馮.諾伊曼體系。
讓我們拋開顯示器,鍵盤,鼠標,半導(dǎo)體,芯片這些現(xiàn)代計算機的標志,我們以最原始的手段實現(xiàn)最簡單的計算過程為例,希望可以幫助大家更好地理解計算機。
(參考自《編碼:隱匿在計算機軟硬件背后的語言》,作者:Charles Petzold)
我們用電路來實現(xiàn)信號的傳遞,用電路的通和斷來表示1和0,相信大家都了解計算機中的信息是以二進制存儲的。我們用最簡單原始的方法,看下圖:
與門
上圖是一個電路圖,左邊連個開關(guān)控制著兩個繼電器,當開關(guān)閉合時,繼電器通電產(chǎn)生磁力,通過吸引金屬片使得連個串聯(lián)在燈泡電路上的連個開關(guān)閉合,燈泡通電發(fā)光。
左邊兩個開關(guān)就是我們的“鼠標和鍵盤”,而燈泡就是“顯示器”,他們就是輸入和輸出設(shè)備,我們通過開關(guān)的閉合表明我們想輸入的是1還是0,而觀察燈泡,來閱讀計算結(jié)果。
在上述電路中,進行的是一個與的運算,只有連個開關(guān)同時閉合時,燈泡才會發(fā)光。
同理,我們也可以構(gòu)建或門和非門:
或門
非門
我們現(xiàn)在已經(jīng)通過原始的手段組建了基本的邏輯運算功能,接下來我們用這三種基本運算實現(xiàn)一個二進制的加法機。
他的控制面板如下,兩排開關(guān),可以讓我們輸入2個八位的二進制形式的加數(shù),而第三排的9個燈泡顯示的運算結(jié)果。
然我們想一下二進制的加法過程,假如這兩個數(shù)都只有一位,那么運算過程為:
我們把它分解為連個運算,一種是和運算,一種是關(guān)于是否進位的運算:
對于進位運算我們可以發(fā)現(xiàn)他就是與門,而和運算似乎不屬于三種基本運算,但是我們可以通過基本運算構(gòu)造出這種運算:
它由2個與門,1個或門和1個非門構(gòu)成,圖中與門上加上一個小圓圈表示在與門的輸出位置加上一個非門,組成與非門。
為了方便表示,我們將異或門表示為:
現(xiàn)在,我們將和運算和進位運算組合起來,組成為半加器,并將它符號化:
半加器只能計算1位二進制數(shù)的加法,為了進行更多位的運算,需要將半加器的進位輸出傳遞給下一位數(shù)的運算。在此基礎(chǔ)上,我們構(gòu)建出全加器,并符號化:
現(xiàn)在我們將這些全加器組裝起來,首先是最右邊的全加器,由于它是最低位,所以不接受進位輸入:
然后從右往左數(shù)第2位到第7位的全加器的進位輸入連接到比他第一位的全加器的進位輸出:
最左邊的全加器,他的進位輸出連接到另一個燈泡上:
最終,我們的8位二進制加法器就完成了,雖然它的功能很簡單,但是這向我們證明了計算機的可行。
現(xiàn)代計算機的功能可遠不止這些基礎(chǔ)的運算,通過這些與門,或門,非門的組合,我們可以構(gòu)造出存儲器,地址選擇器,等等。
遺憾的是,在這里我們無法將其介紹清楚,因為他們比加法運算更加復(fù)雜。
感興趣的同學(xué)可以去看Charles Petzold的著作《編碼:隱匿在計算機軟硬件背后的語言》,上文中以電子元器件構(gòu)造加法機的這一令人興奮的想法便來自此書。
理論上,我們完全可以用這種凡是制造出一臺計算機,事實上,早期的電子計算機就是用繼電器組成的,這也是它的體形如此巨大的原因,他的輸出就是一排排的指示燈。同時以繼電器構(gòu)造計算機也會導(dǎo)致計算機的運算速度受到限制,因為如果金屬片開關(guān)的擺動速度影響了信號的傳遞。
我們反觀人列計算機這一設(shè)想,就會發(fā)現(xiàn)它比繼電器組成的計算機還要慘,因為人出錯的機率要遠遠大于機器,而且計算機的運行成本(三千萬人的吃喝住宿)也過于昂貴。
不過,不管是人列計算機,還是繼電器計算機,或者是現(xiàn)代大規(guī)模集成電路計算機,他們背后所依據(jù)的計算原理都是一樣的,其基本構(gòu)件就是:與門,或門,非門。