陳凱
關(guān)于馮·諾依曼架構(gòu)計(jì)算機(jī),很多教材提及的一是五大部件之功能,二是其利用存儲(chǔ)器存儲(chǔ)和調(diào)用程序之能力。然而,如果僅用文字和圖片將馮·諾依曼架構(gòu)計(jì)算機(jī)之組成和特征概括講解一番,雖然能夠完成基本教學(xué)任務(wù),但如果問(wèn)及為什么馮·諾依曼架構(gòu)計(jì)算機(jī)具有存儲(chǔ)和調(diào)用程序之能力,其運(yùn)行程序過(guò)程具體為何,為什么說(shuō)此種架構(gòu)計(jì)算機(jī)可實(shí)現(xiàn)通用計(jì)算,估計(jì)很多信息技術(shù)教師也不知道其根本。雖然現(xiàn)今計(jì)算設(shè)備高度集成,硬件組成原理不容易觸及,并且若要具體描述馮·諾依曼架構(gòu)計(jì)算機(jī)工作過(guò)程,其間所涉及原始指令代碼,與日常應(yīng)用相距甚遠(yuǎn),然而,若能在較短時(shí)間內(nèi),針對(duì)某特定簡(jiǎn)單運(yùn)算問(wèn)題,將馮·諾依曼架構(gòu)計(jì)算機(jī)之核心工作過(guò)程做直觀展現(xiàn),則既能彰顯隱藏于課程教授內(nèi)容背后之技術(shù)思想,又能為學(xué)有余力者指引問(wèn)題解答路徑。此前確已得見(jiàn)多位教師嘗試在課堂中展示馮·諾依曼架構(gòu)計(jì)算機(jī)具體工作流程,其中有的用動(dòng)畫(huà)課件演示數(shù)據(jù)和控制信號(hào)變化,有的借用拼插積木在游戲交互中演示數(shù)據(jù)和控制信號(hào)變化。無(wú)論動(dòng)畫(huà)還是積木玩具,均不可稱為真正編寫(xiě)程序代碼,自然無(wú)從體現(xiàn)存儲(chǔ)程序通用計(jì)算之能。若借助程序語(yǔ)言設(shè)計(jì)平臺(tái),如派森、爪哇之類的編寫(xiě)模擬器,提供可交互運(yùn)行之馮·諾依曼架構(gòu)計(jì)算機(jī)模擬平臺(tái),不免耗時(shí)耗力;又因當(dāng)前幾乎任何高級(jí)程序語(yǔ)言均為圖靈通用系統(tǒng),以此模擬馮·諾依曼架構(gòu)通用計(jì)算過(guò)程,難免有倒果為因的嫌疑。因此,本文以八個(gè)記事本模擬馮·諾依曼架構(gòu)計(jì)算機(jī)中各主要部件,輔以按鍵精靈錄制“復(fù)制、查找、粘貼”過(guò)程展現(xiàn)架構(gòu)中數(shù)據(jù)和控制信號(hào)變化,在計(jì)算機(jī)桌面上創(chuàng)生出一套可模擬運(yùn)行的存儲(chǔ)程序通用計(jì)算系統(tǒng)。
在馮·諾依曼架構(gòu)計(jì)算機(jī)中,存儲(chǔ)器中既可以存儲(chǔ)數(shù)據(jù),也可以存儲(chǔ)程序代碼。為了簡(jiǎn)化問(wèn)題,假設(shè)某馮·諾依曼架構(gòu)計(jì)算機(jī)存儲(chǔ)器含四個(gè)單元程序代碼區(qū),其中所存儲(chǔ)程序代碼作用為二進(jìn)制數(shù)字由零開(kāi)始反復(fù)加一操作,另含兩個(gè)單元的數(shù)據(jù)區(qū),用作加一操作的數(shù)據(jù)存儲(chǔ),其結(jié)構(gòu)簡(jiǎn)化后如下頁(yè)圖1所示。
圖1中,灰色部分為存儲(chǔ)索引,不可更改,白色部分可讀可寫(xiě)。為了描述問(wèn)題簡(jiǎn)便起見(jiàn),每個(gè)存儲(chǔ)單位高低部分各可存儲(chǔ)三位二進(jìn)制數(shù),總共可以存儲(chǔ)六位二進(jìn)制數(shù),存儲(chǔ)器共設(shè)六個(gè)存儲(chǔ)單位,索引號(hào)自000編到101。當(dāng)然,實(shí)際應(yīng)用中,無(wú)論是存儲(chǔ)單元還是每個(gè)單元的存儲(chǔ)位數(shù)都遠(yuǎn)遠(yuǎn)多于本文的示例。
如何看出表中存儲(chǔ)究竟為程序代碼還是數(shù)字?只要高位全零,則表示所存為數(shù)據(jù);除此之外即是程序代碼指令,高位為操作碼,表示操作動(dòng)作類別,低位為操作數(shù)。一般操作數(shù)指向?qū)嶋H操作數(shù)字之存儲(chǔ)器索引號(hào),以圖1為例,指令“001101”中高位“001”表示取數(shù),低位“101”表示101號(hào)存儲(chǔ)空間,則實(shí)際取出數(shù)字為“001”。上述程序代碼先取出101號(hào)存儲(chǔ)空間之“001”,隨后將其與100號(hào)存儲(chǔ)空間之“000”相加,并將結(jié)果存儲(chǔ)于100號(hào)存儲(chǔ)空間中,繼而跳轉(zhuǎn)至000號(hào)存儲(chǔ)空間重復(fù)執(zhí)行程序代碼,如此即實(shí)現(xiàn)由零開(kāi)始反復(fù)加一計(jì)數(shù)功能。實(shí)際上,馮·諾依曼架構(gòu)系統(tǒng)中還有其他若干指令,如判斷(Test)、減法(Dec)、停機(jī)(Halt)等,使之具有完整通用計(jì)算能力,這里限于篇幅不一一列舉。
馮·諾依曼架構(gòu)框架圖常見(jiàn)于教材或網(wǎng)絡(luò),如圖2所示,其核心部件及部件之間關(guān)系雖然清晰,但也因過(guò)于概括,無(wú)法展現(xiàn)其具體運(yùn)算細(xì)節(jié),因此,本文借助表格稍做細(xì)化,如圖3所示。
馮·諾依曼架構(gòu)核心部件細(xì)化表中,控制器內(nèi)控制器寄存器、計(jì)數(shù)器和指令地址之?dāng)?shù)據(jù),運(yùn)算器中運(yùn)算器寄存器之?dāng)?shù)據(jù),總線中數(shù)據(jù)總線和地址總線之?dāng)?shù)據(jù),均可讀可寫(xiě)。以加一操作為例,下頁(yè)表展現(xiàn)出各指令具體工作過(guò)程。
調(diào)用程序及具體指令交錯(cuò)運(yùn)行,但如果要追問(wèn)加一計(jì)算何以可行,還要將馮·諾依曼架構(gòu)計(jì)算裝置實(shí)際搭建出來(lái),然后按以上步驟一一驗(yàn)證。
如下頁(yè)圖4所示,馮·諾依曼架構(gòu)計(jì)算裝置組裝方法頗為奇特,在操作系統(tǒng)中打開(kāi)八個(gè)記事本窗口,分別作為運(yùn)算器、運(yùn)算器寄存器、存儲(chǔ)器、控制器寄存器、控制器計(jì)數(shù)器、控制器指令地址、數(shù)據(jù)總線和地址總線。將記事本窗口平鋪于桌面之上,其中指令地址、運(yùn)算器寄存器、控制器寄存器、地址總線、數(shù)據(jù)總線默認(rèn)置為“000”。
其他元件使用方法如下。計(jì)數(shù)器:只要連按三次刪除鍵,即可作計(jì)數(shù)器使用。存儲(chǔ)器:第一行寫(xiě)存儲(chǔ)單位索引號(hào),第二行對(duì)應(yīng)索引號(hào)寫(xiě)存儲(chǔ)單位高低位數(shù)據(jù)。運(yùn)算器:通過(guò)窮舉法實(shí)現(xiàn)三位二進(jìn)制數(shù)加法運(yùn)算,比如“000101 101”表示“000”加上“101”得“101”;實(shí)際上,記事本確能實(shí)現(xiàn)真正二進(jìn)制運(yùn)算,具體方法可參考本欄目往期文章。
隨后,按指令操作動(dòng)作表,用鼠標(biāo)和鍵盤模擬操作動(dòng)作即可,如每次執(zhí)行具體指令前均要先執(zhí)行“調(diào)用程序”,其步驟如下:操作計(jì)數(shù)器給地址總線時(shí),用鼠標(biāo)將計(jì)數(shù)器中最前三位數(shù)字復(fù)制到地址總線中即可;操作存儲(chǔ)器(根據(jù)地址總線的地址)給數(shù)據(jù)總線時(shí),先復(fù)制地址總線中數(shù)據(jù)(如一開(kāi)始時(shí)是“000”),然后在存儲(chǔ)器中查找該數(shù)據(jù),接著按鍵盤“下”,選中該索引號(hào)所對(duì)應(yīng)的數(shù)據(jù)(如“001101”),再將該數(shù)據(jù)替換數(shù)據(jù)總線中的數(shù)據(jù)……
為了實(shí)現(xiàn)自動(dòng)操作,可用“按鍵精靈”軟件將上述動(dòng)作錄制下來(lái)。筆者用“按鍵精靈”錄下二進(jìn)制加一程序所需全部動(dòng)作,排列組合后即可成為不同指令,如圖5所示?!鞍存I精靈”軟件開(kāi)發(fā)大約是為方便游戲玩家按鍵操作,開(kāi)發(fā)者恐怕不曾想到會(huì)用于信息技術(shù)教學(xué)。
為了使“按鍵精靈”實(shí)現(xiàn)自動(dòng)操作,須靈活使用記事本中“查找”功能,如為能使計(jì)數(shù)器反復(fù)使用,每次跳轉(zhuǎn)(Jump)后,可將計(jì)數(shù)器中數(shù)字重新從000到111寫(xiě)好,然后在記事本中查找需要跳轉(zhuǎn)至存儲(chǔ)器之索引號(hào),將之前數(shù)碼刪除即可(按若干次Backspace)。將上述錄制鍵盤鼠標(biāo)操作排列組合,即可實(shí)現(xiàn)取數(shù)(Take)、加法(Add)、存儲(chǔ)(Save)、跳轉(zhuǎn)(Jump)、調(diào)用(Fetch)等各個(gè)指令的操作動(dòng)作。一旦操作動(dòng)作錄制完成,其后如要寫(xiě)入新的程序,或者修改程序,均不需重新錄制,只要在“按鍵精靈”中將先前各項(xiàng)錄制動(dòng)作重新排列組合即可,于是就使得記事本具有“準(zhǔn)通用”計(jì)算能力。之所以稱“準(zhǔn)通用”,是因?yàn)楸仨殞⒂浭卤敬鎯?chǔ)器中的指令與“按鍵精靈”中動(dòng)作順序保持一致方可運(yùn)行。然而,能否不改變“按鍵精靈”錄制動(dòng)作順序,只改變記事本存儲(chǔ)器指令,即使“按鍵精靈”自動(dòng)識(shí)別出記事本中指令代碼?此種需求,須當(dāng)“按鍵精靈”具有將其自身錄制編輯動(dòng)作之行為亦復(fù)錄制下來(lái)的功能,方可實(shí)現(xiàn),此類動(dòng)作便稱作遞歸。不難想象,當(dāng)今高級(jí)語(yǔ)言之判斷或循環(huán),究其根本,都架構(gòu)于基本的自我“錄制”的遞歸基礎(chǔ)之上。