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