今天我們繼續講《計算機思維》。了解一些曆史有利于理清思路。上一講講算法,我們總結了一個曆史教訓,那就是人的思想,可以領先于技術應用。人類並不是先有了計算機才有的計算機思維,而是早就有了計算機思維,在那兒等著計算機出現。借用一個佛教術語,啓蒙時代以來思想家已經“照見”了計算機的可能性。
我們看計算機産品是最容易過時的,今年買的手機明年就換代了。硬件可以被淘汰,軟件可以被升級,但是,思想很難過時,數學永不過時。計算機的發展故事,是把思想實現的故事。
我們孜孜以求的,是一個“自動的”機器。
1.對自動的追求
下面這張圖中是一個會下國際象棋的機器人,叫“土耳其行棋傀儡(Mechanical Turk)”。它在1770年出現在歐洲,能跟人類棋手對弈,而且水平相當高。它擊敗過拿破侖·波拿巴和本杰明·富兰克林这样的名人。很多人怀疑棋盘下面那个柜子里可能藏了一个人,可是打开柜子只能看到一堆齿轮。这个下棋机器人在欧美纵横征战了数十年。
……當然,那時候可沒有“深藍”和“AlphaGo”。一直到 1857 年這個秘密才被揭開,事實是……裏面真的藏了一個人。只不過因爲設計巧妙,看不出來而已。
但是你能看出來當時的人對“自動的機器”有多麽著迷。人們迫切想要這個東西,而且人們認爲有這個東西很正常。“土耳其行棋傀儡”是個魔術,但下面這個東西可不是魔術——
這是“作家機械人偶(The Writer)”,由瑞士鍾表師皮埃爾·雅克·德罗在1768 年設計制造 [1]。它能自己拿筆蘸墨水,在紙上寫字畫畫 ——
如果你見過這個會寫字的機器人,再見到會下棋的機器人可能就不會感到那麽不可思議了吧。其實下棋和寫字還是有本質區別,寫字只是“自動”,而下棋需要智能。但是在談論智能之前,我們得知道,自動,已經是一個了不起的成就。
這個作家機器人偶是怎麽寫字畫畫的呢?你必須能把那些字和畫的信息存儲到機器裏才行。而這是通過機器人後背的一個齒輪實現的 [2],齒輪上代表不同字母的鋼片的形狀決定了字母寫出來什麽樣 ——
而那些字母是可以替換的!你換一組字母,或者換一套代表繪畫筆畫的齒輪,作家機器人偶就可以寫出別的內容。就好像我們現在玩遊戲機,換個卡帶就是一個新遊戲一樣。
十八世紀真是個蒸汽朋克式的美好時代。如果人類一直沒有發明電力,今天我們看到的就都是這樣的自動機器。我們想想,像八音盒這種東西,它爲什麽能播放特定的樂曲?其實是一樣的道理。我借用威爾遜在《生命視角》中的一個說法,這是“嚴格的靈活性”:操作步驟是嚴格固定的,但是可以接受靈活的輸入,産生不同的輸出。
1804 年 [3],法國人發明了一種提花織機(Jacquard loom),它能從一個長長的打孔卡上讀取信息,織出特定式樣的花紋。打孔卡上的孔可以讓鈎子穿過去,鈎子控制織線。織機是同一個織機,打孔卡可以隨便更換,換張卡就是不一樣花紋。
提花織機的打孔卡,圖片來自維基百科
打孔卡,可以說是機械化自動機器的軟件。打孔卡這個技術思想在此後有廣泛的應用,IBM公司最早就是靠這東西起家的……
但是,“嚴格的靈活性”畢竟不是真正的靈活性。打孔卡技術,距離可編程計算,還有根本性的一步。
2.第一台通用計算機
你可能不知道,第一台可編程的通用計算機,並不是電子的,而是機械的。
1820年,英國人查爾斯·巴贝奇(Charles Babbage)把“嚴格的靈活性”發揮到了極致,設計了一個叫做“差分機”的東西,它可以做多步驟的複雜計算。
巴貝奇的野心是用差分機計算正確的數學用表。當時公開發行的對數表、三角函數表都是人手算出來的,其中有大量的錯誤。巴貝奇認爲人是靠不住的,這種計算應該交給機器。巴貝奇跟英國政府說,數學用表的錯誤會導致英國海軍的計算出錯,那麽艦艇就出事兒,搞不好可能會沉船,現在我發明了一種機器,能做冷酷無情的計算。英國政府被說服了,真給了他一筆經費。
巴貝奇的設計包括 25000 個部件,具有強大的計算能力……但是他做了十年只完成了七分之一 ——
差分機的七分之一完成品
而這純粹是因爲硬件技術不允許。巴貝奇必須用齒輪和杠杆實現各種運算,可是這些東西沒法做得特別精細,很容易這裏卡殼、那裏跳線,而且零件越多越容易出問題。英國政府一直看不到成果,把巴貝奇的經費停了。
巴貝奇做不出來,可是他特別能想……1830年,巴貝奇又自費發明了一個更厲害的東西,叫“分析機”。分析機,是一個可編程的通用計算機!
分析機的神來之筆在于它把操作步驟也寫進了打孔卡之中,這樣計算步驟就是不固定的了,就是可編程的了。不但如此,分析機還可以根據中間的計算結果,決定下一步的計算操作 —— 也就是說,它允許程序裏有“If… then… ”這種條件語句,它甚至還包括循環語句!分析機有輸入部分、有計算部分、有存儲中間計算結果的部分,還有輸出打印的部分……分析機,是真正的計算機。
巴貝奇還有一個合作者專門給分析機寫程序,可以說是人類曆史上第一個程序員,而且這是一個女程序員,叫埃達·洛夫莱斯(Ada Lovelace),他倆用了十余年的時間一直在研究分析機。洛夫萊斯甚至還想到,分析機不僅能用來做數值計算,還能作符號計算 —— 它不僅僅是個“計算”機,它是個能處理任何信息的機器!
……可惜的是,分析機也沒做成。下面這張圖是分析機的一個實驗部分,來看一眼世界第一台計算機吧 ——
人的思想要是領先時代太多,是不是一個悲劇呢?巴貝奇因爲發明數學表格的計算理論工具而得過英國皇家天文學會的金獎,他還是第一個提出“科學管理”的人。但是差分機和分析機被當時的人視爲是巴貝奇身上的汙點,什麽實用成果都沒拿出來,結果有一萬兩千個零件被溶解報廢了。
1871年巴貝奇去世的時候 ,《泰晤士報》甚至還專門諷刺了他一番。
而通用計算機這種東西再次被人提出來,則是70年後的事情了。
3.現代計算機
1945年,因爲電子真空管技術條件成熟和美國軍方資助,世界第一台能用的通用計算機終于被做出來了,這就是著名的 ENIAC 。ENIAC 是現代計算機的鼻祖,它奠定了所謂的“馮·诺依曼架构”。而在此之前,艾伦·图灵已经提出了可编程通用计算机的完整数学理论。
我認爲約翰·冯·诺依曼是人类历史上最聪明的几个人之一。他是数学家、物理学家,是博弈论的创始人,还是现代计算机架构的提出者 —— 不過馮·诺依曼自己对此是否认的,他说这个设计是一帮人讨论的结果,他只不过负责做笔记而已。
相對于巴貝奇的設計,馮·诺依曼架构的关键改进在于它有了“内存”这个概念。负责计算的CPU速度很快,而從打孔卡讀取計算步驟的速度非常慢,所以現在的設計是先一次性地把打孔卡的程序信息讀進來,存到內存裏,然後在計算過程中讓CPU直接和內存交換信息,這就能大大加快計算速度。
從提花織機的打孔卡提供了“嚴格的靈活性”,到巴貝奇的可編程通用計算機,到馮·诺依曼架构的CPU和內存,這是非常清晰的演變。現在我們看到了,圖靈再厲害,“編程”這個思想不是他先提出的;馮·诺依曼再神,计算机系统不是他发明的。
計算機是這麽一個不斷改進的東西。一代一代的工程師提出各種各種巧妙的設計 ——
要在硬件上實現信息的數字化,人們發現應該用二進制。十進制很直觀,但是要用硬件實現十進制,你的電子管就得用十個級別的電壓代表0-9這10個數字,這不但不容易實現,而且很容易出錯。二進制只需要電子管和存儲點有開和關兩個狀態就行,這就大大增加了可靠性。
然後香農設計了邏輯門……我們專欄講過,從硬件到軟件的關鍵思想是分層。
然後你還要考慮CPU時鍾的同步問題。如果沒有“步”這個概念,各方面的計算沒有協調,可能會導致兩組電信號同時出現,系統就會出錯。
然後你還要考慮存儲信息和操作過程中可能會有各種小錯誤,而這就有一個自動糾錯的問題……等等等等。
我就想,爲什麽說信息行業是個創新行業呢?因爲第一,這裏面的想法太密集,有太多可以改進之處;第二,改進的方向相當明確。這就是說每個參與者都知道自己能幹什麽……在其他領域,可沒有這麽好的事情。
*
從計算機思維的角度來說,這一講的核心教訓是你必須考慮硬件。永遠都別忘了計算機是個機器,而機器有數學算法之外的、自己的特點和脾氣。比如說,
x = 3
這個語句,在數學上的意思無非就是變量 x 的值是 3,是一個事實陳述。但是對編程來說,這不是一個陳述,而是一個動作:是把用 x 標記的那一段內存位置,賦值爲 3。
機器不理解你要說的事實,機器只會按你的指令做各種動作。我們在編程的時候要 debug,要想辦法控制內存,要提升計算性能,就必須考慮硬件自身的特點。
今天我們用的一切計算機,包括手機、汽車、凡是通用計算機,就都是馮·诺依曼架构。当然冯·诺依曼架构不是唯一的可能性。现在人们正在研究新的架构,比如量子计算机和神经网络计算机 —— 那些東西有自身的編程特點。
不過在我看來,巴貝奇要是看到今天的計算機,是不會感到特別驚奇的。
查爾斯·巴贝奇
參考文獻
[1] http://www.sohu.com/a/253593989_776727
[2] http://news.ifeng.com/a/20170820/51695992_0.shtml
[3] 《計算機思維》說打孔卡提花織機發明于 1700 年代早期,我調研了曆史,認爲是作者寫錯了。