1937年在計算機的發展史上是個神奇的年份。
這一年,圖靈(Alan Turing)在指導教授數學家紐曼(Max Newman)的啟發下發表了一篇論文,其中提到了邏輯運算機(Logical Computing Machine),這就是後來大名鼎鼎的“圖靈機”。
在1928年的時候,數學大拿希爾伯特(Hilbert)在一次年會上提出了三個問題:第一,在一個數學體係中,是否存在一套規則,可以判斷任何一個命題的真偽;第二,這樣的係統是否具有一致性,也就是一個命題不能一會兒被證明是真的,一會兒被證明是假的;第三,是否有一個機製來判斷一個命題是否可以被驗證。
三年之後,25歲的數學天才哥德爾(Kurt Gödel)對第一和第二個問題給出了否定的答案。哥德爾給出這樣的一個例子,“這句話是無法被驗證的。”(This statement is unprovable) 如果這句話是真的,那我們就無法驗證它的真假,這個是矛盾的,因為既然無法驗證,我們怎麽能說這是真的呢?但如果這句話是假的,那就是說這句話是可以被證實的(This statement is provable),結果變成 This statement is proved to be unprovable, 也是矛盾的。這和“我說的是假話”有異曲同工之妙。
最後問題的焦點就到了第三題,是否存在這樣的機製可以決定一些命題可被驗證,但另一些命題是無法驗證的,如果有這樣的機製,那麽我們就可以找出那些無法驗證的命題(就像我們上麵提到的This statement is unprovable 的例子),把它們排除之後,就可以找到滿足希爾伯特第一第二問題的係統了。而圖靈的論文就是試圖回答這個問題。
他設計了一台假想的邏輯運算機(Logical Computing Machine),有四部分組成:
1. 一個內存(Memory),這是一條無限長的紙帶,上麵有一個個的小方格,格子裏是字符(最簡單的就是 0/1),或者是空白;
2. 一個讀寫頭,它停在小方格上,可以有三個動作:讀取字符,改寫字符,向左或向右移動一小格;
3. 一個狀態寄存器(Register)
4. 一個控製程序(Table of Instructions),根據當前機器所處的狀態以及當前讀寫頭所指的格子上的符號來確定讀寫頭下一步的動作,並改變狀態寄存器的值,令機器進入一個新的狀態。
明眼人都看出來了,這不就是一台計算機的雛形嗎?就是用這台邏輯運算機,圖靈解開了希爾伯特的第三個問題。首先,圖靈提出在邏輯運算機進行運算的過程中,機器最終會到達兩種可能的狀態:一個是計算完成,機器停止,這就是停機狀態;另一個是無限循環,計算永遠完成不了。然後圖靈設計了一個巧妙的悖論:假設存在一個判斷程序H,它可以判斷某個程序P是否會到達停機狀態:
如果P會停機, 那麽 H(P)=Halt;
如果P不停機, 那麽 H(P)=NOT Halt
我們再構建一個程序K,它會把判斷程序H當作子程序(subroutine)來調用,然後根據H對K判定的結果,反其道而行:
如果H說我會停機,也就是 H(K)=Halt,那麽我就無限循環 K will Not Halt;
如果H說我不停機,也就是 H(K)=NOT Halt,那麽我就停機 K will Halt
這樣矛盾就出來了,H判斷K會停機,可是K因此決定無限循環,所以H判斷錯了;但如果H判斷K會無限循環,K卻會因此停機,這樣我們就永遠也無法通過H來判斷K會不會停機,所以結論是:不存在一個可以判定停機問題的程序H。圖靈就這樣輕輕巧巧地就回答了希爾伯特的第三個問題:停機就代表一個命題是可證的,不能停機就是說那個命題無法驗證,而判斷程序H就是那個判斷命題是否可證的機製,既然H不存在,那麽也就不存在一個可以判定命題可證性的機製了。
圖靈的論文也許對數學理論的建立有一些幫助,但他更大貢獻卻是那台假想的邏輯運算機,可以說現代計算機的所有基本要素都已經出現在這台機器裏了。
寫完論文,圖靈的指導教授就把他推薦給了普林斯頓大學的另一位數學大牛Alonzo Church。於是圖靈遠渡重洋,來到了普林斯頓,搬進了愛因斯坦,哥德爾等人所在的數學係大樓(那真是一個群星璀璨的年代)。正是圖靈的新老板Alonzo Church,當看完圖靈的論文,非常慷慨地把“邏輯運算機”改成了以作者本人命名的“圖靈機”,從此“圖靈機”揚名天下,而24歲的圖靈也在計算機發展史上,打下了一個永恒的印記。
剩下的問題就是如何才能真正地把圖靈機製造出來了。
還是在1937年,麻省理工的克勞德·香農(Claude Shannon)寫出了有史以來最具影響力的碩士論文,被後世稱之為“信息時代的大憲章”(the Magna Carta of the Information Age)。
那是37年的夏天,還在MIT讀研究生的香農在貝爾實驗室找到一個實習的機會,在那裏他見識了電話交換係統,研究了各種電子開關和繼電器的應用之後,香農腦中靈光一現,把電子開關和布爾代數開始聯係起來。
如果“開”代表0,“關”代表1,那麽兩個開關串聯,其實就是“與”(and)的運算,因為隻有兩個開關都合上,電路才會流通;而兩個開關並聯,就是一個“或”(or)的運算,因為隻要有一個開關合上,電路就會接通。而這個正是電子計算機二進製運算的基石!有時想想真的是不公平,這些容易的發明發現都讓前輩們用完了,留給我們的都是些難啃的骨頭,什麽攻克癌症啦,長生不老啦,人工智能啦,都不是一個夏天的實習可以搞定的。
37年的秋天,香農回到MIT,在指導教授布什(Vannevar Bush)的鼓勵下,寫下了那篇著名的碩士論文《A Symbolic Analysis of Relay and Switching Circuits》。
而就在同一年,貝爾實驗室的George Stibitz在家中廚房的桌子上搭建了一個可以做二進製加法的電子線路,這個模型被Stibitz的妻子戲稱為K-Model,因為是在Kitchen裏搭出來的。貝爾實驗室對Stibitz的K-Model大力支持,找了一個團隊來和他一起搭建更複雜的模型,終於在1939年造出了複數計算器(The Complex Number Calculator),這台機器有超過400個電子開關,每個開關一秒中可以開關20次,這個和以前的機械計算器相比,簡直是神一樣的存在了。雖然這還不是現代意義上的電子計算機,因為複數計算器是無法編程的,但它至少給我們看到使用電子線路進行二進製運算是完全可行的。
西方的很多數學、物理的理論發現過程都有這個特性。問題在於他們的思考方法和學術環境。可以醞釀出學術成果,以定理、文檔的形式保存下來。後來者很容易的獲得前人的知識,站在新的起點開始新一輪的思考。長年累月就慢慢建立起知識的大廈。靈光閃現前的知識積累及科學方法訓練不是一天就促成的。