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