陳凱
打開通用計算機(jī)的蓋子
幾十年前,有不少電子愛好者的探索之路,是從拆收音機(jī)開始的,打開蓋子,換換零件,焊焊電路,就有一大堆要學(xué)的。而現(xiàn)在,由于電路集成度較高,就算打開機(jī)器的蓋子,也啥都做不了,難道就此不聞不問,將一切視作理所當(dāng)然?筆者認(rèn)為,所謂打開蓋子,并非真要在硬件層面將機(jī)器零件一個個查驗(yàn)過來,而是要把現(xiàn)象背后蘊(yùn)涵的寶貴的思想方法,一層層拆解出來。
為了有勇氣打開蓋子,需要大喊一聲:“難道真的是這樣嗎?”喝問的對象是什么?是教材上的文字和講課時的語句?文字和語言是用來幫助人們理解知識、把握概念的,但文字和語言本身不是知識和概念。如果有人問月亮在哪里,回答者用手一指,大家都知道那手指并不是月亮。而文字和語言,其實(shí)起的就是類似于手指的作用。人的頭腦在處理抽象或邏輯性問題時,常會犯自以為是的錯誤,以為自己已經(jīng)理解這些文字符號的意義,但往往經(jīng)不起多追問幾個為什么。
例如,一些教材中提到馮·諾依曼針對ENIAC提出的計算機(jī)改進(jìn)的建議中有一點(diǎn),“程序可以像數(shù)據(jù)那樣存放在存儲器中,由計算機(jī)自動執(zhí)行”。如今的人們可能會感覺,這難道不是理所當(dāng)然的事嗎?一般情況下,計算機(jī)將程序指令先從硬盤讀取,再到內(nèi)存執(zhí)行,那些智能手機(jī)可以將程序指令從閃存卡讀到內(nèi)存后執(zhí)行,甚至是單片機(jī),也可以是通過各種接口將新寫的程序刷到EEPROM等存儲器中后再執(zhí)行。
但計算機(jī)是如何自動讀取和執(zhí)行指令的,存儲器又是如何存儲指令的,這些問題若要究其技術(shù)根源,大概要讀上幾百、上千頁的專業(yè)技術(shù)資料才能勉強(qiáng)知曉其原理。在基礎(chǔ)教育領(lǐng)域,對學(xué)生來說,重要的不是知曉專業(yè)技術(shù)細(xì)節(jié),而是體驗(yàn)和領(lǐng)悟具體問題解決過程中思想方法上的突破。怎么才能激發(fā)起學(xué)生探索的動力呢?這就必須視所有的一切并非理所當(dāng)然。這就好像從機(jī)器的蓋子里往外拿零件,看看機(jī)器還能做什么,但拿的不是實(shí)體的零件,而是人工的概念。例如,可以拿掉存儲器,拿掉程序,不妨自我設(shè)問一下:難道有計算機(jī)根本沒有程序?難道程序并不像數(shù)據(jù)那樣存放在存儲器中?難道根本沒有存儲器用來放程序?
的確,早期許多計算機(jī),并不靠“程序”這種東西來運(yùn)行,當(dāng)然也沒有存儲器來存儲程序;教材上短短一句話,其實(shí)隱藏著一個很大的秘密,就算沒有程序,計算機(jī)也照樣啥事都能做(嚴(yán)格說,就是將可描述的數(shù)學(xué)運(yùn)算過程機(jī)械化)。為了充分理解這一點(diǎn),需要三次思維跳躍,若沒有這三次思維跳躍,就很難真正理解存儲程序思想的意義。
第一級跳躍:專用計算機(jī)
專用的機(jī)械計算機(jī)只能做特定的事。例如,帕斯卡的加法機(jī)就是一個無法編寫程序的機(jī)械專用計算機(jī)。雖說,它可以根據(jù)實(shí)際情況對不同的數(shù)據(jù)做加法,但若要將其變成乘法機(jī),需要更換齒輪零件。也就是說,除非改造機(jī)械結(jié)構(gòu),否則這臺機(jī)器無法實(shí)施新的任務(wù)。這就好像一個已經(jīng)定制完成的數(shù)學(xué)函數(shù),雖然數(shù)據(jù)可以通過函數(shù)的參數(shù)來傳遞,但函數(shù)本身的功能卻無法改變。
帕斯卡試圖將自己的加法機(jī)改造成乘法機(jī)所設(shè)計的零件圖紙(如上頁圖1)。
如上頁圖2所示,用兒童玩具改造的簡易加法機(jī),可以做百位數(shù)以內(nèi)的加法運(yùn)算。
可以用不同的零件制造專用的計算機(jī),如齒輪、杠桿、滾珠,甚至是水管加閥門、繩子加滑輪等,網(wǎng)絡(luò)中還可以找到許多有趣的例子。當(dāng)然,也可以換成更可靠一些的機(jī)電元件來制作計算裝置。為了讓學(xué)生們理解這一點(diǎn),最好的方法,莫過于讓其看一看、玩一玩各種專用計算機(jī)(這方面的實(shí)物教具的確太少了,但好在可以找到許多模擬器體驗(yàn)一下),甚至親手制造一個專用計算機(jī)。學(xué)生會發(fā)現(xiàn),若要改變機(jī)器功能,必然要改變機(jī)械結(jié)構(gòu)。
第二級跳躍:構(gòu)造統(tǒng)一的邏輯運(yùn)算單元
用不同方法制造出來的專用計算機(jī),其零件無法調(diào)換使用,擴(kuò)展性也很差,一個機(jī)械裝置輸出的狀態(tài),無法輕易輸入到另一個機(jī)械裝置中去。對于計算,能否構(gòu)造出一種像樂高積木那樣自由組合的零件,可以輕松插拔置換呢?答案是肯定的,可以先構(gòu)造出基本邏輯運(yùn)算單元,然后在邏輯運(yùn)算的基礎(chǔ)上實(shí)現(xiàn)數(shù)學(xué)運(yùn)算。
邏輯運(yùn)算需要用到的邏輯門同樣也可以用機(jī)械裝置構(gòu)造出來。用實(shí)體材料來構(gòu)造邏輯門有相當(dāng)大的難度,有興趣的朋友可以在各搜索引擎中搜索“mechanical logic gate”,欣賞一下用不同材料構(gòu)造的邏輯門。然而,一個好的教學(xué)活動不能僅有闡發(fā)道理的比喻,最好還能有提供實(shí)際操作體驗(yàn)的環(huán)境。筆者建議借助物理沙盤,如用Phun在電腦中虛擬搭建機(jī)械結(jié)構(gòu)。在Phun社區(qū)中,有不少已制作完成的邏輯門構(gòu)造,本文給出的這套設(shè)計方案,是用杠桿、彈簧和滾珠實(shí)現(xiàn)的。筆者借用這個現(xiàn)成的構(gòu)造,很快就造出一個一位的加法器。Phun社區(qū)中的與門和異或門(如圖3)。
用與門和異或門實(shí)現(xiàn)加法①:上方長方形從左輸入接口輸入二進(jìn)制1,下方小球代表輸出01(如圖4)。
用與門和異或門實(shí)現(xiàn)加法②:上方長方形從右輸入接口輸入二進(jìn)制1,下方小球代表輸出01(如圖5)。
用與門和異或門實(shí)現(xiàn)加法③:左右通道均輸入二進(jìn)制1,則下方小球輸出10(如圖6)。
Phun社區(qū)中提供了更多復(fù)雜的機(jī)械運(yùn)算裝置,可以用來進(jìn)一步研究不同的機(jī)械邏輯門是如何連接在一起使用的,限于篇幅,這里就不一一展示了。
第三級跳躍:構(gòu)造通用計算裝置的思路
人們當(dāng)然不希望自己辛辛苦苦造出來的機(jī)器,只能專一地做某一件事情。于是就產(chǎn)生出相關(guān)的需求,如何設(shè)計一種機(jī)器,人們想讓它做某種運(yùn)算,不需要調(diào)整機(jī)械結(jié)構(gòu),只要更改輸入信息,它就能實(shí)施那種特定的運(yùn)算?乍一想似乎不可能,但推理后卻證明,這樣的機(jī)器是有可能被制作出來的:
①使用上述機(jī)械邏輯門,可構(gòu)造出各種功能的計算裝置,如加法、乘法、除法甚至更多、更復(fù)雜的運(yùn)算裝置;
②為了實(shí)現(xiàn)不同的運(yùn)算,需要在每次運(yùn)算前,更改這些邏輯門的連接方式;
③人們并沒有真正制造出文中的機(jī)械計算裝置,人們只是在某個計算系統(tǒng)中模擬這套機(jī)械計算裝置的構(gòu)造和運(yùn)行;
④人們可以制造某個計算裝置A,該裝置的計算任務(wù)是唯一的,就是模擬一套機(jī)械計算裝置B的制造和運(yùn)行,于是,人們面對新計算任務(wù)時,不需要真的更改機(jī)械裝置A的結(jié)構(gòu),只需要“虛擬地”更改那個模擬出來的機(jī)械裝置B的結(jié)構(gòu);
⑤因此,允許在不更改機(jī)械結(jié)構(gòu)的情況下,構(gòu)造出一個通用的計算裝置。理論上說,這個通用計算裝置只需要有“輸入—處理—輸出”三個組成部分就可以了,并不一定需要存儲器來存儲程序和數(shù)據(jù)。
從第④步到第⑤步的推論,需要比較大的思維跳躍,不過筆者可以保證,這兩步之間是不需要更多的推理步驟了。解決通用計算問題的天才想法很早就出現(xiàn)了,而且也有人真的想去實(shí)現(xiàn)它。最早的嘗試者是巴貝奇,但限于機(jī)械零件的精度,他最終失敗了,很多年之后,圖靈和邱奇通過數(shù)學(xué)的方法實(shí)際驗(yàn)證了這個想法的可行性。簡單來說,就是通過數(shù)學(xué)法則建造一個虛擬計算裝置的模型,并將這個虛擬計算機(jī)模型的數(shù)據(jù)作為輸入?yún)?shù),輸入到一臺專門用來模擬虛擬計算裝置運(yùn)行過程的計算模型中,理論上說,一臺計算機(jī)能夠模擬運(yùn)行一臺運(yùn)算規(guī)則完全和自身相同的虛擬計算機(jī)。也許絕大多數(shù)學(xué)生,還無法理解圖靈或邱奇的數(shù)學(xué)證明過程,但若真的動手造一個機(jī)械運(yùn)算裝置,或是在沙盤軟件里模擬一下制作過程,相信他們能更快地理解筆者給出的邏輯推論。