陳凱
摘要:為了幫助學(xué)生直觀地理解計(jì)算機(jī)底層硬件的工作過(guò)程,本文設(shè)計(jì)了一種簡(jiǎn)單的數(shù)字邏輯電路,可利用這種邏輯電路來(lái)解釋計(jì)算機(jī)邏輯架構(gòu)中運(yùn)算器、控制器、存儲(chǔ)器三者的關(guān)系,以及二進(jìn)制編碼在計(jì)算機(jī)工作過(guò)程中所起到的作用。
關(guān)鍵詞:計(jì)算機(jī)體系結(jié)構(gòu);控制器
中圖分類號(hào):G434? 文獻(xiàn)標(biāo)識(shí)碼:A? 論文編號(hào):1674-2117(2023)11-0020-05
“一去二三里,煙村四五家。亭臺(tái)六七座,八九十枝花?!北彼未蠹疑塾簩懴碌臄?shù)字詩(shī)恰好用到了從一到十的十個(gè)數(shù)字。代入詩(shī)人的視野:從宏觀的“二三里路”,到中觀的“煙村”和“亭臺(tái)”,再到微觀的“花”;代入詩(shī)人的情緒:從灑脫的“一去二三里”,到精細(xì)的“八九十枝花”。此數(shù)字詩(shī)之妙趣可謂無(wú)出其右。仔細(xì)看詩(shī)中數(shù)字,二三四五直到十,這些都是數(shù)量,而“一去”的“一”卻是助詞,兩類數(shù)字屬性不同,卻達(dá)成了數(shù)字序列形式上完美的統(tǒng)一。這讓筆者聯(lián)想起計(jì)算機(jī)機(jī)器語(yǔ)言,在那些底層的指令代碼中,無(wú)論是操作碼還是操作數(shù),雖然其表現(xiàn)形式都是一連串的數(shù)碼,但數(shù)碼的作用卻完全不同,如果不是投入目光到計(jì)算機(jī)內(nèi)部組件的運(yùn)作過(guò)程,恐怕很難體會(huì)到這些數(shù)碼的真實(shí)用途。那么有沒有可能讓學(xué)生真正了解到計(jì)算機(jī)底層大致的工作過(guò)程,領(lǐng)悟當(dāng)前硬件的計(jì)算機(jī)架構(gòu)和二進(jìn)制數(shù)碼形式的機(jī)器語(yǔ)言兩者間的密切聯(lián)系?本文試著給出一種教學(xué)思路。
一種通用的計(jì)算機(jī)架構(gòu)模擬器
“Johnny”是一種通用的計(jì)算機(jī)架構(gòu)模擬器,從軟件的界面可以看出,左側(cè)欄是存儲(chǔ)器,中間欄和右側(cè)欄是中央處理器中的控制器和運(yùn)算器??梢栽谀M器界面左側(cè)輸入程序代碼,然后運(yùn)行代碼,觀察控制器如何根據(jù)機(jī)器指令的操作碼和操作數(shù),命令運(yùn)算器實(shí)現(xiàn)不同的計(jì)算動(dòng)作。以下頁(yè)圖1的程序代碼為例,首先執(zhí)行的是01號(hào)指令,代表的含義是從存儲(chǔ)器取數(shù)到處理器的寄存器,示例中取的是004號(hào)空間中的數(shù);然后執(zhí)行的是02號(hào)指令,代表含義是從存儲(chǔ)器取數(shù)與處理器中的寄存器數(shù)做加法,示例中取的是005號(hào)空間中的數(shù),于是就執(zhí)行了數(shù)字009和數(shù)字008的加法運(yùn)算;最后執(zhí)行的是03號(hào)指令,代表含義是從處理器中的寄存器存儲(chǔ)數(shù)字到存儲(chǔ)器,示例中存儲(chǔ)的地址是003號(hào)空間。這個(gè)模擬器軟件很清晰地將計(jì)算機(jī)內(nèi)部處理器芯片根據(jù)存儲(chǔ)器的程序和數(shù)據(jù)進(jìn)行運(yùn)算的工作流程展現(xiàn)了出來(lái)。
但請(qǐng)注意,從模擬器的軟件界面中可以看出,處理器芯片中的控制器是一個(gè)黑箱。如果想要知道控制器到底是如何根據(jù)存儲(chǔ)器中的代碼實(shí)現(xiàn)對(duì)應(yīng)的操作的,就需要進(jìn)一步將控制器的內(nèi)部結(jié)構(gòu)展現(xiàn)出來(lái)。如圖2所示,控制器內(nèi)部結(jié)構(gòu)是比較復(fù)雜的,雖然“Johnny”模擬器可以完整地模擬控制器中數(shù)據(jù)的變化,但對(duì)大部分學(xué)生而言,恐怕不是短時(shí)間就能理解的??刂破鹘Y(jié)構(gòu)之所以如此復(fù)雜,是因?yàn)榭刂破鞅仨毮軐?shí)現(xiàn)通用性的程序運(yùn)行的控制。
如果不考慮計(jì)算的通用性的問(wèn)題,目的僅僅是演示一個(gè)簡(jiǎn)單運(yùn)算過(guò)程中整個(gè)計(jì)算機(jī)體系結(jié)構(gòu)各個(gè)部件的作用,就能對(duì)控制器的結(jié)構(gòu)進(jìn)行簡(jiǎn)化。本文將要討論的兩個(gè)重點(diǎn),其一是設(shè)計(jì)一種簡(jiǎn)化的控制器結(jié)構(gòu),其二是試圖循序漸進(jìn)地剖析控制器的功能。
一種時(shí)序控制裝置
考慮到學(xué)生對(duì)算法和高級(jí)語(yǔ)言的了解遠(yuǎn)多于對(duì)計(jì)算機(jī)硬件結(jié)構(gòu)的了解,所以教師可以借助簡(jiǎn)單的變量賦值語(yǔ)句來(lái)類比處理器芯片中寄存器的數(shù)據(jù)傳輸和存儲(chǔ)。學(xué)生從經(jīng)驗(yàn)出發(fā),應(yīng)該比較容易在高級(jí)語(yǔ)言的賦值語(yǔ)句和硬件寄存器的數(shù)據(jù)存儲(chǔ)動(dòng)作兩者間產(chǎn)生聯(lián)想,雖然技術(shù)事實(shí)是后者的硬件電路結(jié)構(gòu)支撐著前者程序功能的實(shí)現(xiàn)。例如,a=3,b=4這兩句語(yǔ)句可以類比為上頁(yè)圖3所示的數(shù)字電路,此電路圖可由仿真軟件Logisim模擬運(yùn)行。在圖3中,左側(cè)裝置演示的是時(shí)鐘脈沖尚未來(lái)到時(shí)的寄存器的狀態(tài),右側(cè)裝置演示的是始終脈沖到來(lái)后寄存器的狀態(tài)??梢钥闯?,數(shù)字3和4可以同時(shí)存儲(chǔ)到寄存器中,而高級(jí)程序語(yǔ)言中,數(shù)字3和4賦值給變量是有先后關(guān)系的。
一種自動(dòng)的斐波那契數(shù)列項(xiàng)生成器
假設(shè)變量a和b中已有初始值,且均為1,有以下語(yǔ)句:
a=a+b
b=a+b
如果反復(fù)地按順序執(zhí)行這兩句語(yǔ)句,則會(huì)按如下表所示的順序陸續(xù)生成斐波那契數(shù)列項(xiàng):
但如上頁(yè)圖4所示的硬件電路卻難以達(dá)成類似目標(biāo)。因?yàn)榧臃ㄆ鬟\(yùn)算后的結(jié)果數(shù)據(jù),會(huì)同時(shí)存儲(chǔ)到寄存器a和寄存器b中。
為了使電路能像程序代碼那樣按順序執(zhí)行,可以添加兩個(gè)緩沖控制器,電路圖中用小三角形表示。如圖5所示,當(dāng)緩沖控制器的控制端為“1”信號(hào)時(shí),數(shù)據(jù)可以通過(guò),當(dāng)控制端為“0”信號(hào)時(shí),數(shù)據(jù)無(wú)法通過(guò)。這樣,只要先打開上方緩沖控制器通路,將加法結(jié)果存入a寄存器,再關(guān)閉上方緩沖控制器,打開下方緩沖控制器,將加法結(jié)果存入b寄存器,反復(fù)執(zhí)行這個(gè)動(dòng)作,就能使這個(gè)電路生成斐波那契數(shù)列項(xiàng)了。圖5左圖展示了上方緩沖控制器打開時(shí)電路運(yùn)行的狀態(tài),可見“1+1”加法運(yùn)算結(jié)果數(shù)據(jù)存入寄存器a,右圖展示了后續(xù)下方緩沖控制器打開時(shí)電路運(yùn)行的狀態(tài),可見“2+1”加法運(yùn)算結(jié)果數(shù)據(jù)存入寄存器b。
雖然時(shí)鐘脈沖是自動(dòng)產(chǎn)生的,但輪流選中不同的緩沖控制器,卻需要人工操作,在這里,希望學(xué)生能有所領(lǐng)悟,人工操作的動(dòng)作本身也就是輪流發(fā)送給控制緩沖控制器的“1”信號(hào)和“0”信號(hào)的動(dòng)作,其實(shí)是可以被預(yù)先存儲(chǔ)起來(lái)的。上頁(yè)圖6所示的電路使用到了一個(gè)存儲(chǔ)器(注意存儲(chǔ)器和寄存器的區(qū)別),存儲(chǔ)器中用“1”指令代表開啟上方緩沖控制器,用“0”指令代表開啟下方緩沖控制器。這樣,只要從存儲(chǔ)器中按順序取出二進(jìn)制數(shù)字,也就能按順序執(zhí)行指令了。
一種簡(jiǎn)單的可編程的多功能加法裝置
在上面的例子中,存儲(chǔ)器里只存儲(chǔ)了動(dòng)作指令,為了增強(qiáng)功能,指令中應(yīng)包括動(dòng)作的類別和動(dòng)作的處理對(duì)象,上頁(yè)圖7是個(gè)極為精簡(jiǎn)的處理器的例子,存儲(chǔ)器里的指令包括了操作碼和操作數(shù)。操作碼只有一位二進(jìn)制數(shù),對(duì)應(yīng)兩個(gè)動(dòng)作,指令“0”代表向寄存器做加法的動(dòng)作,指令“1”代表向寄存器存儲(chǔ)數(shù)字的動(dòng)作,操作數(shù)有兩位,可以是“00”“01”“10”“11”,代表數(shù)字0到3,為了盡可能簡(jiǎn)化問(wèn)題,這些數(shù)字會(huì)直接存放或加到寄存器中,這和現(xiàn)實(shí)中的處理器要根據(jù)操作數(shù)的地址從存儲(chǔ)器中獲取數(shù)字的行為有所不同。在圖7所示的電路中,存儲(chǔ)器中的指令是5、1、0、1,它們對(duì)應(yīng)的二進(jìn)制數(shù)是101、001、000、001,其含義是對(duì)寄存器存1,對(duì)寄存器加1,對(duì)寄存器加0,對(duì)寄存器加1,在完整執(zhí)行完所有指令后,得到的結(jié)果是3。
當(dāng)然,也可以另外使用一個(gè)存儲(chǔ)器專門存儲(chǔ)需要進(jìn)行存儲(chǔ)或加法運(yùn)算的數(shù)據(jù),這樣,指令中的操作數(shù)就表示了指向數(shù)據(jù)存儲(chǔ)器的地址,如上頁(yè)圖8所示。不過(guò)就算如此,這個(gè)結(jié)構(gòu)和先前的“Johnny”模擬器或者說(shuō)和當(dāng)前最普遍使用的計(jì)算機(jī)體系架構(gòu)還是有幾處不同,在“Johnny”中,指令和數(shù)據(jù)是存儲(chǔ)在一個(gè)存儲(chǔ)器中的,另外,“Johnny”中可以將運(yùn)算后的結(jié)果存儲(chǔ)回存儲(chǔ)器。這些功能當(dāng)然是可以用電路實(shí)現(xiàn)的,但會(huì)使得系統(tǒng)結(jié)構(gòu)變得非常復(fù)雜,對(duì)大部分學(xué)生來(lái)說(shuō),重點(diǎn)是理解二進(jìn)制數(shù)是如何在計(jì)算過(guò)程中起到控制作用的。對(duì)于學(xué)有余力的學(xué)生,可以鼓勵(lì)自主探索,筆者有幾位學(xué)生按本文思路,完整地設(shè)計(jì)出了通用計(jì)算機(jī)體系結(jié)構(gòu)的數(shù)字電路。
計(jì)算機(jī)體系結(jié)構(gòu)示意圖
雖然教師可以將教材上的計(jì)算機(jī)體系結(jié)構(gòu)示意圖直接拋給學(xué)生,但這樣就剝奪了學(xué)生自主思考的機(jī)會(huì),考查前面介紹的精簡(jiǎn)的計(jì)算機(jī)體系結(jié)構(gòu)電路模型,可以試著繪制此結(jié)構(gòu)的示意圖,思考存儲(chǔ)器、控制器、運(yùn)算器三者間的關(guān)系是怎樣的。繪制的結(jié)果可以不設(shè)標(biāo)準(zhǔn)答案,不過(guò)可以想見,它大概是如圖9所示的樣子。存儲(chǔ)器中指令的操作碼傳輸?shù)搅丝刂破?,操作?shù)中的數(shù)據(jù)或操作數(shù)所指向地址的數(shù)據(jù)傳輸?shù)搅诉\(yùn)算器。不過(guò),其實(shí)很難說(shuō)控制器是否對(duì)存儲(chǔ)器和運(yùn)算器起到了控制作用,因?yàn)榭刂破鲗?shí)際上只是根據(jù)存儲(chǔ)器發(fā)來(lái)指令的操作碼開通或關(guān)閉數(shù)據(jù)傳輸?shù)耐范?,所以圖9中將控制線條畫成虛線。
很容易想到,稍微復(fù)雜一些的計(jì)算機(jī)體系結(jié)構(gòu),應(yīng)該具有將運(yùn)算器結(jié)果重新存儲(chǔ)到存儲(chǔ)器中的能力,再加上人機(jī)交互的輸入和輸出模塊(簡(jiǎn)單推理可知,為了能輸入和修改程序,人和存儲(chǔ)器交互較之與運(yùn)算器交互更為方便,這里不進(jìn)一步展開討論),整個(gè)計(jì)算機(jī)體系結(jié)構(gòu)示意圖就成為如圖上頁(yè)10所示的樣子。這個(gè)示意圖和廣為流傳的以存儲(chǔ)器為中心的現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)示意圖已經(jīng)非常相近了。
芯中之?dāng)?shù),數(shù)中之心
本文使用仿真軟件演示了一個(gè)精簡(jiǎn)的計(jì)算機(jī)體系結(jié)構(gòu)是如何搭建起來(lái)的,考慮到筆者其實(shí)是使用了實(shí)體計(jì)算機(jī)中的仿真軟件模擬出了可運(yùn)行的虛擬的計(jì)算機(jī),那么就能引出一個(gè)有趣的問(wèn)題,計(jì)算機(jī)是不是能經(jīng)由計(jì)算而判斷出自己能否完成某些特定的任務(wù)呢?乍一想,只要計(jì)算機(jī)將自身程序在模擬環(huán)境中運(yùn)行一下,就能得出判定結(jié)論了,但這其中存在一個(gè)邏輯上的陷阱,計(jì)算機(jī)為了模擬運(yùn)行自身程序,就需要額外用到那些實(shí)現(xiàn)模擬的程序。如果再追問(wèn):計(jì)算機(jī)是否能判斷那個(gè)模擬自身程序的程序完成任務(wù)呢?為了回答這個(gè)問(wèn)題,就必須把這個(gè)實(shí)現(xiàn)模擬自身程序的程序也放置到某個(gè)實(shí)現(xiàn)模擬的程序環(huán)境中,這樣就陷入到無(wú)窮倒退的窘境之中了。假設(shè)人的頭腦的工作方式和計(jì)算機(jī)是相近的,那么當(dāng)人在自問(wèn)能否完成任務(wù)的時(shí)候,答案可能只是頭腦所模擬出來(lái)的虛假的自我程序所做出的。當(dāng)然,人的頭腦的工作方式是否和計(jì)算機(jī)類似,這還是一個(gè)懸而未決的問(wèn)題,然而,只從結(jié)果上看,人工智能的能力已經(jīng)超過(guò)許多人類了。以下是向人工智能對(duì)話軟件ChatGPT提出的問(wèn)題:
“北宋時(shí)期,邵雍的數(shù)字詩(shī)《山村詠懷》按順序用到了從一到十這10個(gè)數(shù)字。第一個(gè)問(wèn)題,你能否也寫一首短詩(shī),其中用到從一到十按自然數(shù)順序排列的數(shù)字?第二個(gè)問(wèn)題,數(shù)字詩(shī)中的‘一所起的作用和其他數(shù)字所起的作用是不同的,讓人聯(lián)想到計(jì)算機(jī)機(jī)器語(yǔ)言指令中,二進(jìn)制數(shù)碼所起的作用是不同的,你能否具體舉例說(shuō)明呢?”
人工智能給出幾乎是滿分的回答:“如一個(gè)16位計(jì)算機(jī)指令,其中前四位代表操作碼,后12位代表地址碼,操作碼表示不同的操作,而地址碼則指示了操作數(shù)在內(nèi)存中的位置。因此,在計(jì)算機(jī)中使用二進(jìn)制數(shù)碼,其具體作用與其所處的上下文密切相關(guān),需要根據(jù)具體情況加以理解?!?/p>
本文最后就以人工智能寫的數(shù)字詩(shī)來(lái)結(jié)尾,筆者做了兩處修改,把原詩(shī)中的“六合之內(nèi)”改為“六合位定”,把“一劍鋒利出”改成“一劍定乾坤”,這極少數(shù)的修改,可以算是人的創(chuàng)造力較人工智能占優(yōu)的不嚴(yán)謹(jǐn)?shù)淖C明吧。
“一生為二二生三,三生萬(wàn)物森。四海潮漲五岳高,六合位定七星璀。八方風(fēng)雨九州闊,十年一劍定乾坤?!?/p>