陳凱
“計算”與其說是計算機的強項,不如說是一個裝置之所以被稱為計算機的關鍵能力。人們可以利用計算機實施各類運算,如直接列出表達式做簡單的算術題、利用特定算法解方程、通過符號運算推導數(shù)學公式等。當計算機強大的計算能力被人們充分利用的時候,它所具有的這種強大能力的一系列緣由卻常常被掩蓋起來。想象一下,某人在做物理習題時遇見加法運算,在實施運算時,雖然不一定會有意識地回想起自己曾經(jīng)背誦過“八加六得十四”“八加七得十五”等此類事實,但只要一經(jīng)提醒,就能明白自己能夠完成加法運算的緣由:也許最早的時候不得不依靠擺積木或扳手指的方法,但到后來就能將固定的兩個一位十進制數(shù)字加法的結果深深刻錄在記憶中了,此后,這個深刻的記憶就形成一種運算規(guī)律,被靈活地應用到更復雜的加法運算中。再想象一下,若某人用計算機做加法,雖然很容易實施運算并得到結果,但計算機能進行加法運算的緣由,卻是隱藏在幕后而不為常人知曉的,并且,也很少有計算機的用戶會想到去主動探究。
計算機實施加法的過程與人有很大的不同,有一句流傳很廣的話這樣說:“計算思維是人的思維,不是機器的思維?!弊屑毚竽軌虬l(fā)現(xiàn),此話其實就已經(jīng)隱含“機器能思維”的意味在其中,否則也就不至于要對人和機器的思維進行區(qū)分了,這頗能引發(fā)哲學上的思考:機器能夠思維嗎?繼而還會引發(fā)關于怎樣才算是機器等問題的討論,這些不是本篇文章討論的重點,筆者想請大家關注的是“計算思維是人的思維”這半句話中并沒有明示出來的問題:計算思維到底是人的怎樣的一種思維?既然這種思維不是機器的思維,它又是如何和機器發(fā)生關聯(lián)的?——否則該論斷也就不需要和所謂機器的思維做對比了。筆者希望能通過一些簡單的用機器實現(xiàn)加法的例子,來逐步揭示問題的答案。
● 實現(xiàn)二進制加法的全加器電路
先來看一個十分常見的全加器的邏輯電路,它通常被稱為全加器(如圖1)。這個裝置可以接受三個僅有一位的二進制數(shù)的輸入,然后經(jīng)過一系列的邏輯運算,得到兩位的二進制輸出值。如果三個輸入中只有一個“1”,那么結果中高位是0,低位是1;如果三個輸入中有兩個“1”,那么結果中高位是1,低位是0;如果三個輸入都是“1”,則結果的高位和低位都是1。
若是根據(jù)邏輯電路圖,逐個跟蹤各個邏輯元件輸入和輸出信號的變化,便可知這樣一個電路的確能實現(xiàn)三個一位二進制數(shù)的加法的運算,然而并不能解答這樣的疑惑:為什么它能夠起作用?盡管整幅電路圖如此清晰而直觀地呈現(xiàn)在人們面前,但大部分人仍然很難通過觀看這張電路圖,就領悟機器的計算需要如此結構的原因。
即便是將電路圖轉化為邏輯表達式,如高位的輸出值和三個輸入值的關系為h=(a^b)&c|(a&b),雖然可以借由a、b、c值的輸入和邏輯計算,看出這個表達式的確能實現(xiàn)加法運算后二進制高位的輸出,同樣很難看出,何以這個邏輯表達式能起作用。對于邏輯電路圖也好,邏輯表達式也好,大部分人都能很輕松地經(jīng)由推演和逐步跟蹤的方式驗證它的正確性,卻很難在整體上領悟(很難,但并非不可以,筆者將在后續(xù)文章給出一種啟發(fā)領悟的方法)它為何能夠以這樣的結構來運行。換言之,很難領悟這種能夠正常工作的系統(tǒng)結構到底是怎么被設計出來的,一個簡單的二進制加法裝置尚且存在這樣的困惑,更何況那些復雜很多的計算系統(tǒng)了。
● 重新推理出二進制加法邏輯電路
假設學生已經(jīng)掌握了基本的邏輯運算,那么想要解釋清楚怎樣實現(xiàn)二進制加法運算,并不是非常困難的事,這個觀點似乎和上面的事實有很大的矛盾,但由于計算方式是多樣的,所以的確存在更容易理解的二進制加法電路。下面來說明一下。
經(jīng)由簡單的邏輯推理可知,只有當a、b、c三個輸入中僅有一個是1,或者全部是1的情況下,加法裝置的低位才是1,否則是0??梢詫⑦@個邏輯判斷過程用邏輯電路的方式來表達,從中可以看出一個大的部件是怎樣由四組小的部件拼接起來的,繪制出來的圖頗有一種規(guī)律性的美感,如圖2所示。
另外,當a、b、c三個輸入中有兩個或三個1時,加法裝置的高位是1,否則是0。也可以用邏輯電路以很有規(guī)律的方式表達出來。如圖3所示。
筆者特意將圖2元器件方向和圖3元器件的方向設得不同,這樣,就可以將兩張有規(guī)律的圖輕松合并在一起,組裝成一張更大的圖,然后就能實現(xiàn)二進制的加法了(如下頁圖4)。
這個加法器的邏輯電路圖看上去頗有一種能夠治愈強迫癥的感覺,而且很容易用人的思維來理解它何以能夠工作。它總共有19個邏輯元件,考慮到邏輯電路圖中的邏輯門支持了多個輸入,若是僅使用兩輸入的邏輯門,那么這個加法器實際上要用到31個邏輯元件。相對來說,圖1所示的全加器電路只有5個元件。要是從“何以如此結構能夠正常工作”的角度來發(fā)問,圖1的全加器反而更讓人難以理解。不過圖1的全加器電路有其自身的優(yōu)勢,其中一方面的優(yōu)勢是顯而易見的:因為結構簡單,所以制作成本低,穩(wěn)定性也高。其實還有另一方面的優(yōu)勢,在復雜的電路中,圖1的全加器更容易實現(xiàn)封裝和模塊化,限于篇幅暫不展開。很顯然,可以發(fā)現(xiàn)其中的矛盾:人容易理解的結構不是被實際廣泛應用的結構。
● 機器的思維和人的思維
現(xiàn)在重新回到關于“人的思維”和“機器的思維”的討論。有一個很著名的思想實驗這樣說:如果把一個鐘的零件拆散,放進一個盒子反復搖動,那么只要時間足夠久,而且零件也足夠牢靠,最終盒子里的零件會自動組裝成一個完整的鐘。也可以反過來考慮,當人們打開一個盒子,發(fā)現(xiàn)里面是一個完整的鐘,那么人的頭腦認為更可能的情況,究竟這個鐘是來自非常長的時間的搖晃而自動組裝成功的,還是由人手工組裝成功的?顯然,前者可能性是極其微小的??梢栽囍鲆粋€簡單的調(diào)查,用常規(guī)的5個邏輯元件的加法器和筆者提供的29個元件的加法器作對比,問學生哪一個結構更可能是人工設計的,得到的答案更多的是后者,雖然實際上,人們在真正設計和制作電路時,卻幾乎總是使用前者的結構。如果換一種問法,問兩種結構的機器,哪一種更可能是在盒子里搖晃而成的,那么得到的答案就明顯傾向于前者。這讓筆者忽然領悟到,相對于“人的思維”和“機器的思維”的區(qū)別的問題,更值得思考的,是“更像人的思維的機器的思維”和“不像人的思維的機器的思維”兩者的區(qū)別。
這里給出另一個非邏輯電路的例子。圖5是元胞自動機“生命游戲”中的一種圖案,名稱叫“滑翔機”?!吧螒颉钡淖兓?guī)則非常簡單(相關變化規(guī)則可以方便地在網(wǎng)絡上查閱到,這里不再說明),元胞自動機中的每一個格子的變化,都很容易根據(jù)預設的規(guī)則推演出來,但哪怕如圖5左上角那樣只有五個亮點組成的圖案,人的頭腦也很難憑空想象出這個圖案在后續(xù)變化中會陷入周期性的重復模式,并在整體上仿佛滑翔機一樣逐步漂移到原來位置的右下角。這個“滑翔機”圖案還具有傳遞信息的作用,以至于可用于在“生命游戲”中構建起加法運算裝置,圖6是這個加法運算裝置的局部(完整結構所占篇幅太大,這里就不展示了),盡管它在運行過程中的每一步都能依靠人的思維來跟蹤,但除非是這個裝置的創(chuàng)建者,其他人在看到這個裝置時,僅僅能看出局部的圖案具有某些規(guī)律性,在更長久的時間上,難以把握住圖案的整體變化,也幾乎無法判定結構中每個部件的作用、部件之間的關系以及整體的工作原理。
從全加器的例子到元胞自動機“生命游戲”的例子,可以看出人的思維的局限,人很容易接受簡單的規(guī)則,然后用這個簡單的規(guī)則構建起一個自動化工作的系統(tǒng)。但人在面對一個復雜的需求的時候,頭腦仍然希望這個構建過程是具有某種規(guī)律性的,并希望每一個局部的構造動作都存在著目的。正是在這一點上,人的思維和非人類的“思維”產(chǎn)生出了重要的區(qū)別,一個自然的機器——假設把自然中的事物按規(guī)律運行視作某種機器的話——它的構建是生成性的,系統(tǒng)中的局部的結構并不存在目的性,而是在宏觀的混沌的運行中涌現(xiàn)出了某種意義,這些并非以人慣常的思維運作的機器并不會產(chǎn)生出需要人去理解它的意愿。
然而,高效簡潔的全加器恰恰是由人自己設計出來的;局部極其簡單,整體卻復雜混沌的“生命游戲”的加法裝置也是由人自己設計出來的;更具有普遍性的例子是,雖然計算機底層的機器指令極其復雜,難以讓人理解,但人卻能夠借助更接近人的思維的高級語言代碼來實現(xiàn)復雜的計算。所以就必須追問一個問題:為什么人有這樣的能力?
至少在當前,人并不按機器思維的方式來思維——這里暫不討論在頭腦中植入計算機的未來場景。但是人卻有一種自由。選擇A:構建一個按人慣常的思維方式來工作的機器;選擇B:構建一個并不按人慣常的思維方式來工作的機器。于是人們發(fā)現(xiàn)這樣的問題,人往往需要先選擇B,然后才有可能選擇A,并且越是在機器的底層,按B方式的思路越是容易構建出現(xiàn)實中真正的可用于計算的器物。計算思維不是這種器物的思維,而是構建這種器物的思維。所以,筆者這樣來理解“計算思維是一種人的思維”,這種人的思維可以更具體地認為是一種“能夠?qū)C器按機器的思維模擬出某種人的思維”的人的思維。