陳凱
先來玩一個找不同的游戲,看看圖1中哪個人的坐姿與眾不同?這實在是太容易了,當然是第四個人啊。然而稍微增加一點規(guī)則,游戲就變得有點意思了,考慮這樣的假設:每個人的坐姿都代表著一種含義,如果坐在我西面的那個人和我的方向一致,那么我就面向西坐(左西右東),如果坐在我西面的那個人和我的方向不一致,那么我就面向東坐。至于最西面的第一個人,他就假裝把最東面的那個人看成是坐在他西面的人?,F(xiàn)在的問題是,哪個人的朝向是錯誤的?
按這樣的規(guī)則,可以發(fā)現(xiàn),從西往東數(shù),第一個到第四個人都坐得妥妥當當?shù)模退闶堑谒膫€人,他的坐姿也恰好沒有問題,比較糾結(jié)的是第五個人,他的朝向與他西面的人的朝向不同,所以按規(guī)則,他就必須改變自己的坐姿,把臉朝向東,不過若他真的這樣做了,就會發(fā)現(xiàn),他的朝向就和坐在他西面那位保持一致了,于是他只有再把座位轉(zhuǎn)回來,然而這樣就沒完沒了啦。真是左右為難??!
為避免出現(xiàn)這樣矛盾的情況,需要引入一個指揮者,指揮者從左到右逐個詢問坐著的人是否要改變坐姿,指揮者走到最東面后,他就重新回到西面第一個人開始指揮,坐著的人無論是變還是不變,只有當指揮者指揮到自己時才能做一次決定。可以看出,第一個人到第四個人的決定都是保持不動,第五個人根據(jù)規(guī)則改變了朝向,從面向西改作面向東了(如圖2)。
然后,第六個人發(fā)現(xiàn)自己也必須要改變朝向了(如圖3)。
很快一個圈子兜了下來,到第十一步的時候,已經(jīng)兜回到第三個人了,他也改變了朝向,總算大家坐姿一樣了(如圖4)。
也許感覺一切都要結(jié)束了,所有人都妥妥地面朝東坐著了,讓強迫癥患者感覺要崩潰的是,當指揮到第十二步時,第四個坐著的人發(fā)現(xiàn),坐在他西面的人的朝向和他自己的朝向一致,所以他只好由面向東改為面向西(如圖5)。
看上去正好和初始時的狀態(tài)完全顛倒了一下,莫非再繼續(xù)變化一輪,大家的坐姿就能變回初始狀態(tài)嗎?這種想法實在是太簡單、太天真了,其實復雜的變化才剛剛開始,想要知道其后變化過程的朋友,可以繼續(xù)演算一下,或者編寫一個小程序模擬一下。
剛才游戲中的符號變化,其實可以做一臺機器來實現(xiàn),這里筆者并不打算用程序代碼,而是要使用電子元件來模擬出整個變化過程。需要的元件是一個存儲器、一個異或門、一個計數(shù)器、一個觸發(fā)器和一個時鐘發(fā)生器。其中,異或門、計數(shù)器和觸發(fā)器可以用三極管來搭建,當然實際上人們往往會使用封裝好的集成電路芯片,時鐘發(fā)生器可以使用輕觸開關來模擬,實際電路中可能需要電容和穩(wěn)壓二極管,至于存儲器,雖然可以用場效應管、電容等元件來組裝,但因為結(jié)構(gòu)太復雜,一般也是直接使用封裝好的芯片。為了方便解釋,這里給出整個系統(tǒng)的邏輯電路圖,電路圖是用開源的Logisim軟件繪制的。圖6中1號元件是時鐘發(fā)生器,在Logisim軟件中,用鼠標點兩下時鐘發(fā)生器,就會產(chǎn)生一個完整的脈沖信號;2號元件是一個觸發(fā)器,觸發(fā)器里存儲的是上一次異或門運算的結(jié)果,默認初始值為“0”;3號元件是異或門,作用是當兩個輸入的二進制信號不相等時,輸出信號“1”,否則輸出“0”;4號元件是計數(shù)器,將它的“Data bits”參數(shù)設置為“4”,就會隨時鐘發(fā)生器的脈沖,從0計數(shù)到15,然后再從頭開始;5號元件是存儲器,將它的“Address Bit Width”設置為“4”,里面就能存儲16個二進制數(shù),存儲器左側(cè)的D端口可以輸入數(shù)據(jù),右側(cè)的D端口可以輸出數(shù)據(jù),對應游戲看,其實是表示了十六個人的坐姿的朝向,朝向西為“0”,朝向東為“1”。
這張電路圖把先前文字層面的游戲規(guī)則給實物化了,時鐘發(fā)生器和計數(shù)器起到了指揮的作用,異或門的作用是將存儲器中的當前的數(shù)據(jù)和前一次異或運算的結(jié)果再進行異或運算,然后把新得到的數(shù)據(jù)存儲到存儲器中,這對應著游戲中坐姿朝向變化的過程。
就算弄不明白電路運行的原理,在Logisim中直接照著畫一下也不需要太長時間。然后運行Logisim電路模擬器,用鼠標不斷點擊時鐘發(fā)生器讓整個系統(tǒng)工作起來,在運行了16步也就是點擊了32次鼠標之后,存儲器里的數(shù)據(jù)變成了如圖7所示的樣子。
有人會問,既然可以編寫程序解決游戲中的坐姿朝向問題,為什么還要專門來搭建一個電路呢?當然不只是為了好玩,實際上,這個電路就是一個完整的計算機。時鐘發(fā)生器模擬了計算機中時鐘頻率的作用;觸發(fā)器就是寄存器,注意不是模擬,因為日常計算機中的寄存器就是用觸發(fā)器實現(xiàn)的,當然,日常使用的計算機中的寄存器要多得多;異或門是運算部件,日常計算機中的運算部件包含的邏輯門當然要多很多;這張電路圖中的存儲器的邏輯結(jié)構(gòu)也和日常計算機中的存儲器的邏輯結(jié)構(gòu)相同,為簡化問題,這里只用一個單純做加法的計數(shù)器來尋址。有興趣的讀者可以照此電路圖親手制造出一臺迷你計算機。
雖然可以將這臺機器稱為坐姿朝向游戲模擬機,但這臺小計算機的作用不限于此,它也可以對應其他實際用途。例如,可以用做奇偶校驗。假設存儲器前8位作為輸入,后8位作為輸出,那么在前8位中,“1”的個數(shù)是奇數(shù)還是偶數(shù),會使得后8位數(shù)據(jù)發(fā)生有趣的變化。
假設初始狀態(tài)時,前8位中有兩個“1”,即偶數(shù)個“1”,后8位數(shù)據(jù)預先清0(如圖8),運行一輪結(jié)束后,可觀察到后8位數(shù)存儲數(shù)據(jù)不變,表示檢查結(jié)果為偶數(shù)個“1”(如圖9)。
假設初始狀態(tài)時,前8位中有三個“1”,即奇數(shù)個“1”(如圖10),運行一輪結(jié)束后,可觀察到后8位數(shù)都變成了“1”,表示檢查結(jié)果為奇數(shù)個“1”(如圖11)。
除了用作奇偶校驗,這臺小計算機還會畫復雜的圖畫,假設初始狀態(tài)全是“1”,不停運行后,存儲器中的數(shù)據(jù)會按過程發(fā)生如下變化:
把數(shù)據(jù)中的0替換成空格,把1替換成字符“V”,就能看得非常清楚了,這就是叫作謝爾賓斯基三角形的分形圖案(如圖12)。
所以說,這臺小計算機既是坐姿變化游戲的模擬器,又是奇偶校驗器,還可以是謝爾賓斯基三角形繪圖儀,或者也可以單純用于烘托氣氛的LED閃爍控制。這個系統(tǒng)究竟起什么樣的作用,取決于使用者如何詮釋符號以及符號變化的意義。
不過,這里有一個頗為麻煩的情況,這臺小計算機雖然能做一些小事情,但它的能力十分有限,要擴充它的能力,就需要改變電路圖,增加邏輯門元件和存儲器容量。例如,可以通過增加存儲器和邏輯門實現(xiàn)一個簡單卻又較難破譯的加密裝置(如圖13)。
這個小裝置能夠把用戶輸入的ASCII碼進行加密,如輸入的是“GO”的ASCII碼(如圖14),加密后,輸出的密碼就是如圖15所示的樣子。并且因為加密的秘鑰自身也在變化,所以下一輪如果仍然要加密“GO”這兩個字母,生成的密碼和第一次是不同的?;镜募用芩悸泛蜌v史上著名的Enigma是類似的。
最后要給出一個奇妙的問題:如文中案例所示,當人們增加計算步驟或改變計算過程的時候,就需要改變計算裝置的電路結(jié)構(gòu),如增加邏輯門元件或存儲器的數(shù)量,并改變它們的連接方式。那么是不是存在某種結(jié)構(gòu)的電路,當人們的計算需求發(fā)生變化后,并不需要增減電子元件及改變電路結(jié)構(gòu),也能照樣進行計算呢?乍一想似乎不可思議,但問題的答案是肯定的。早在上世紀三四十年代,數(shù)學家阿隆佐·邱奇和艾倫·圖靈就指出,存在這樣一種機器,不需要改變邏輯運算部件的結(jié)構(gòu),只要提供容量足夠大的存儲器,就能滿足人們不同的計算需求了。艾倫·圖靈還給出了具體的方法,說明應該如何把這樣的機器建造出來。后來人們將圖靈設想的這種機器稱為通用計算機。圖靈被稱為計算機之父,實在是當之無愧。艾倫·圖靈提出的建造方法究竟是怎樣的呢?這可不是本文這點篇幅能夠說清楚的,然而實現(xiàn)的關鍵思路卻簡單扼要:第一,人們需要進行的運算過程都可以對應一系列的符號變化過程;第二,用來實現(xiàn)符號變化的機器自己的變化,也可以對應一系列的符號變化過程。如果讀者能真正領會這兩句話的深刻內(nèi)涵,那么只要對文章中的電路稍微做些改造,就能造出一臺真正的通用計算機來了。