今天我們繼續(xù)講《計算機思維》。了解一些歷史有利于理清思路。上一講講算法,我們總結(jié)了一個歷史教訓,那就是人的思想,可以領先于技術(shù)應用。人類并不是先有了計算機才有的計算機思維,而是早就有了計算機思維,在那兒等著計算機出現(xiàn)。借用一個佛教術(shù)語,啟蒙時代以來思想家已經(jīng)“照見”了計算機的可能性。
我們看計算機產(chǎn)品是最容易過時的,今年買的手機明年就換代了。硬件可以被淘汰,軟件可以被升級,但是,思想很難過時,數(shù)學永不過時。計算機的發(fā)展故事,是把思想實現(xiàn)的故事。
我們孜孜以求的,是一個“自動的”機器。
1.對自動的追求
下面這張圖中是一個會下國際象棋的機器人,叫“土耳其行棋傀儡(Mechanical Turk)”。它在1770年出現(xiàn)在歐洲,能跟人類棋手對弈,而且水平相當高。它擊敗過拿破侖·波拿巴和本杰明·富蘭克林這樣的名人。很多人懷疑棋盤下面那個柜子里可能藏了一個人,可是打開柜子只能看到一堆齒輪。這個下棋機器人在歐美縱橫征戰(zhàn)了數(shù)十年。
……當然,那時候可沒有“深藍”和“AlphaGo”。一直到 1857 年這個秘密才被揭開,事實是……里面真的藏了一個人。只不過因為設計巧妙,看不出來而已。
但是你能看出來當時的人對“自動的機器”有多么著迷。人們迫切想要這個東西,而且人們認為有這個東西很正常?!巴炼湫衅蹇堋笔莻€魔術(shù),但下面這個東西可不是魔術(shù)——
這是“作家機械人偶(The Writer)”,由瑞士鐘表師皮埃爾·雅克·德羅在1768 年設計制造 [1]。它能自己拿筆蘸墨水,在紙上寫字畫畫 ——
如果你見過這個會寫字的機器人,再見到會下棋的機器人可能就不會感到那么不可思議了吧。其實下棋和寫字還是有本質(zhì)區(qū)別,寫字只是“自動”,而下棋需要智能。但是在談論智能之前,我們得知道,自動,已經(jīng)是一個了不起的成就。
這個作家機器人偶是怎么寫字畫畫的呢?你必須能把那些字和畫的信息存儲到機器里才行。而這是通過機器人后背的一個齒輪實現(xiàn)的 [2],齒輪上代表不同字母的鋼片的形狀決定了字母寫出來什么樣 ——
而那些字母是可以替換的!你換一組字母,或者換一套代表繪畫筆畫的齒輪,作家機器人偶就可以寫出別的內(nèi)容。就好像我們現(xiàn)在玩游戲機,換個卡帶就是一個新游戲一樣。
十八世紀真是個蒸汽朋克式的美好時代。如果人類一直沒有發(fā)明電力,今天我們看到的就都是這樣的自動機器。我們想想,像八音盒這種東西,它為什么能播放特定的樂曲?其實是一樣的道理。我借用威爾遜在《生命視角》中的一個說法,這是“嚴格的靈活性”:操作步驟是嚴格固定的,但是可以接受靈活的輸入,產(chǎn)生不同的輸出。
1804 年 [3],法國人發(fā)明了一種提花織機(Jacquard loom),它能從一個長長的打孔卡上讀取信息,織出特定式樣的花紋。打孔卡上的孔可以讓鉤子穿過去,鉤子控制織線??棛C是同一個織機,打孔卡可以隨便更換,換張卡就是不一樣花紋。
提花織機的打孔卡,圖片來自維基百科
打孔卡,可以說是機械化自動機器的軟件。打孔卡這個技術(shù)思想在此后有廣泛的應用,IBM公司最早就是靠這東西起家的……
但是,“嚴格的靈活性”畢竟不是真正的靈活性。打孔卡技術(shù),距離可編程計算,還有根本性的一步。
2.第一臺通用計算機
你可能不知道,第一臺可編程的通用計算機,并不是電子的,而是機械的。
1820年,英國人查爾斯·巴貝奇(Charles Babbage)把“嚴格的靈活性”發(fā)揮到了極致,設計了一個叫做“差分機”的東西,它可以做多步驟的復雜計算。
巴貝奇的野心是用差分機計算正確的數(shù)學用表。當時公開發(fā)行的對數(shù)表、三角函數(shù)表都是人手算出來的,其中有大量的錯誤。巴貝奇認為人是靠不住的,這種計算應該交給機器。巴貝奇跟英國政府說,數(shù)學用表的錯誤會導致英國海軍的計算出錯,那么艦艇就出事兒,搞不好可能會沉船,現(xiàn)在我發(fā)明了一種機器,能做冷酷無情的計算。英國政府被說服了,真給了他一筆經(jīng)費。
巴貝奇的設計包括 25000 個部件,具有強大的計算能力……但是他做了十年只完成了七分之一 ——
差分機的七分之一完成品
而這純粹是因為硬件技術(shù)不允許。巴貝奇必須用齒輪和杠桿實現(xiàn)各種運算,可是這些東西沒法做得特別精細,很容易這里卡殼、那里跳線,而且零件越多越容易出問題。英國政府一直看不到成果,把巴貝奇的經(jīng)費停了。
巴貝奇做不出來,可是他特別能想……1830年,巴貝奇又自費發(fā)明了一個更厲害的東西,叫“分析機”。分析機,是一個可編程的通用計算機!
分析機的神來之筆在于它把操作步驟也寫進了打孔卡之中,這樣計算步驟就是不固定的了,就是可編程的了。不但如此,分析機還可以根據(jù)中間的計算結(jié)果,決定下一步的計算操作 —— 也就是說,它允許程序里有“If… then… ”這種條件語句,它甚至還包括循環(huán)語句!分析機有輸入部分、有計算部分、有存儲中間計算結(jié)果的部分,還有輸出打印的部分……分析機,是真正的計算機。
巴貝奇還有一個合作者專門給分析機寫程序,可以說是人類歷史上第一個程序員,而且這是一個女程序員,叫埃達·洛夫萊斯(Ada Lovelace),他倆用了十余年的時間一直在研究分析機。洛夫萊斯甚至還想到,分析機不僅能用來做數(shù)值計算,還能作符號計算 —— 它不僅僅是個“計算”機,它是個能處理任何信息的機器!
……可惜的是,分析機也沒做成。下面這張圖是分析機的一個實驗部分,來看一眼世界第一臺計算機吧 ——
人的思想要是領先時代太多,是不是一個悲劇呢?巴貝奇因為發(fā)明數(shù)學表格的計算理論工具而得過英國皇家天文學會的金獎,他還是第一個提出“科學管理”的人。但是差分機和分析機被當時的人視為是巴貝奇身上的污點,什么實用成果都沒拿出來,結(jié)果有一萬兩千個零件被溶解報廢了。
1871年巴貝奇去世的時候 ,《泰晤士報》甚至還專門諷刺了他一番。
而通用計算機這種東西再次被人提出來,則是70年后的事情了。
3.現(xiàn)代計算機
1945年,因為電子真空管技術(shù)條件成熟和美國軍方資助,世界第一臺能用的通用計算機終于被做出來了,這就是著名的 ENIAC 。ENIAC 是現(xiàn)代計算機的鼻祖,它奠定了所謂的“馮·諾依曼架構(gòu)”。而在此之前,艾倫·圖靈已經(jīng)提出了可編程通用計算機的完整數(shù)學理論。
我認為約翰·馮·諾依曼是人類歷史上最聰明的幾個人之一。他是數(shù)學家、物理學家,是博弈論的創(chuàng)始人,還是現(xiàn)代計算機架構(gòu)的提出者 —— 不過馮·諾依曼自己對此是否認的,他說這個設計是一幫人討論的結(jié)果,他只不過負責做筆記而已。
相對于巴貝奇的設計,馮·諾依曼架構(gòu)的關鍵改進在于它有了“內(nèi)存”這個概念。負責計算的CPU速度很快,而從打孔卡讀取計算步驟的速度非常慢,所以現(xiàn)在的設計是先一次性地把打孔卡的程序信息讀進來,存到內(nèi)存里,然后在計算過程中讓CPU直接和內(nèi)存交換信息,這就能大大加快計算速度。
從提花織機的打孔卡提供了“嚴格的靈活性”,到巴貝奇的可編程通用計算機,到馮·諾依曼架構(gòu)的CPU和內(nèi)存,這是非常清晰的演變。現(xiàn)在我們看到了,圖靈再厲害,“編程”這個思想不是他先提出的;馮·諾依曼再神,計算機系統(tǒng)不是他發(fā)明的。
計算機是這么一個不斷改進的東西。一代一代的工程師提出各種各種巧妙的設計 ——
要在硬件上實現(xiàn)信息的數(shù)字化,人們發(fā)現(xiàn)應該用二進制。十進制很直觀,但是要用硬件實現(xiàn)十進制,你的電子管就得用十個級別的電壓代表0-9這10個數(shù)字,這不但不容易實現(xiàn),而且很容易出錯。二進制只需要電子管和存儲點有開和關兩個狀態(tài)就行,這就大大增加了可靠性。
然后香農(nóng)設計了邏輯門……我們專欄講過,從硬件到軟件的關鍵思想是分層。
然后你還要考慮CPU時鐘的同步問題。如果沒有“步”這個概念,各方面的計算沒有協(xié)調(diào),可能會導致兩組電信號同時出現(xiàn),系統(tǒng)就會出錯。
然后你還要考慮存儲信息和操作過程中可能會有各種小錯誤,而這就有一個自動糾錯的問題……等等等等。
我就想,為什么說信息行業(yè)是個創(chuàng)新行業(yè)呢?因為第一,這里面的想法太密集,有太多可以改進之處;第二,改進的方向相當明確。這就是說每個參與者都知道自己能干什么……在其他領域,可沒有這么好的事情。
*
從計算機思維的角度來說,這一講的核心教訓是你必須考慮硬件。永遠都別忘了計算機是個機器,而機器有數(shù)學算法之外的、自己的特點和脾氣。比如說,
x = 3
這個語句,在數(shù)學上的意思無非就是變量 x 的值是 3,是一個事實陳述。但是對編程來說,這不是一個陳述,而是一個動作:是把用 x 標記的那一段內(nèi)存位置,賦值為 3。
機器不理解你要說的事實,機器只會按你的指令做各種動作。我們在編程的時候要 debug,要想辦法控制內(nèi)存,要提升計算性能,就必須考慮硬件自身的特點。
今天我們用的一切計算機,包括手機、汽車、凡是通用計算機,就都是馮·諾依曼架構(gòu)。當然馮·諾依曼架構(gòu)不是唯一的可能性?,F(xiàn)在人們正在研究新的架構(gòu),比如量子計算機和神經(jīng)網(wǎng)絡計算機 —— 那些東西有自身的編程特點。
不過在我看來,巴貝奇要是看到今天的計算機,是不會感到特別驚奇的。
查爾斯·巴貝奇
參考文獻
[1] http://www.sohu.com/a/253593989_776727
[2] http://news.ifeng.com/a/20170820/51695992_0.shtml
[3] 《計算機思維》說打孔卡提花織機發(fā)明于 1700 年代早期,我調(diào)研了歷史,認為是作者寫錯了。
意見反饋
×
Copyright © 1998-2019 甘肅信息港 All rights reserved.