陳凱
在有些時(shí)候,為了要判斷某個(gè)論斷是否為真,人們并不需要實(shí)際去觀(guān)察或?qū)嶒?yàn),只需要依托想象來(lái)創(chuàng)建一個(gè)特殊的情境,將這個(gè)論斷放置到情境中加以考察,判別它是否在所有的可能性中都能成立。以上方法被稱(chēng)為思想實(shí)驗(yàn)。例如,伽利略為反駁亞里斯多德關(guān)于“越重的物體下落越快”觀(guān)點(diǎn)的比薩塔落球?qū)嶒?yàn)就是一個(gè)著名的思想實(shí)驗(yàn)的例子,即便不實(shí)際測(cè)試,而只是經(jīng)由邏輯推理,就可以知道,如果不同重量的球在同一高度下落卻不同時(shí)落地,會(huì)產(chǎn)生邏輯上的矛盾。
類(lèi)似地,可以借助思想實(shí)驗(yàn)的方式,在思維的想象空間中建立起某個(gè)計(jì)算裝置,通過(guò)這樣的方法對(duì)計(jì)算機(jī)的能力進(jìn)行考察。筆者之所以做這方面的探索,是因?yàn)榘l(fā)現(xiàn),學(xué)生在面對(duì)存儲(chǔ)程序計(jì)算機(jī)的體系結(jié)構(gòu)的時(shí)候,可能會(huì)采取兩種不同的態(tài)度:一是直接將關(guān)于此體系結(jié)構(gòu)的知識(shí),如五大邏輯部件、邏輯部件的作用、邏輯部件之間的關(guān)系等作為現(xiàn)成的知識(shí)加以接受;二是以批判性的目光看待這個(gè)體系結(jié)構(gòu),對(duì)何以有如此結(jié)構(gòu)或者是否可能有其他結(jié)構(gòu),或者當(dāng)前絕大多數(shù)計(jì)算機(jī)為何采用此體系結(jié)構(gòu)的原因,自主產(chǎn)生出疑問(wèn)。根據(jù)筆者的經(jīng)驗(yàn),課堂上圍繞以上問(wèn)題主動(dòng)發(fā)問(wèn)者實(shí)屬罕見(jiàn),但若發(fā)放調(diào)查問(wèn)卷,詢(xún)問(wèn)學(xué)生是否在學(xué)習(xí)過(guò)程中曾經(jīng)自主產(chǎn)生過(guò)——哪怕只是在很短暫的念頭中產(chǎn)生過(guò)——諸如此類(lèi)疑問(wèn),肯定的回答大約占總調(diào)查人數(shù)的三分之一。但教師面臨的困難是,若真有學(xué)生提出關(guān)于計(jì)算機(jī)體系結(jié)構(gòu)的疑問(wèn),確實(shí)很難在有限的時(shí)間里加以回答,因?yàn)閷?duì)這些問(wèn)題的回答涉及太多學(xué)生未曾接觸到的計(jì)算機(jī)底層的技術(shù)細(xì)節(jié)。正因?yàn)槿绱?,要想在?jì)算機(jī)體系結(jié)構(gòu)這一部分教學(xué)中落實(shí)思維培養(yǎng)的目標(biāo),障礙很大。筆者試圖以思想實(shí)驗(yàn)作為突破以上障礙的某一種可能的工具。
● 簡(jiǎn)單的排序計(jì)算裝置——物理和邏輯的雙重保證
計(jì)算裝置工作的可行性需要得到物理的和邏輯的雙重保證。在物理方面,某種機(jī)械計(jì)算裝置中機(jī)構(gòu)的運(yùn)轉(zhuǎn),無(wú)論是齒輪、連桿、金屬滾珠的運(yùn)動(dòng),還是電子計(jì)算裝置中電信號(hào)的保持、反轉(zhuǎn)、按規(guī)則變化等,都在自然齊一律的保證之下;在邏輯方面,如果規(guī)定某種信號(hào)狀態(tài)為1,那么它就不會(huì)是0,如果規(guī)定某種運(yùn)算是與邏輯運(yùn)算,那么它不會(huì)自行變成或邏輯運(yùn)算。有了物理和邏輯的保證,就能夠在頭腦中以思想實(shí)驗(yàn)的方式來(lái)虛構(gòu)出某個(gè)計(jì)算裝置。例如,設(shè)計(jì)某個(gè)裝置,能將一系列體積不同的球,按其體積從小到大進(jìn)行排序,可行的一種方法是:將這些球安置在略有傾角的滾動(dòng)槽上緩慢滾落,槽上每隔一段距離,就開(kāi)有小洞,越是靠上方的洞越小,越是靠下方的洞越大,所以,體積小的球會(huì)先行從洞中掉落,快速進(jìn)入最下面的收集槽,而體積越大的球,就越慢進(jìn)入到收集槽,最終,收集槽中的球是按體積從小到大排列的。以上過(guò)程,僅憑頭腦想象,就可認(rèn)為是可行的。并且,在想象中還能發(fā)現(xiàn)這個(gè)裝置的弱點(diǎn),只有當(dāng)球的體積差異很大時(shí),裝置才是可靠的,否則,球有可能在滾動(dòng)中,卡入到比自己略小一些的洞口中上下不得。當(dāng)然,還能設(shè)計(jì)出其他樣子的自動(dòng)裝置方案,來(lái)給不同體積的球排序,這可以布置為一項(xiàng)開(kāi)放且有挑戰(zhàn)性的任務(wù)。
● 純粹邏輯的簡(jiǎn)單計(jì)算裝置
本文主要是想討論,在邏輯的保證下如何構(gòu)造思維中的計(jì)算裝置,而暫時(shí)擱置物理上的保證。這當(dāng)然不是說(shuō)物理現(xiàn)實(shí)不重要,其中的一個(gè)原因是為了在有限的教學(xué)時(shí)間內(nèi)有更集中的聚焦點(diǎn)。另一個(gè)很重要的原因是,當(dāng)今人們所使用的計(jì)算裝置具有高度的虛擬化的特點(diǎn),即便是在簡(jiǎn)單的高級(jí)語(yǔ)言的程序表達(dá)式中,也難以看出計(jì)算機(jī)底層晶體管具體的工作過(guò)程。不妨想象一下,人們既可以在虛擬現(xiàn)實(shí)中以真實(shí)世界中建造計(jì)算機(jī)的方式來(lái)模擬建造計(jì)算機(jī),當(dāng)然也可以在虛擬現(xiàn)實(shí)中以不遵守現(xiàn)實(shí)物理規(guī)律的方式來(lái)建造計(jì)算機(jī)(這其實(shí)還更簡(jiǎn)單),但兩者都必須遵守邏輯上的規(guī)則。
那么,在純粹的思維空間中,一個(gè)最簡(jiǎn)單的計(jì)算裝置應(yīng)當(dāng)是怎樣的?它應(yīng)該有幾個(gè)組成部分?可以讓學(xué)生在五大邏輯部件的系統(tǒng)結(jié)構(gòu)圖上大膽對(duì)部件進(jìn)行裁剪,看看在哪種情況下,剩下的部件還能組建成一個(gè)有計(jì)算功能的裝置。這是一個(gè)開(kāi)放性的問(wèn)題,大部分學(xué)生的回答是一致的,認(rèn)為這個(gè)計(jì)算裝置至少應(yīng)該有輸入、運(yùn)算和輸出三部分。不妨在頭腦中想象某個(gè)布滿(mǎn)按鍵,但按了之后卻全無(wú)反應(yīng)的盒子,或者想象某個(gè)布滿(mǎn)印有數(shù)字按鍵的盒子,按下什么數(shù)字則照樣顯示這個(gè)數(shù)字,又或者想象某個(gè)只管自顧自顯示數(shù)字的盒子。以上這些裝置可以歸為裝飾藝術(shù)品,但顯然不能用于計(jì)算。
這里有一個(gè)功能簡(jiǎn)單的計(jì)算裝置的例子,某個(gè)用0和1兩種數(shù)字組成的點(diǎn)陣圖像,為了觀(guān)看方便,將數(shù)字0隱而不現(xiàn),這樣就可以看出這是一張直升飛機(jī)的圖像,如圖1所示。如果這些數(shù)字作為輸入數(shù)據(jù),而運(yùn)算部件所做的是將所有的“01”轉(zhuǎn)換為“10”,那么輸出的數(shù)據(jù)所顯示的就是一個(gè)“向左移動(dòng)”一格位置的直升飛機(jī),如圖2所示。為了能順利地實(shí)現(xiàn)這個(gè)效果,每個(gè)數(shù)字1之間都至少夾著一個(gè)0。
可以假設(shè),在符號(hào)串上方有許多個(gè)檢測(cè)符號(hào)串的掃描器,一旦發(fā)現(xiàn)符號(hào)串是“01”,就將其變成“10”,假設(shè)這個(gè)掃描器既能橫向掃描,也能縱向掃描,那么就能為直升飛機(jī)創(chuàng)設(shè)出上下移動(dòng)的效果。至于這個(gè)功能具體是如何實(shí)現(xiàn)的,暫時(shí)不需要去深究,絕大多數(shù)學(xué)生認(rèn)可這個(gè)功能是能夠被制造出來(lái)的。
即便是這種將符號(hào)串中所有的“01”轉(zhuǎn)換為“10”的簡(jiǎn)單的計(jì)算裝置,當(dāng)仔細(xì)分析它的輸入與輸出時(shí),也能發(fā)現(xiàn)其中蘊(yùn)藏著超出預(yù)想的復(fù)雜性??紤]要實(shí)現(xiàn)讓直升飛機(jī)不停地向左移動(dòng)的功能,最簡(jiǎn)單的辦法就是將輸出的結(jié)果重新反饋到輸入。但是,當(dāng)人們這樣做的時(shí)候,又該如何定義什么是輸入、什么是輸出?對(duì)于每一次執(zhí)行轉(zhuǎn)換的動(dòng)作來(lái)說(shuō),前一時(shí)刻的數(shù)據(jù)是輸入,轉(zhuǎn)換后的數(shù)據(jù)是輸出;但對(duì)于期望實(shí)現(xiàn)直升飛機(jī)移動(dòng)的動(dòng)畫(huà)效果的人來(lái)說(shuō),最初時(shí)刻的數(shù)據(jù)是輸入,一系列變化中的圖像效果是輸出。在控制論中,對(duì)于一個(gè)計(jì)算部件,將其放置在整個(gè)閉環(huán)的反饋系統(tǒng)中分析,與將其從整體系統(tǒng)中分離僅作為一個(gè)局部的組件來(lái)分析,其輸入和輸出是有很大區(qū)別的。如果不結(jié)合具體任務(wù),而只是單純地觀(guān)看計(jì)算裝置的系統(tǒng)結(jié)構(gòu)圖,是很難發(fā)現(xiàn)這些微妙的區(qū)別的。
● 簡(jiǎn)單計(jì)算裝置中的存儲(chǔ)和控制
對(duì)上述所說(shuō)的僅有輸入、運(yùn)算、輸出三個(gè)部件的簡(jiǎn)單計(jì)算裝置繼續(xù)發(fā)問(wèn):這個(gè)裝置中真的沒(méi)有用于存儲(chǔ)的部件嗎?假設(shè)圖像點(diǎn)陣的輸入依靠的是某種開(kāi)關(guān)矩陣,當(dāng)觸碰矩陣中某個(gè)位置的開(kāi)關(guān),相應(yīng)位置的圖像點(diǎn)陣的值就發(fā)生變化,顯然,人沒(méi)有足夠多的手指去觸碰所有能讓直升飛機(jī)圖像顯現(xiàn)出來(lái)的開(kāi)關(guān),所以當(dāng)觸碰了開(kāi)關(guān)后,相應(yīng)位置的圖像點(diǎn)陣的值就應(yīng)該被保持在那里,這種保持其實(shí)就是一種存儲(chǔ)。同樣地,對(duì)于輸出運(yùn)算結(jié)果的部件來(lái)說(shuō),也需要能夠在一定時(shí)間內(nèi)保持點(diǎn)陣的狀態(tài)。這樣看來(lái),這個(gè)簡(jiǎn)單裝置中的輸入和輸出的部件,其實(shí)都兼有存儲(chǔ)的功能。人們?cè)诰W(wǎng)絡(luò)上搜索存儲(chǔ)程序計(jì)算機(jī)體系結(jié)構(gòu)圖的時(shí)候就會(huì)發(fā)現(xiàn),有些結(jié)構(gòu)圖是以存儲(chǔ)器為中心繪制的,有些是以運(yùn)算器為中心繪制的,這兩種繪制方式其實(shí)都只是展現(xiàn)出了計(jì)算機(jī)動(dòng)態(tài)工作過(guò)程中的某一個(gè)角度的剖面。
以直升飛機(jī)的移動(dòng)為例,如果要產(chǎn)生出一種連續(xù)移動(dòng)的效果,就需要將輸出結(jié)果反饋到輸入。在頭腦中構(gòu)建一個(gè)簡(jiǎn)單的反饋裝置,就能夠明白存儲(chǔ)和控制部件存在的必要性。假設(shè)某個(gè)桿子上裝了某種滑塊,滑塊只有“上”和“下”兩種狀態(tài),而運(yùn)算部件唯一的功能就是將滑塊位置滑動(dòng)到其原來(lái)相反的方向,考慮用戶(hù)期望的運(yùn)算效果是讓滑塊不斷從上到下、從下到上往復(fù)運(yùn)動(dòng),如果直接將輸出反饋到輸入(如上頁(yè)圖3),即便是在頭腦中想象一下,也會(huì)發(fā)現(xiàn)這在邏輯上是不成立的。
引入存儲(chǔ)和控制部件,就能夠讓裝置的自動(dòng)運(yùn)行在邏輯上成為可能。當(dāng)反轉(zhuǎn)滑塊的運(yùn)算完成后,由控制部件開(kāi)通復(fù)制通道A,將剛才的輸出狀態(tài)傳遞給臨時(shí)存儲(chǔ)部件(注意,這里不討論具體的物理實(shí)現(xiàn),實(shí)際上需要設(shè)計(jì)某個(gè)裝置來(lái)保證狀態(tài)的單向傳遞),接下來(lái),是關(guān)閉復(fù)制通道A,開(kāi)啟復(fù)制通道B,將狀態(tài)傳遞給計(jì)算裝置的輸入部件。雖然上頁(yè)圖4中沒(méi)有特意畫(huà)出那個(gè)執(zhí)行開(kāi)關(guān)A和B通道的控制部件,但大家很容易認(rèn)可它是必須存在的。
● 能產(chǎn)生不同效果的簡(jiǎn)單計(jì)算裝置
有一個(gè)問(wèn)題很值得思考:上述計(jì)算裝置能實(shí)現(xiàn)的效果是單一的,如直升飛機(jī)的圖案只能向左移動(dòng),那么,怎么讓圖案向右移動(dòng)呢?大家最容易想到的就是將規(guī)則變動(dòng)一下,改成將所有的“01”轉(zhuǎn)換為“10”,但假設(shè)計(jì)算裝置是一個(gè)預(yù)先制造好的實(shí)體,修改轉(zhuǎn)換規(guī)則,就等同于要求修改實(shí)體結(jié)構(gòu)??紤]人們希望有這樣一個(gè)制造好的規(guī)則不再變動(dòng)的裝置,可以自由決定直升飛機(jī)究竟是向左移動(dòng)還是向右移動(dòng),當(dāng)然,其中的符號(hào)變換規(guī)則可能會(huì)有許多條,也會(huì)涉及更多除了“0”和“1”之外的符號(hào),也可能每一次變換符號(hào)的數(shù)量超過(guò)兩個(gè)(如把“abc”轉(zhuǎn)換為“efg”)。但這些轉(zhuǎn)換過(guò)程一定是嚴(yán)格按順序循環(huán)執(zhí)行的。另一個(gè)需要說(shuō)明的情況是,裝置在運(yùn)行過(guò)程中,必然會(huì)有許多必要的中間狀態(tài),但只要最終在某個(gè)時(shí)刻能實(shí)現(xiàn)圖像移動(dòng)的效果就可以了。根據(jù)以上條件,請(qǐng)?jiān)陬^腦中想象一下,這個(gè)裝置是否可行,甚至還可以在思維空間中模擬一下,究竟如何做才是可行的。對(duì)這個(gè)問(wèn)題的調(diào)查結(jié)果顯示,大部分學(xué)生認(rèn)為,實(shí)現(xiàn)多種移動(dòng)效果是可行的??赡艿姆椒ó?dāng)然有多種,其中有一種方案很少被人想到,所以這里特別提一下,那就是將二維的數(shù)據(jù)擴(kuò)展到三維,在代表圖像的數(shù)據(jù)層上方,覆蓋上一層代表操作動(dòng)作的數(shù)據(jù),而符號(hào)串的變換也需要在三維的數(shù)據(jù)空間中進(jìn)行。
可以繼續(xù)將問(wèn)題變得普遍化一些,想象一些輸入的數(shù)據(jù)中,除了真正用來(lái)做運(yùn)算的數(shù)據(jù)之外,其中某些數(shù)據(jù)起到了指定做何種運(yùn)算的作用。根據(jù)上述一系列的想象,學(xué)生們基本上都認(rèn)可,在輸入的數(shù)據(jù)中也可以混雜有代表某種指令的特殊的數(shù)據(jù),這樣就能夠指定讓運(yùn)算部件對(duì)數(shù)據(jù)(不包括代表某種指令的數(shù)據(jù))做某幾種特定變換工作中的一種。然而從中也可以看出,將用作指令的數(shù)據(jù)以及用作對(duì)數(shù)據(jù)中間變化狀態(tài)進(jìn)行記錄的數(shù)據(jù)一起混雜于輸入和輸出的數(shù)據(jù)中,對(duì)于使用計(jì)算裝置的用戶(hù)而言,是十分不友好的,這也是要在計(jì)算裝置中引入存儲(chǔ)器的另一個(gè)原因。
可以進(jìn)一步引出的問(wèn)題是,是不是存在這種可能,在輸入的數(shù)據(jù)中混雜有一系列特殊的指令,能夠指定讓運(yùn)算部件對(duì)數(shù)據(jù)做任意種可能的變換工作。這個(gè)問(wèn)題實(shí)際上是問(wèn),是不是存在某種程序用以實(shí)現(xiàn)通用性的任務(wù)。結(jié)論當(dāng)然是存在,關(guān)于為何這種通用性程序存在的解答,最早來(lái)自圖靈的證明,證明中不僅用到了純粹用思想構(gòu)建的圖靈機(jī),還用到了特定的數(shù)學(xué)工具,以及關(guān)于利用圖靈機(jī)來(lái)模擬圖靈機(jī)的可行性的精彩推論。盡管在有限的課時(shí)中可能難以詳述圖靈機(jī)的工作原理,但經(jīng)由以上一系列的純粹思維空間中的想象與推理,學(xué)生們就能夠領(lǐng)會(huì)到圖靈所做工作的巨大價(jià)值。