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