- 計算機與人腦(學生版)
- (美)馮·諾伊曼
- 5181字
- 2023-04-07 18:49:09
第3章 邏輯控制
Logical Control
除了進行基本運算的能力外,一臺計算機必須能夠按照一定的序列(或者不如說是按照邏輯模式)來進行運算,以便取得數學問題的解答,這和我們進行筆算的實際目的相同。
除了進行基本運算的能力外,一臺計算機必須能夠按照一定的序列(或者不如說是按照邏輯模式)來進行運算,以便取得數學問題的解答,這和我們進行筆算的實際目的相同。在傳統的模擬計算機中(最典型的是“微分分析機”),計算的“序列”是這樣完成的: 它必須具有足夠的器官來完成計算所要求的各個基本運算,也就是說,必須具有足夠的“差動齒輪”和“積分器”,以便完成這兩種基本運算(參閱上文)。
這些圓盤,即計算機的“輸入”與“輸出”的圓盤,必須互相連接起來(或者,更確切地說,它們的軸必須連接起來),(在早期的模型中,用嵌齒齒輪連接,后來則用電從動裝置——自動同步機),以便模擬所需的計算。應該指出,連接的方式是可以按照需要而組裝起來的,即隨需要解算的問題而定,使用者的意圖可以貫徹在機器設計里面。這種“連接”,在早期的機器中用機械的方法(如前述的嵌齒齒輪),后來則用插接的方法(如電連接)。但不管如何,在解題的整個過程中,任何這些形式的連接,都是一種固定的裝置。
插入式控制
在一些最新的模擬機中,采用了進一步的辦法。它們使用電的“插件的”連接。這些插入式連接實際上被電磁機械繼電器所控制;電磁鐵使繼電器通路或斷路,因而產生電的激勵,使連接發生變換。這些電激勵可以由穿孔紙帶所控制;在計算中,在適當瞬間發出的電信號,可以使紙帶移動和停止(再移動,再停止……)。
邏輯帶的控制
剛才我們所說的控制,就是指計算機中一定的數字器官達到某一預定條件的情況,比如,某一個數開始變為負號,或者是某一個數被另一個數所超過,等等。應當注意,如果數是用旋轉圓盤來表示,它是正號或負號,就從圓盤通過零點向左還是向右轉動來判定;一個數被另一數超過,則可以從它們的差成為負數而察覺出來,等等。這樣,“邏輯”帶的控制(或者更恰當地說,一種“與邏輯帶控制相結合的計算狀態”),是在基本的“固定連接”控制的基礎之上的。
數字計算機就是從這些不同的控制系統開始的。但是,在討論這個問題之前,我還要先對數字計算機作出一般的評述,并評述它和模擬計算機的關系。
每一基本運算只需要一個器官的原理
在開始,必須強調,數字計算機中的每一基本運算,只需要一個器官。這和大多數的模擬機相反。大多數模擬計算機是每一基本運算需要有足夠多的器官,需要多少要看待解算的問題的情況而定(前面已經講過)。但是,應該指出,這只是一個歷史的事實而不是模擬機的內在要求。模擬計算機(上面所講過的電連接方式的模擬機),在原則上,也是能夠做到每一基本運算只需要一個器官的,而且它也能夠采用下文所講到的任何數字型的邏輯控制(讀者自己不難證明,上面已經講到的“最新”型的模擬機的控制,已經標志著向運算方式4的轉變)。
應該進一步說明,某些數字計算機也會或多或少地脫離了“每一基本運算只需要一個器官”的原則,但是,再作一些比較簡單的解釋,這些偏離也還是可以被納入這個正統的方案中的[在某些情況下,這只不過是用適當的相互通信的方法來處理雙重機(或三重機)的問題而已]。在這里,我不準備進一步討論這個問題了。
由此引起的特殊記憶器官的需要
“每一基本運算只需要一個器官”的原則,需要有較大數量的器官才能被動地存儲許多數,這些數是計算過程的中間結果或部分結果。也就是說,每一個這種器官,都必須能“存儲”一個數(在去掉這器官中前已存儲的一個數之后)。它從另外一個當時與它有連接的其他器官,把這個數接受過來;而且當它被“詢問”時,它還能夠把這個數“復述”出來,送給另外一個此時與它連接的器官。上述的這種器官,叫作“存儲寄存器”。這些器官的全體,叫作“記憶”。在一個記憶中存儲寄存器的數量,就是這個記憶的“容量”。
我們現在能夠進而討論數字計算機的主要控制方式了。這個討論,最好從描述兩個基本類型入手,并且接著敘述把這些類型結合起來的若干明顯的原則。
用“控制序列點”的控制
第一個已被廣泛采用的基本控制方法,可以敘述如下(這里已經作了若干簡化與理想化):
計算機包括一定數量的邏輯控制器官,叫作“控制序列點”,它具有下面所講的功能(這些控制序列點的數量相當可觀,在某些較新型的計算機中,可以達到幾百個)。
在采用這一種系統時,最簡單的方式是: 每一個控制序列點連接到一個基本運算器官上,這個運算器官受它所驅動。它還連接到若干存儲寄存器上,這些寄存器供給運算的數字輸入;同時,又接到另一寄存器上,這個寄存器接受它的輸出。經過一定時間的延滯(延滯時間必須足以完成運算),或者在接收到一個“運算已完成”的信號之后,這個控制序列點就驅動下一個控制序列點,即它的“承接者”(如果運算時間是變量,它的最大值為不定值或者是不能允許的漫長的話,那么,這個過程當然就需要有與這個基本運算器官的另一個增添連接)。按照這樣的連接,以相同的辦法一直作用下去。一直到不需要再操作為止,這就構成了一個無條件的、不重復的計算方式。
如果某些控制序列點連接到兩個“承接者”上面(這叫作“分支點”),那么,就可能產生兩種狀態——A和B,從而得到更錯綜復雜的方式。A狀態使過程沿第一個承接者的途徑繼續下去,B狀態則使過程沿第二個承接者的途徑繼續下去。這個控制序列點,在正常時,是處在A狀態的,但由于它接到兩個存儲寄存器上面,其中的某些情況會使過程從A變為B,或者反過來,從B變為A。比如: 如果在第一個存儲寄存器中出現負號,那就使過程從A轉變到B;如果在第二個存儲寄存器中出現負號,那就使過程從B轉變到A(注意: 存儲寄存器除了存儲數字之外,它還存儲數字的正號或負號,因為這是任一兩值符號的前置符號)。現在,就出現了各種可能性: 這兩個承接者可表示計算的兩個析取分支。走哪個分支,取決于適當預定的數字判據(當“從B到A”是用來恢復進行一項新演算的原始狀態時,則控制“從A到B”)。這兩個待選擇的分支也可能在后來重新統一起來,匯合到與下一個共同的承接者的連接上面。但是,還有一個可能性: 兩個分支之一,比如是被A所控制的那一個,實際上又引回到起初我們所說的那個控制序列點上(就是在這點上分為兩分支的),在這種情況下,我們就遇到一個重復的過程。它一直迭代到發生一定的數字判據為止(這個判據就是從A轉變到B的指令)。當然,這是一種基本的迭代過程。所有這些方法,都是可以互相結合和重疊的。
在這種情況下,正如已經講過的模擬機的插入式控制一樣,電連接的整體,是按照問題的結構而定的,即按照要解算的問題的算式而定,也就是依照使用者的目的而定。因此,這也是一種插入式的控制。在這種方式中,插接的模式可隨解算問題的不同而變化,但是,在解算一個問題的全部過程中,插入方式是固定的(至少在最簡單的裝置中是如此)。
這個方法,可以從許多途徑使它更精細起來。每一個控制序列點可以和好幾個器官連接,可以激勵起超過一次以上的運算。正如在上面講過的模擬機的例子一樣,這種插入連接實際上可以由電磁機械繼電器去控制,而繼電器又可通過紙帶來控制,在計算中所產生的電信號,使紙帶移動。我在這里,就不進一步敘述這種方式所可能產生的各種變化了。
記憶存儲控制
第二種基本的控制方法,是記憶存儲控制,它的進展很快,已經將要取代第一種方法了。這個方法可以敘述如下(這也還是作了若干簡化了的)。
這種控制方式,在形式上和插入控制方法有若干相似之處。但是,控制序列點現在由“指令”所代替了。就體現在這種方式中的大多數情況來說,一個“指令”,在物理意義上是和一個數相同的(指計算機所處理的數,參閱上文)。在一個十進制計算機中,它就是一序列十進制數字(在我們第二章中所舉的例子里,它就是12個帶有或不帶有正號、負號的十進制數字。有時,在標準的數的位置中,包含著一個以上的指令,但這種情況這里不必討論)。
一個指令,必須指出要執行的是哪一種基本運算,這個運算的輸入將從哪一個記憶寄存器中取得,運算后的輸出要送到哪一個記憶寄存器去。要注意,我們已預先假定,所有的記憶寄存器的編號是成系列的,每一記憶寄存器的編號數目,叫作它的“地址”。同時,給各個基本運算編上號碼,也是很便當的。這樣,一個指令,只要簡單地包括運算的編號和記憶寄存器的地址就成了,它表現為一列十進制數字(而且它的順序是固定的)。
這種方式,還有一些變種。但是,在目前的敘述中,它們并不特別重要。比如,一個指令,用上面講過的方法,也可以控制一個以上的運算;也可以指示它所包含的地址,在進入運算過程之前,以某一特定方法加以修改(通常運用的、實際上也是最重要的修改地址的方法,是對各個地址增加一個特定的記憶寄存器)。或者也可以用另外一些方法。如用特別的指令來控制這種修改,或者使一個指令只受上述各個操作中的某一組成部分的影響。
指令的更重要的方面是: 如上面講過的控制序列點的例子一樣,一個指令必須決定它的承接者——是否有分支(參閱上文)。我曾指出過,一個指令通常在物理意義上是和一個數相同的。因此,存儲指令的自然方法(在所控制的解題過程中),是把它存儲在記憶寄存器里。換句話說,每一指令都存儲在記憶中,即在一個規定的記憶寄存器中,也就是在一個確定的地址中。這樣,就給我們對指令承接者的處理,提出了許多條特定的途徑。因此,我們可以規定,如果一個指令的地址在X ,其承接者的指令地址則在X+1(除非指明是逆接的情況)。這里說的“逆接”,是一種“轉移”,它是一種指明承接者在預定地址Y的特殊指令。或者,一個指令中也可以包括“轉移”的子句,以規定它的承接者的地址。至于“分支”,可以很方便地被一個“有條件的轉移”指令所掌握。這種有條件的轉移指令,規定承接者的地址是X或Y。是X,還是Y? 取決于一定的數字條件是否出現——也就是說,一個給定地址Z的數字,是不是負數。這樣的一種指令,必須包含著一個編號,作為這種特殊形式指令的特征(這個特別的數字符號,它在指令中所占的位置,以及它的作用,和上面講過的標志基本運算的符號是一樣的),而且地址X、Y、Z都表現為一序列的十進制數字(見上文所述)。
應該注意本節所講的控制方式和上文講過的插入式控制的重要區別: 插入控制序列點是真實的、物質的對象,它們的插件連接表達了要計算的問題。本節所講的這種控制的指令,則是一種概念上的東西,它儲存在記憶中;記憶中的這一特定部分,表達了要計算的問題。由于這樣,這種控制方式被稱為“記憶存儲控制”。
記憶存儲控制的運算方式
在上述情況下,由于進行全部控制的各項指令都在記憶中,因而能夠取得比以往任何控制方式更高的靈活性。計算機在指令的控制下,能夠從記憶中取出數(或指令),對它進行加工(好像數的運算一般),然后把它歸還到記憶中去(回到它原來的或其他的位置上)。這也就是說,這種方式能夠改變記憶的內容——這就是正常的運算方式。特別是它能夠改變指令(因為指令存在記憶里),改變控制它自己的動作的有關指令,所以,建立所有各種復雜的指令系統都是可能的。在系統中,可以相繼地改變指令,整個計算過程在這樣的控制之下進行。因此,比僅僅是重復過程復雜得多的系統,都是可能辦得到的。雖然這種方法十分勉強和十分復雜,它仍然被廣泛采用了,而且在現代的機械計算——或者更恰當地說,在計算程序——的實踐中,具有非常重要的作用。
當然,指令系統——它意味著要解出的問題和使用者的意圖——是通過把指令“裝放”進記憶里去的辦法來同計算機互通信息。這通常是由預先準備好的紙帶、磁帶或其他相類似的媒介來完成的。
控制的混合方式
上面講過的兩種控制——插入式和記憶存儲式,可以形成各種不同的組合。關于這方面,還可以說幾句。
考慮一臺插入控制的計算機,如果它具有和記憶存儲控制計算機所具有的那種記憶部分,它就可能用一序列數字(以適當的長度)來描述它的插接的全部狀態。這個序列存儲在記憶中,大體上占有幾個數碼的位置,即幾個順序的記憶存儲器。換句話說,它可以從若干個順序的地址中找到這個序列,其中頭一個地址,可以作為這一串地址的縮寫,代表整個序列。記憶部分可以負載幾個這樣的序列,表示幾個不同的插接方案。
此外,計算機也可能是完全的記憶存儲的控制方式。但除這種系統的本來有的指令外(參見上述),還可以有下列三種形式的指示。第一,一種使插接件復位的指令,根據在規定的記憶地址中存儲的數字序列,使插接件復位。第二,一種指令的系統,能夠改變各插接件中的某一定的單項(請注意,上面這兩種指令,都要求插入件必須受電控制裝置——如繼電器,或真空管,或鐵磁芯等的作用)。第三,一種指令,能夠使控制方式從記憶存儲式轉為插入式。
當然,插入式方案還必須能夠指定記憶存儲控制(它可預設為一規定的地址)作為一個控制序列點的承接者(如果在分支的情況下,則作為承接者之一)。