Z1:第一臺祖思機的架構與算法

本文是對論文《The Z1: Architecture and Algorithms of Konrad Zuse’s First Computer》的中文翻譯,已征得原作者Raul Rojas的同意。感謝Rojas教授的支持與幫助,感謝在美留學的好友——在英語方面的指導。本人英文和專業(yè)水平有限,不妥之處還請批評指正。

This is a translation of "The Z1: Architecture and Algorithms of Konrad Zuse's First Computer" with the permission of its author Raul Rojas. Many thanks for the kind support and help from Prof. Rojas. And thanks to my friend Suo, who's currently in the US, for helping me with my English. The translation is completed to the best of my knowledge and ability. Any comments or suggestions would be greatly appreciated.


摘要

本文首次給出了對Z1的綜合介紹,它是由德國發(fā)明家康拉德·祖思(Konrad Zuse)1936~1938年期間在柏林建造的機械式計算機。文中對該計算機的主要結構零件、高層架構,及其組件之間的數(shù)據(jù)交互進行了描述。Z1能用浮點數(shù)進行四則運算。從穿孔帶讀入指令。一段程序由一系列算術運算、內(nèi)存讀寫、輸入輸出的指令構成。使用機械式內(nèi)存存儲數(shù)據(jù)。其指令集沒有實現(xiàn)條件分支。

雖然,Z1的架構與祖思在1941年實現(xiàn)的繼電器計算機Z3十分相似,它們之間仍然存在著明顯的差異。Z1和Z3都通過一系列的微指令實現(xiàn)各類操作,但前者用的不是旋轉式開關。Z1用的是數(shù)字增量器(digital incrementer)和一套狀態(tài)位,它們可以轉換成作用于指數(shù)和尾數(shù)單元以及內(nèi)存塊的微指令。計算機里的二進制零件有著立體的機械結構,微指令每次要在12個層片(layer)中指定一個使用。在浮點數(shù)規(guī)格化方面,沒有考慮尾數(shù)為零的異常處理,直到Z3才彌補了這一點。

文中的知識源自對祖思為Z1復制品(位于柏林德國技術博物館)所畫的設計圖、一些信件、筆記本中草圖的仔細研究。盡管這臺計算機從1989年展出至今(停運狀態(tài)),始終沒有關于其體系結構詳細的、高層面的闡述可尋。本文填補了這一空白。

1 康拉德·祖思與Z1

德國發(fā)明家康拉德·祖思在1936~1938年期間建造了他的第一臺計算機注1(1934~1935年期間做過一些小型機械線路的實驗)。在德國,祖思被視為計算機之父,盡管他在第二次世界大戰(zhàn)期間建造的計算機在毀于火災之后才為人所知。祖思的專業(yè)是夏洛騰堡工學院(Technische Hochschule Charlottenburg)(現(xiàn)今的柏林工業(yè)大學)的土木工程。他的第一份工作在亨舍爾公司(Henschel Flugzeugwerke),這家公司恰巧從1933年開始建造軍用飛機[1]。這位25歲的小年輕,負責完成生產(chǎn)飛機部件所需的一大串結構計算。而他在學生時代,就早已開始考慮機械化計算的可能性[2]。所以他在亨舍爾才干了幾個月就辭職,建造機械計算機去了,還開了自己的公司,事實也正是世界上第一家計算機公司。

注1:康拉德·祖思建造計算機的精確年表,來自于他從1946年3月起手記的小本子。本子里記載著,V1建造于1936~1938年間。

在1936~1945年期間,祖思根本停不下來,哪怕被兩次短期地召去前線。每一次都最終被召回柏林,繼續(xù)從事在亨舍爾和自己公司的工作。在這九年間,他建造了如今我們所知的6臺計算機,分別是Z1、Z2、Z3、Z4,以及專業(yè)領域的S1和S2。后四臺建造于第二次世界大戰(zhàn)開始之后。Z4是在世界大戰(zhàn)結束前的幾個月里建好的。祖思一開始給它們的簡稱是V1、V2、V3、V4(取自實驗模型或者說原型(Versuchsmodell)的首字母)。戰(zhàn)爭結束之后,他把V改成了Z,原因很明顯譯者注。V1(也就是后來的Z1)是項迷人的黑科技:它是臺全機械的計算機,卻沒有用齒輪表示十進制(前個世紀的巴貝奇這么干,正在做霍爾瑞斯制表機的IBM也這么干),祖思要建的是一臺全二進制計算機。機器基于的部件里用小桿或金屬板的直線移動表示1,不移動表示0(或者相反,因部件而異)。祖思開發(fā)了新型的機械邏輯門,并在他父母家的客廳里做出第一臺原型。他在自傳里提到了發(fā)明Z1及后續(xù)計算機背后的故事[2]。

譯者注:祖思把V改成Z,是為了避免與韋納·馮·布勞恩(Wernher von Braun)研制的火箭的型號名相混淆。

Z1身為機械,卻竟也是臺現(xiàn)代計算機:基于二進制,使用浮點型表示數(shù)據(jù),并能進行四則運算。從穿孔帶讀入程序(雖然沒有條件分支),計算結果可以寫入(16字大小的)內(nèi)存,也可以從內(nèi)存讀出。機器周期在4Hz左右。

Z1與1941年建成的Z3十分相像,Z3的體系結構在《Annals of the History of Computing》中已有描述[3]。然而,迄今仍沒有對Z1高層架構細節(jié)上的闡述。最初那臺原型機毀于1943年的一場空襲。只幸存了一些機械部件的草圖和照片。20世紀80年代,康拉德·祖思在退休多年之后,在西門子和其他一些德國贊助商的贊助之下,建造了一臺完整的Z1復制品,今藏于柏林的技術博物館(如圖1所示)。有兩名做工程的學生幫著他完成:那幾年間,在德國欣費爾德的自家里,他備好全套圖紙,精心繪制每一個(要從鋼板上切割出來的)機械部件,并親自監(jiān)工。Z1復制品的第一套圖紙繪制于1984年。1986年4月,祖思畫了張時間表,預期能在1987年12月完成機器的建造。1989年,機器移交給柏林博物館的時候,做了不少次運行和算術運算的演示。然而,Z1復制品和之前的原型機一樣,從來都不夠可靠,無法在無人值守的情況下長時間運行。甚至在揭幕儀式上就掛了,祖思花了幾個月才修好。1995年祖思去世之后,這臺機器就再沒有啟動過。

圖1:柏林Z1復制品一瞥(來自Konrad Zuse Internet Archive)。用戶可以在機器周圍轉動視角,可以縮放。此虛擬展示基于成千上萬張緊密排布的照片。

盡管我們有了柏林的Z1復制品,命運卻第二次同我們開了玩笑。除了繪制Z1復制品的圖紙,祖思并沒有正兒八經(jīng)地把有關它從頭至尾的詳盡描述寫出來(他本意想交給當?shù)氐拇髮W來寫)。這事兒本是相當必要的,因為拿復制品和1938年的Z1照片對比,前者明顯地「現(xiàn)代化」了。80年代高精密的機械儀器使祖思得以在建造機器時,把鋼板制成的層片排布得更加緊密。新Z1很明顯比它的前身要小得多。而且有沒有在邏輯和機械上與前身一一對應也不好說,祖思有可能吸收了Z3及其他后續(xù)機器的經(jīng)驗,對復制品做了改進。在1984~1989年間所畫的那套機械圖紙中,光加法單元就出現(xiàn)了至少6種不同的設計方案,散布于5~8個、最終乃至12個機械層片之間注2。祖思沒有留下詳細的書面記錄,我們也就莫名其妙。更糟糕的是,祖思既然第二次建造了Z1,卻還是沒有留下關于它綜合性的邏輯描述。他就像那些著名的鐘表匠,只畫出表的部件,不做過多闡釋——一流的鐘表匠確實也不需要過多的說明。他那兩個學生只幫忙寫了內(nèi)存和穿孔帶讀取器的文檔,已經(jīng)是老天有眼[4]。柏林博物館的參觀者只能看著機器里頭成千上萬的部件驚嘆。驚嘆之余就是絕望,即使專業(yè)的計算機科學家,也難以設想這頭機械怪物內(nèi)部的工作機理。機器就在這兒,但很不幸,只是尸體。

注2:你可以在我們的網(wǎng)頁「Konrad Zuse Internet Archive」上找到Z1復制品的所有圖紙。

圖2:Z1的機械層片。在右側可以看見八片內(nèi)存層片,左側可以看見12片處理器層片。底下的一堆桿子,用來將時鐘周期傳遞到機器的每個角落。

為寫這篇論文,我們仔細研究了Z1的圖紙和祖思記事本里零散的筆記,并在現(xiàn)場對機器做了大量的觀察。這么多年來,Z1復制品都沒有運行,因為里頭的鋼板被壓彎了。我們查閱了超過1100張機器部件的放大圖紙,以及15000頁的筆記本內(nèi)容(盡管里頭只有一小點有關Z1的信息)。我只能看到一段計算機一部分運作的短視頻(于幾近20年前錄制)。慕尼黑的德意志博物館收藏了祖思論文里出現(xiàn)的1079張圖紙,柏林的技術博物館則收藏了314張。幸運的是,一些圖紙里包含著Z1中部分微指令的定義和時序,以及一些祖思一位一位手寫出來的例子。這些例子可能是祖思用以檢驗機器內(nèi)部運算、發(fā)現(xiàn)bug的。這些信息猶如羅塞塔石碑,有了它們,我們得以將Z1的微指令和圖紙聯(lián)系起來,和我們充分理解的繼電器計算機Z3(有全套線路信息[5])聯(lián)系起來。Z3基于與Z1一樣的高層架構,但仍存在一些重要差異。

本文由淺入深:首先,了解一下Z1的分塊結構、機械部件的布局,以及祖思用到的一些機械門的例子。而后,進一步深入Z1的核心零件:時鐘控制的指數(shù)和尾數(shù)加法單元、內(nèi)存、算術運算的微序列器。介紹了機械零件之間如何相互作用,「三明治」式的鋼板布局如何組織計算。研究了乘除法和輸入輸出的過程。最后簡要總結了Z1的歷史地位。

2 分塊結構

Z1是一臺時鐘控制的機器。作為機械設備,其時鐘被細分為4個子周期,以機械部件在4個相互垂直的方向上的移動來表示,如圖3所示(左側「Cycling unit」)。祖思將一次移動稱為一次「銜接(engagement)」。他計劃實現(xiàn)4Hz的時鐘周期,但柏林的復制品始終連1Hz(4銜接/秒)都超不過。以這速度,一次乘法運算要耗時20秒左右。

圖3:根據(jù)1989年的復制品,所得的Z1(1936~1938年)框圖。原Z1的內(nèi)存容量只有16字,而不是64字。穿孔帶由35毫米電影膠卷制成。每一項指令以8比特位編碼。

Z1的諸多特性被后來的Z3所采用。以現(xiàn)在的眼光來看,Z1(見圖3)中最重要的革新如有:

  • 基于完全的二進制架構實現(xiàn)內(nèi)存和處理器。

  • 內(nèi)存與處理器分離。在復制品中,機器大約一半由內(nèi)存和穿孔帶讀取器構成。另一半由處理器、I/O控制臺和微控制單元構成。原Z1的內(nèi)存容量是16字,復制品是64字。

  • 可編程:從穿孔帶讀入8比特長的指令(其中2位表示操作碼譯者注、6位表示內(nèi)存地址,或者以3位表示四則運算和I/O操作的操作碼)。因此指令只有8種:四則運算、內(nèi)存讀寫、從十進制面板讀入數(shù)據(jù)、將結果寄存器里的內(nèi)容顯示到十進制展板。

譯者注:應是指內(nèi)存讀寫的操作碼。

  • 內(nèi)存和處理器中的內(nèi)部數(shù)據(jù)以浮點型表示。于是,處理器分為兩個部分:一部分處理指數(shù),另一部分處理尾數(shù)。位于二進制小數(shù)點后面的尾數(shù)占16個比特。(規(guī)格化的浮點數(shù))小數(shù)點左邊那位永遠是1,不需要存。指數(shù)占7位,以2的補數(shù)形式表示(-64~+63)。用額外的1個比特來存儲浮點數(shù)的符號位。所以,存儲器中的字長為24位(16位尾數(shù)、7位指數(shù)、1位符號位)。

  • 參數(shù)或結果為0的特殊情況(規(guī)格化的尾數(shù)無法表示,它的第一位永遠是1)由浮點型中特殊的指數(shù)值來處理。這一點到了Z3才實現(xiàn),Z1及其復制品都沒有實現(xiàn)。因此,Z1及其復制品都處理不了中間結果有0的情況。祖思知道這一短板,但他留到更易接線的繼電器計算機上去解決。

  • CPU是微代碼結構的:操作被分解成一系列微指令,一個機器周期一條微指令。微指令在算術邏輯單元(ALU)之間產(chǎn)生具體的數(shù)據(jù)流,ALU不停地運作,每個周期都將兩個輸入寄存器里的數(shù)加一遍。

  • 神奇的是,內(nèi)存和處理器可以分別獨立運行:只要穿孔帶給出命令,內(nèi)存就在通信接口寫入或讀取數(shù)據(jù)。處理器也將在執(zhí)行存取操作時在通信接口寫入或讀取??梢躁P閉內(nèi)存而只運行處理器,此時原本來自內(nèi)存的數(shù)據(jù)將變?yōu)?。也可以關了處理器而只運行內(nèi)存。祖思因而可以單獨調試機器的兩個部分。同時運作時,有一根連接兩者周期單元的軸將它們同步起來。

Z1的其他革新與后來Z3中體現(xiàn)出來的想法相似。Z1的指令集與Z3幾乎一樣,但它算不了平方根。Z1利用廢棄的35毫米電影膠卷作為穿孔帶。

圖3展示了Z1復制品的抽象圖。注意機器的兩個主要部分:上半部分是內(nèi)存,下半部分是處理器。每部分都有其自己的周期單元,每個周期進一步分為4個方向上(由箭頭標識)的機械移動。這些移動可以靠分布在計算部件下的杠桿帶動機器的任何部分。一次讀入一條穿孔帶上的指令。指令的持續(xù)時間各不相同。存取操作耗時一個周期,其他操作則需要多個周期。內(nèi)存地址位于8位操作碼的低6位比特中,允許程序員尋址64個地址。

如圖3所示譯者注,內(nèi)存和處理器通過彼此各單元之間的緩存進行通信。在CPU中,尾數(shù)的內(nèi)部表示擴到了20位:二進制小數(shù)點前加兩位(以表示二進制冪21和20),還有兩位表示最低的二進制冪(2-17和2-18),旨在提高CPU中間結果的精度。處理器中20位的尾數(shù)可以表示21~2-18的二進制冪。

譯者注:原文寫的是「圖1」,我覺得是作者筆誤,應為「圖3」。

解碼器從穿孔帶讀取器獲得指令,判斷好操作之后開始按需控制內(nèi)存單元和處理器。(根據(jù)加載指令)將數(shù)從內(nèi)存讀到CPU兩個浮點數(shù)寄存器之一。再根據(jù)另一條加載指令將數(shù)從內(nèi)存讀到另一個CPU寄存器中。這兩個寄存器在處理器里可以相加、相減、相乘或相除。這類操作既涉及尾數(shù)的相加,也涉及指數(shù)的加減(用2的補碼加法器)。乘除結果的符號位由與解碼器直接相連的「符號單元」處理。

穿孔帶上的輸入指令會使機器停止,以便操作人員通過撥動機械面板上的4個十進制位輸入數(shù)據(jù),同時通過一根小桿輸入指數(shù)和符號。而后操作員可以重啟機器。輸出指令也會使機器停止,將結果寄存器中的內(nèi)容顯示到十進制機械面板上,待操作員按下某根小桿,機器重新運行。

圖3中的微序列器和指數(shù)尾數(shù)加法單元共同組成了Z1計算能力的核心。每項算術或I/O操作都被細分為多個「階段(phases)」。而后微序列器開始計數(shù),并在加法單元的12層機械部件中選擇相應層片上合適的微操作。

所以舉例來說,穿孔帶上最小的程序可以是這樣的:1) 從地址1(即第1個CPU寄存器)加載數(shù)字;2) 從地址2(即第2個CPU寄存器)加載數(shù)字;3) 相加;4) 以十進制顯示結果。這個程序因而允許操作員預先定義好一坨運算,把Z1當做簡單的機械計算器來用。當然,這一系列運算可能長得多:可以把內(nèi)存當做存放常量和中間結果的倉庫,編寫自動化的系列運算(在后來的Z4計算機中,做數(shù)學計算的穿孔帶能有兩米長)。

Z1的體系結構可以用如下的現(xiàn)代術語來總結:這是一臺可編程的通用浮點型馮·諾依曼機(處理器和內(nèi)存分離),有著只讀的外部程序,和24位、16字的存儲空間??梢越邮?位數(shù)的十進制數(shù)(以及指數(shù)和符號)作為輸入,然后將轉換為二進制。可以對數(shù)據(jù)進行四則運算。二進制浮點型結果可以轉換回科學記數(shù)法表示的十進制數(shù),方便用戶讀取。指令中不包含條件或無條件分支。也沒有對結果為0的異常處理。每條指令拆解為機器里「硬接線」的微指令。微序列器規(guī)劃著微指令的執(zhí)行。在一個僅存的機器運行的視頻中,它宛若一臺織布機。但它編織的是數(shù)字。

3 機械部件的布局

柏林的Z1復制品布局非常清晰。所有機械部件似乎都以完美的方式布放。我們先前提過,對于處理器,祖思至少設計了6個版本。但是主要部件的相對位置一開始就確定了,大致能反映原Z1的機械布局。主要有兩個部分:分別是的內(nèi)存和處理器,由縫隙隔開(如圖3所示)。事實上,它們分別安裝在帶滾輪的桌子上,可以扯開了進行調試。在水平方向上,可以進一步把機器細分為包含計算部件的上半部分和包含所有同步杠桿的下半部分。參觀者只有彎腰往計算部件下頭看才能看到Z1的「地下世界」。圖4是設計圖里的一張繪稿,展示了處理器中部分計算和同步的層片。請看那12層計算部件和下側區(qū)域的3層杠桿。要理解那些繪稿是有多難,這張圖紙就是個絕好的例子。上面盡管有不少關于各部件尺寸的細節(jié),但幾乎沒有其功用方面的注解。

圖4:Z1(指數(shù)單元)計算和同步層片的設計圖

圖5是祖思畫的Z1復制品俯視圖,展示了邏輯部件的分布,并標注了每個區(qū)域的邏輯功能(這幅草圖在20世紀90年代公開)。在上半部分,我們可以看到3個存儲倉。每個倉在一個層片上可以存儲8個8比特長的字。一個倉有8個機械層片,所以總共能存64字。第一個存儲倉(10a)用來存指數(shù)和符號,后兩個(10b、10c)存低16位的尾數(shù)。用這樣的比特分布存放指數(shù)和尾數(shù),只需構建3個完全一樣的8位存儲倉,簡化了機械結構。

內(nèi)存和處理器之間設有「緩存」(12abc),用于與處理器進行數(shù)據(jù)交互。不能在穿孔帶上直接設常數(shù)。所有的數(shù)據(jù),要么由用戶從十進制輸入面板(圖右側18)輸入,要么是計算機自己算得的中間結果。

圖中的所有單元都僅僅展示了最頂上的一層。切記Z1可是建得猶如一坨機械「三明治」。每一個計算層片都與其上下層片嚴格分離(每一層都有金屬的地板和天花板)。層間的通信靠垂直的小桿實現(xiàn),它們可以把移動傳遞到上層或下層去。畫在表示計算層片的矩形之間的小圓圈就是這些小桿。矩形里那些稍大一點的圓圈代表邏輯操作。我們可以在每個圓圈里找見一個二進制門(縱貫層片,每個圓圈最多有12個門)。根據(jù)此圖,我們可以估算出Z1中邏輯門的數(shù)量。不是所有單元都一樣高,也不是所有層片都布滿著機械部件。保守估計,共有6000個二進制零件組成的門。

圖5:Z1示意圖,展示了其機械構造的分區(qū)。

祖思在圖5中給機器的不同模塊標上號。各模塊的作用如下:

內(nèi)存區(qū)域

  • 11a:6位內(nèi)存地址的解碼器
  • 11b:穿孔帶讀取器和操作碼解碼器
  • 10a:7位指數(shù)和符號的存儲倉
  • 10b、10b:尾數(shù)小數(shù)部分的存儲倉
  • 12abc:加載或存儲操作下與處理器交互的接口

處理器區(qū)域

  • 16:控制和符號單元
  • 13:指數(shù)部分中兩個ALU寄存器的多路復用器
  • 14ab:ALU寄存器的多路復用器,乘除法的1比特雙向移位器
  • 15a:指數(shù)的ALU
  • 15bc:規(guī)格化尾數(shù)的20位ALU(18位用于小數(shù)部分)
  • 17:微代碼控制
  • 18:右側是十進制輸入面板,左側是輸出面板

不難想象這幅示意圖中從上至下的計算流程:數(shù)據(jù)從內(nèi)存出來,進入兩個可尋址的寄存器(我們稱為F和G)。這兩個寄存器是沿著區(qū)域13和14ab分布的。再把它們傳給ALU(15abc)。結果回傳給寄存器F或G(作為結果寄存器),或回傳到內(nèi)存??梢允褂谩阜醋g」(從二進制轉換為十進制)指令將結果顯示為十進制。

下面我們來看看各個模塊更多的細節(jié),集中討論主要的計算部件。

4 機械門

理解Z1機械結構的最好辦法,莫過于搞懂那幾個祖思所用的二進制邏輯門的簡單例子。表示十進制數(shù)的經(jīng)典方式一向是旋鈕表盤。把一個齒輪分為10個扇區(qū)——旋轉齒輪可以從0數(shù)到9。而祖思早在1934年就決定使用二進制系統(tǒng)(他跟著萊布尼茲稱之為「the dyadic system」)。在祖思的技術中,一塊平板有兩個位置(0或1)。可以通過線性移動從一個狀態(tài)轉移到另一個狀態(tài)。邏輯門根據(jù)所要表示的比特值,將移動從一塊板傳遞到另一塊板。這一結構是立體的:由堆疊的平板組成,板間的移動通過垂直放置在平板直角處的圓柱形小桿或者說銷釘實現(xiàn)。

我們來看看三種基本門的例子:合取、析取、否定。其主要思想可以有多種機械實現(xiàn),而有創(chuàng)意如祖思總能畫出適應機器立體結構的最佳方案。圖6譯者注展示了祖思口中的「基本門(elementary gate)」?!甘箘影澹?strong>actor plate)」可以視作機器周期。這塊板循環(huán)地從右向左再向后移動。上面一塊板含著一個數(shù)據(jù)位,起著控制作用。它有1和0兩個位置。貫穿板洞的小桿隨著平板水平移動(自身保持垂直)。如果上面的板處于0位置,使動板的移動就無法傳遞給受動板(actuated plate)(見圖6左)。如果數(shù)據(jù)位處于1位置,使動板的移動就可以傳遞給受動板。這就是康拉德·祖思所謂的「機械繼電器」,就是一個可以閉合機械「電流」的開關。該基本門以此將數(shù)據(jù)位拷貝到受動板,這個數(shù)據(jù)位的移動方向轉了90度。

譯者注:原文「Fig. 5」應為筆誤。

圖6:基本門就是一個開關。如果數(shù)據(jù)位為1,使動板和受動板就建立連接。如果數(shù)據(jù)位為0,連接斷開,使動板的移動就傳遞不了。

圖7展示了這種平板布局的俯視圖??梢钥吹绞箘影迳系亩纯凇>G色的控制板可以將圓圈(小桿)拉上拉下。當小桿處于能被使動板扯動的位置時,受動板(紅色)才可以左右移動。每一張機械俯視圖右側都畫有等效的邏輯開關。數(shù)據(jù)位能開閉邏輯門,推拉使動板(如箭頭所示)。祖思總是習慣把開關畫在0位置,如圖7所示。他習慣讓受動板被使動板推動(圖7右),而不是拉動(圖7左)。至此,要構建一個非門就很簡單了,只需數(shù)據(jù)位處于0時閉合、1時斷開的開關(如圖7底部兩張圖所示)譯者注。

譯者注:相當于與圖6的邏輯相反。

有了機械繼電器,現(xiàn)在可以直接構建余下的邏輯操作了。圖8用抽象符號展示了機器中的必備線路。等效的機械裝置應該不難設想。

圖7:幾種基本門,祖思給出了機械繼電器的抽象符號,把繼電器畫成了開關。習慣上,數(shù)據(jù)位始終畫在0位置。箭頭指示著移動方向。使動板可以往左拉(如圖左)或往右推(如圖右)。機械繼電器的初始位置可以是閉合的(如圖下兩幅圖所示)。這種情況下,輸出與數(shù)據(jù)位相反,繼電器就是非門。
圖8:一些由機械繼電器構建的邏輯門。圖中,最底部的是一個XOR,它可由包含兩塊受動板的機械繼電器實現(xiàn)。等效的機械結構不難設計。

現(xiàn)在誰都可以構建自己的祖思機械計算機了?;A零件就是機械繼電器。可以設計更復雜的連接(比如包含兩塊受動板的繼電器),只是相應的機械結構只能用平板和小桿構建。

構建一臺完整的計算機的關鍵難題是把所有部件相互連接起來。注意數(shù)據(jù)位的移動方向總是與結果位的移動方向正交。每一次完整的邏輯操作都會將機械移動旋轉90度。下一次邏輯操作又把移動旋轉90度,以此類推。四門之后,回到最初的移動方向。這就是為什么祖思用東南西北作為周期單位。在一個機器周期內(nèi),可以運行4層邏輯計算。邏輯門既可簡單如非門,也可復雜如包含兩塊受動板(如XOR)。Z1的時鐘表現(xiàn)為,4次銜接內(nèi)完成一次加法:銜接IV加載參數(shù),銜接I和II計算部分和與進位,銜接III計算最終結果。

輸入的數(shù)據(jù)位在某層上移動,而結果的數(shù)據(jù)位傳到了別層上去。意即,小桿可以在機器的層片之間上下傳遞比特。我們將在加法線路中看到這一點。

至此,圖5的內(nèi)涵就更豐富了:各單元里的圓圈正是祖思抽象符號里的圓圈,并反映著邏輯門的狀態(tài)?,F(xiàn)在,我們可以從機械層面拔高,站在更邏輯的高度探討Z1。

Z1的內(nèi)存

內(nèi)存是目前我們對Z1理解最透徹的部分。Schweier和Saupe曾于20世紀90年代對其有過介紹[4]。Z4——康拉德·祖思于1945年完成的繼電器計算機——使用了一種非常類似的內(nèi)存。Z4的處理器由電話繼電器構建,但其內(nèi)存仍是機械式的,與Z1相似。如今,Z4的機械式內(nèi)存收藏于德意志博物館。在一名學生的輔助下,我們在計算機中仿真出了它的運作。

Z1中數(shù)據(jù)存儲的主要概念,就是用垂直的銷釘?shù)膬蓚€位置來表示比特。一個位置表示0,另一個位置表示1。下圖展示了如何通過在兩個位置之間來回移動銷釘來設置比特值。

圖9:內(nèi)存中的一個機械比特。銷釘放置于0或1的位置。可讀取其位置。

圖9(a)譯者注展示了內(nèi)存中的兩個比特。在步驟9(b)中,縱向的控制板帶著銷釘上移。步驟9(c)中,兩塊橫向的使動板中,下側那塊被銷釘和控制板推動,上側那塊沒被推動。步驟9(d)中,比特位移回到初始位置,而后控制板將它們移到9(a)的位置。從這樣的內(nèi)存中讀取比特的過程具有破壞性。讀取一位之后,必須靠9(d)的回移還原比特。

譯者注:作者沒有在圖中標出abcd,左上為(a),右上為(b),左下為(c),右下為(d)。另,這組插圖有點抽象,我也是盯了好久才看懂,它是俯視圖,黑色的小正方形是銷釘,縱向的長方形是控制板,銷釘在控制板上的長方形洞里移動(兩個位置表示0和1),橫向的兩塊帶尖齒的長方形是使動板。

通過解碼6位地址,尋址字。3位標識8個層片,另外3位標識8個字。每一層的解碼線路是一棵典型的三層繼電器二進制樹,這和Z3中一樣(只是樹的層數(shù)不同)。

我們不再深究機械式內(nèi)存的結構。更多細節(jié)可參見文獻[4]。

Z1的加法單元

戰(zhàn)后,康拉德·祖思在一份文檔里介紹過加法單元,但Z1復制品中的加法單元與之不同。那份文檔[6]中,使用OR、AND和恒等(NOT-XOR)邏輯門處理二進制位。而Z1復制品中,加法單元使用兩個XOR和一個AND。

前兩步計算是:a) 待相加的兩個寄存器按位XOR,保存結果;b) 待相加的兩個寄存器按位AND,保存結果。第三步就是根據(jù)前兩步計算進位。進位設好之后,最后一步就是對進位和第一步XOR的結果進行按位XOR運算。

下面的例子展示了如何用上述步驟完成兩數(shù)的二進制相加。

康拉德·祖思發(fā)明的計算機都使用了「預進位」。比起在各二進制位之間串行地傳遞進位,所有位上的進位可以一步完成。上面的例子就說明了這一過程。第一次XOR產(chǎn)生不考慮進位情況下兩個寄存器之和的中間結果。AND運算產(chǎn)生進位比特:進位要傳到左邊的比特上去,只要這個比特在前一步XOR運算結果是1,進位將繼續(xù)向左傳遞。在示例中,AND運算產(chǎn)生的最低位上的進位造成了三次進位,最后和第一次XOR的結果進行XOR。XOR運算產(chǎn)生的一列連續(xù)的1猶如火車頭,牽引著AND所產(chǎn)生的進位,直到1的鏈條斷裂。

圖10所示就是Z1復制品中的加法線路。圖中展示了a桿和b桿這兩個比特的相加(假設a是寄存器Aa中的第i個比特,b是寄存器Ab中的第i個比特)。使用二進制門1、2、3、4并行進行XOR和AND運算。AND運算作用于5,產(chǎn)生進位ui+1,與此同時,XOR運算用6閉合XOR的比特「鏈」,或讓它保持斷開。7是將XOR的結果傳給上層的輔助門。8和9計算最后一步XOR,完成整個加法。

箭頭標明了各部件的移動。4個方向都上陣了,意即,一次加法運算,從操作數(shù)的加載到結果的生成,需要一整個周期。結果傳遞到e桿——寄存器Ae的第i位。

加法線路位于加法區(qū)域的第1、2、3個層片(如后頭的圖13所示)??道隆ぷ嫠荚跊]有正式受過二進制邏輯學培訓的情況下,就整出了預進位,實在了不得。連第一臺大型電子計算機ENIAC采用的都只是十進制累加器的串行進位。哈佛的Mark I用了預進位,但是十進制。

圖10:Z3的加法單元。從左至右完成運算。首先按位AND和XOR(門1、2、3、4)。銜接II計算進位(門5和6)。銜接III的XOR收尾整個加法運算(門8和9)。

5 Z1的序列器

Z1中的每一項操作都可以分解為一系列微指令。其過程根據(jù)一種叫做「準則(criteria)」的表格實現(xiàn),如圖11所示,表格由成對放置的108塊金屬板組成(在此我們只能看到最頂上——即層片12——的一對板。剩下的位于這兩塊板下面,合共12層)。用10個比特編排表格中的條目(金屬板本身):

  • 比特Op0、Op1和Op2是指令的二進制操作碼
  • 比特S0和S1是條件位,由機器的其他部分設置。舉個例子,當S0=1時,加法就轉換成了減法。
  • 比特Ph0、Ph1、Ph2、Ph3、Ph4用于對一條指令中的微周期(或者說「階段」)計數(shù)。比如,乘法運算消耗20個階段,于是Ph0~Ph4這五個比特在運算過程中從0增長到19。

這10個比特意味著,理論上我們可以定義多達1024種不同的條件或者說情況。一條指令最多可占32個階段。這10個比特(操作碼、條件位、階段)推動金屬銷(圖11中涂灰者),這些金屬銷hold住微控制板以防它們彈到左邊或右邊(如圖所示,每塊板都連著彈簧)。微控制板上分布著各異的齒,這些齒決定著以當前10根控制銷的位置,是否可以阻止板的彈動。每塊控制板都有個「地址」。當這10位控制比特指定了某塊板的地址,它便可以彈到右邊(針對圖11中上側的板)或左邊(針對圖11中下側的板)。

控制板彈到右側會按到4個條件位(A、B、C、D)。金屬板根據(jù)相應準則切割,從而按下A、B、C、D不同的組合。

由于這些板分布于機器的12個層片上, 激活一塊控制板自然也意味著為下一步的操作選好了相應的層片。指數(shù)單元中的微操作可以和尾數(shù)單元的微操作并行開始,畢竟兩塊板可以同時彈動:一塊向左,一塊向右。其實也可以讓兩個不同層片上的板同時朝右彈(右側對應尾數(shù)控制),但機械上的局限限制了這樣的「并行」。

圖11:控制板。板上的齒根據(jù)Op2~Ph0這10個比特所對應的金屬銷(灰色)的位置,hold住板。指定某塊板的「地址」,它便在彈簧的作用下彈到右邊(針對上側的板)或左邊(針對下側的板)。從12層板中指定一塊板的同時意味著選出了執(zhí)行下一步操作的層片。齒狀部分A、B、C或D可以裁剪,從而實現(xiàn)在按下微控制單元里的銷釘后,只執(zhí)行必要的操作。圖中,上側的板已經(jīng)彈到了右側,并按下了A、C、D三根銷釘。

因此控制Z1,就相當于調整金屬板上的齒,以使它們可以響應具體的10比特組合,去作用到左右側的單元上。左側控制著處理器的指數(shù)部分。右側控制著尾數(shù)部分。選項A、B、C、D是互斥的,意即,微控制板只選其一(就是唯一不被按下的那個)。

6 處理器的數(shù)據(jù)通路

圖12展示了Z1的浮點數(shù)處理器。處理器分別有一條處理指數(shù)(圖左)和一條處理尾數(shù)(圖右)的數(shù)據(jù)通路。浮點型寄存器F和G均由記錄指數(shù)的7個比特和記錄尾數(shù)的17個比特構成。指數(shù)-尾數(shù)對(Af,Bf)是浮點寄存器F,(Ag,Bg)是浮點寄存器G。參數(shù)的符號由外部的一個符號單元處理。乘除結果的符號在計算前得出。加減結果的符號在計算后得出。

我們可以從圖12中看到寄存器F和G,以及它們與處理器其他部分的關系。ALU(算術邏輯單元)包含著兩個浮點寄存器:(Aa,Ba)和(Ab,Bb)。它們直接就是ALU的輸入,用于加載數(shù)值,還可以根據(jù)ALU的輸出Ae和Be的總線反饋,保存迭代過程中的中間結果。

Z1中的數(shù)據(jù)總線使用「三態(tài)」模式,意即,諸多輸入都可以推到同一根數(shù)據(jù)線(也是個機械部件)上。不需要「用電」把數(shù)據(jù)線和輸入分離開來,因為根本也沒有電。因著機械部件沒有移動(沒有推動)就代表輸入0,移動(推動)了就代表輸入1,部件之間不存在沖突。如果有兩個部件同時往一根數(shù)據(jù)線上輸入,唯一重要的是確保它們能根據(jù)機器周期按序執(zhí)行(推動只在一個方向上生效)。

圖12:Z1中的處理器數(shù)據(jù)通路。左半部分對應指數(shù)的ALU和寄存器,右半部分對應尾數(shù)的??梢詫⒔Y果Ae和Be反饋給臨時寄存器,可以對它們進行取負值或移位操作。直接將4比特長的十進制數(shù)逐位(每一位占4比特)拷至寄存器Ba。而后對其進行十進制到二進制的轉換。

程序員能接觸到的寄存器只有(Af,Bf)和(Ag,Bg)。它們沒有地址:加載指令第一個加載的寄存器是(Af,Bf),第二個加載的是(Ag,Bg)。加載完兩個寄存器,就可以開始算術運算了。(Af,Bf)同時還是算術運算的結果寄存器。(Ag,Bg)在一次算術運算之后可以隱式加載,并繼續(xù)擔當新一輪算術運算的第二個參數(shù)。這種寄存器的使用方案和Z3相同。但Z3中少了(Ag,Bg)。其主寄存器和輔寄存器之間的協(xié)作比Z1更復雜。

從處理器的數(shù)據(jù)通路可見,獨立的寄存器Aa、Ab、Ba和Bb可以加載不同類型的數(shù)據(jù):來自其他寄存器的值、常數(shù)(+1、-1、3、13)、其他寄存器的取負值、ALU反饋回來的值??梢詫LU的輸出進行取負值或移位操作。以代表與2n相乘的矩形框表示左移n位;以與2n相除表示右移n位。這些矩形框代表具有相應的移位或求補邏輯的機械線路。舉個例子,寄存器Ba和Bb相加的結果存于Be,可以對其進行多種轉換:可以取反(-Be)、可以右移一或兩位(Be/2、Be/4)、或可以左移一或三位(2Be、8Be)。每一種轉換都在組成ALU的機械層片中有著各自對應的層片。有效計算的相關結果將傳回給寄存器Ba或Bb。具體是哪個寄存器,由微控制器指定的、激活相應層片的小桿來指定。計算結果Be也可以直接傳至內(nèi)存單元(圖12沒有畫出相應總線)。

ALU在每個周期內(nèi)都進行一次加法。ALU算完后,擦除各寄存器Aa、Ab、Ba、Bb,可載入反饋值。

圖13:處理器中各項操作的分層式空間布局。Be的移位器位于左側那一摞上。加法單元分布在最左邊那三摞。Bf的移位器以及值為10^-16的二進制數(shù)位于右側那一摞。計算結果通過右側標Res的線傳至內(nèi)存。寄存器Bf和Bg從內(nèi)存獲得值,作為第一個(Op1)和第二個操作數(shù)(Op2)。

寄存器Ba有一項特殊使命,就是將四位十進制的數(shù)轉換成二進制。十進制數(shù)從機械面板輸入,每一位都轉換成4個比特。把這些4比特的組合直接傳進Ba(2-13的位置),將第一組4比特與10相乘,下一組與這個中間結果相加,再與10相乘,以此類推。舉個例子,假設我們想轉換8743這個數(shù),先輸入8并乘以10。然后7與這個結果相加,所得總數(shù)(87)乘以10。4再與結果(870)相加,以此類推。如此實現(xiàn)了一種將十進制輸入轉換為二進制數(shù)的簡單算法。在這一過程中,處理器的指數(shù)部分不斷調整最終浮點結果的指數(shù)。(指數(shù)ALU中常數(shù)13對應213,后文還有對十-二進制轉換算法的詳述。)

圖13還展示了處理器中,尾數(shù)部分數(shù)據(jù)通路各零件的空間分布。機器最左側的模塊由分布在12個層片上的移位器構成。寄存器Bf和Bg(層片5和層片7)直接從右邊的內(nèi)存獲得數(shù)據(jù)。寄存器Be中的結果橫穿層片8回傳至內(nèi)存。寄存器Ba、Bb和Be靠垂直的小桿存儲比特值(在上面這幅處理器的橫截面圖中只能看到一個比特)。ALU分布在兩摞機械上。層片1和層片2完成對Ba和Bb的AND運算和XOR運算。所得結果往右傳,右邊負責完成進位以及最后一步XOR運算,并把結果存儲于Be。結果Be可以回傳、存進內(nèi)存,也可以以圖中的各方式進行移位,并根據(jù)要求回傳給Ba或Bb。有些線路看起來多余(比如將Be載入Ba有兩種方式),但它們是在提供更多的選擇。層片12無條件地將Be載入Ba,層片9則僅在指數(shù)Ae為0時才這么做。圖中,標成綠色的矩形框表示空層片,不承擔計算任務,任由機械部件穿堂而過。Bf和Bf'之間的矩形框包含了Bf做乘法運算時所需的移位器(處理時Bf中的比特從最低一位開始逐位讀入)。

圖14:指數(shù)ALU和尾數(shù)ALU間的通信。

現(xiàn)在你可以想象出這臺機器里的計算流程了:數(shù)據(jù)從寄存器F和G流入機器,填入寄存器A和B。執(zhí)行一次加法或一系列的加減(以實現(xiàn)乘除)運算。在A和B中不斷迭代中間結果直至得到最終結果。最終結果載入寄存器F,而后開始新一輪的計算。

7 算術指令

前文提過,Z1可以進行四則運算。在下面將要討論的表格中,約定用字母「L」表示二進制的1。表格給出了每一項操作所需的一系列微指令,以及在它們的作用下處理器中寄存器之間的數(shù)據(jù)流。一張表總結了加法和減法(用2的補數(shù)),一張表總結了乘法,還有一張表總結了除法。關于兩種I/O操作,也有一張表:十-二進制轉換和二-十進制轉換。表格分為負責指數(shù)的A部分和負責尾數(shù)的B部分。表中各行顯示了寄存器Aa、Ab、Ba、Bb的加載。操作所對應的階段,在標「Ph」的列中給出。條件(Condition)可以在開始時觸發(fā)或禁用某操作。某一行在執(zhí)行時,增量器會設置條件位,或者計算下一個階段(Ph)。

加法/減法

下面的微指令表,既涵蓋了加法的情況,也涵蓋了減法。這兩種操作的關鍵在于,將參與加減的兩個數(shù)進行縮放,以使其二進制指數(shù)相等。假設相加的兩個數(shù)為m1×2a和m2×2b。如果a=b,兩個尾數(shù)就可以直接相加。如果a>b,則較小的那個數(shù)就得重寫為m2×2b-a×2a。第一次相乘,相當于將尾數(shù)m2右移(a-b)位(使尾數(shù)縮?。W屛覀兙驮Om2'=m2×2b-a。相加的兩個數(shù)就變成了m1和m2'。共同的二進制指數(shù)為2a。a<b的情況也類似處理。

圖15:加法和減法的微指令。5個Ph完成一次加法,6個Ph完成一次減法。兩數(shù)就位之后,檢測條件位S0(階段4)。若S0為1,對尾數(shù)相加。若S0為0,同樣是這個階段,尾數(shù)相減。

譯者注:「Ph」原文寫的是「cycle」,即周期,下文也有用「phase」(階段)的,根據(jù)表中信息,統(tǒng)一用「Ph」更直觀,下同。

表中(圖15),先找出兩數(shù)中較大的二進制指數(shù),而后,較小數(shù)的尾數(shù)右移一定位數(shù),至兩者的二進制指數(shù)相等。真正的相加從Ph4開始,由ALU在一個Ph內(nèi)完成。Ph5中,檢測這一結果尾數(shù)是否是規(guī)格化的,如果不是,則通過移位將其規(guī)格化。(在進行減法之后)有可能出現(xiàn)結果尾數(shù)為負的情況,就將該結果取負,負負得正。條件位S3記錄著這一符號的改變,以便于為最終結果進行必要的符號調整。最后,得到規(guī)格化的結果。

穿孔帶讀取器附近的符號單元(見圖5,區(qū)域16)會預先計算結果的符號以及運算的類型。如果我們假設尾數(shù)x和y都是正的,那么對于加減法,(在分配好符號之后)就有如下四種情況。設結果為z:

  1. z = +x +y
  2. z = +x -y
  3. z = -x +y
  4. z = -x –y

對于情況(1)和(4),可由ALU中的加法來處理。情況(1)中,結果為正。情況(4),結果為負。情況(2)和(3)需要做減法。減法的符號在Ph5(圖15)中算得。

加法執(zhí)行如下步驟:

  • 在指數(shù)單元中計算指數(shù)之差?α,
  • 選擇較大的指數(shù),
  • 將較小數(shù)的尾數(shù)右移譯者注譯者注位,
  • 尾數(shù)相加,
  • 將結果規(guī)格化,
  • 結果的符號與兩個參數(shù)相同。

譯者注:原文寫的是左移,根據(jù)上下文,應為右移,暫且視為作者筆誤,下文減法步驟中同。

譯者注:原文寫的是「D」,但表中用的是「?α」,遂糾正,下同。我猜作者在輸了一遍「?α」之后覺得麻煩,打算完稿之后統(tǒng)一替換,結果忘了……全文有不少此類不夠嚴謹?shù)募毠?jié),大抵是由于沒有正式發(fā)表的緣故。

減法執(zhí)行如下步驟:

  • 在指數(shù)單元中計算指數(shù)的之差?α,
  • 選擇較大的指數(shù),
  • 將較小的數(shù)的尾數(shù)右移?α位,
  • 尾數(shù)相減,
  • 將結果規(guī)格化,
  • 結果的符號與絕對值較大的參數(shù)相同。

符號單元預先算得了符號,最終結果的符號需要與它結合得出。

乘法

對于乘法,首先在Ph0,兩數(shù)的指數(shù)相加(準則21,指數(shù)部分)。而后耗時17個Ph,從Bf中二進制尾數(shù)的最低位檢查到最高位(從-16到0)。每一步,寄存器Bf都右移一位。比特位mm記錄著之前從-16的位置被移出來的那一位。如果移出來的是1,把Bg加到(之前剛右移了一位的)中間結果上,否則就把0加上去。這一算法如此計算結果:

Be = Bf0×20×Bg + Bf-1×2-1×Bg + ··· + Bf-16×2-16×Bg

做完乘法之后,如果尾數(shù)大于等于2,就在Ph18中將結果右移一位,使其規(guī)格化。Ph19負責將最終結果寫到數(shù)據(jù)總線上。

圖16:乘法的微指令。乘數(shù)的尾數(shù)存放在(右移)移位寄存器Bf中。被乘數(shù)的尾數(shù)存放在寄存器Bg中。

除法

除法基于所謂的「不恢復余數(shù)法」,耗時21個Ph。從最高位到最低位,逐位算得商的各個比特。首先,在Ph0計算指數(shù)之差,而后計算尾數(shù)的除法。除數(shù)的尾數(shù)存放在寄存器Bg里,被除數(shù)的尾數(shù)存放在Bf。Ph0期間,將余數(shù)初始化至Bf。而后的每個Ph里,在余數(shù)上減去除數(shù)。若結果為正,置結果尾數(shù)的相應位為1。若結果為負,置結果尾數(shù)的相應位為0。如此逐位計算結果的各個位,從位0到位-16。Z1中有一種機制,可以按需對寄存器Bf進行逐位設置。

如果余數(shù)為負,有兩種對付策略。在「恢復余數(shù)法」中,把除數(shù)D加回到余數(shù)(R-D)上,從而重新得到正的余數(shù)R。而后余數(shù)左移一位(相當于除數(shù)右移一位),算法繼續(xù)。在「不恢復余數(shù)法」中,余數(shù)R-D左移一位,加上除數(shù)D。由于前一步中的R-D是負的,左移使他擴大到2R-2D。此時加上除數(shù),得2R-D,相當于R左移之后與D的差,算法得以繼續(xù)。重復這一步驟直至余數(shù)為正,之后我們就又可以減去除數(shù)D了。在下表中,u+2表示二進制冪中,位置2那兒的進位。若此位為1,說明加法的結果為負(2的補數(shù)算法)。

不恢復余數(shù)法是一種計算兩個浮點型尾數(shù)之商的優(yōu)雅算法,它省去了存儲的步驟(一個加法Ph的時耗)。

圖17:除法的微指令。Bf中的被除數(shù)逐位移至一個(左移)移位寄存器中。除數(shù)保存在Bg中。

譯者注:原文寫的是除數(shù)在Bf、被除數(shù)在Bg,又是一處明顯的筆誤。

奇怪的是,Z3在做除法時,會先測試Ba和Bb之差是否可能為負,若為負,就走Ba到Be的一條捷徑總線使減去的除數(shù)無效(丟棄這一結果)。復制品沒有使用這一方法,不恢復余數(shù)法比它優(yōu)雅得多。

8 輸入和輸出

輸入控制臺由4列、每列10塊小盤構成。操作員可以在每一列(從左至右分別為Za3、Za2、Za1、Za0)上撥出數(shù)字0~9。意即,能輸入任意的四位十進制數(shù)。每撥一位數(shù),便相應生成等效的、4比特長的二進制值。因而,該輸入控制臺相當于一張4×10的表,存著10個0~9的二進制值。

而后Z1的處理器負責將各十進制位Za3、Za2、Za1、Za0通過寄存器Ba(在Ba-13的位置,對應冪2-13)傳到數(shù)據(jù)通路上。先輸入Za3(到寄存器Ba),乘以10。再輸入Za2,再乘以10。四個位,皆如是重復。Ph7過后,4位十進制數(shù)的二進制等效值就在Be中誕生了。Ph8,如有需要,將尾數(shù)規(guī)格化。Ph7將常數(shù)13(二進制是LL0L)加到指數(shù)上,以確保在尾數(shù)-13的位置上輸入數(shù)。

用一根小桿設置十進制的指數(shù)。Ph9中,這根小桿所處的位置代表了輸入時要乘多少次10。

圖18:十-二進制轉換的微指令。通過機械設備輸入4位十進制數(shù)。

圖19中的表展示了如何將寄存器Bf中的二進制數(shù)轉換成在輸出面板上顯示的十進制數(shù)。

為免遇到要處理負十進制指數(shù)的情況,先給寄存器Bf中的數(shù)乘上10-6(祖思限制了機器只能操作大于10-6的結果,即便ALU中的中間結果可以更小些)。這在Ph1完成。這一乘法由Z1的乘法運算完成,整個過程中,二-十進制譯者注轉換保持「掛起」。

譯者注:原文寫的十-二進制,目測筆誤。

圖19:二-十進制轉換的微指令。在機械設備上顯示4位十進制數(shù)。

此后,尾數(shù)右移兩位(以使二進制小數(shù)點的左邊有4個比特)。尾數(shù)持續(xù)位移,直到指數(shù)為正,乘3次10。每乘一次,把尾數(shù)的整數(shù)部分拷貝出來(4個比特),把它從尾數(shù)里刪去,并根據(jù)一張表(Ph4~7中的2Be'-8Be'操作)轉換成十進制的形式。各個十進制位(從最高位開始)顯示到輸出面板上。每乘一次10,十進制顯示中的指數(shù)箭頭就左移一格位置。譯者注

譯者注:說實話這一段沒完全看懂,翻譯可能與原意有出入。

9 總結

Z1的原型機毀于1943年12月柏林一場盟軍的空襲中。如今已不可能判定Z1的復制品是否和原型一樣。從幸存的那些照片上看,原型機是個大塊頭,而且不那么「規(guī)則」。此處我們只能相信祖思本人所言。但我覺得,盡管他沒什么理由要在重建的過程中有意識地去「潤色」Z1,記憶卻可能悄悄動著手腳。祖思在1935~1938年間記下的那些筆記看起來與后來的復制品一致。據(jù)他所言,1941建成的Z3和Z1在設計上十分相似。

20世紀80年代,西門子(收購了祖思的計算機公司)為重建Z1提供了資金。在兩名學生的輔助下,祖思在自己家中完成了所有的建造工作。建成之后,為方便起重機把機器吊起來,運送至柏林,結果祖思家樓上拆掉了一部分墻。

重建的Z1是臺優(yōu)雅的計算機,由成千上萬的部件組成,但并沒有多余。比如尾數(shù)ALU的輸出可以僅由兩個移位器實現(xiàn),但祖思設置的那些移位器明顯以較低的代價提升了算術運算的速率。我甚至發(fā)現(xiàn),Z1的處理器比Z3的更優(yōu)雅,它更簡潔,更「原始」。祖思似乎是在采用了更簡單、更可靠的電話繼電器之后,反而在CPU的尺寸上「鋪張浪費」。同樣的事也發(fā)生在Z3若干年后的Z4身上。Z4根本就是大版的Z3,有著大版的指令集,而計算機架構是基本一樣的,就算它的指令更多。機械式的Z1從未能一直正常運行,祖思本人后來也稱之為「一條死胡同」。他曾開玩笑說,1989年Z1的復制品那是相當精確,因為原型機其實不可靠,雖然復制品也可靠不到哪去??缮衿娴氖牵琙4為了節(jié)省繼電器而使用的機械式內(nèi)存卻非??煽?。1950~1955年間,Z4在瑞士的蘇黎世聯(lián)邦理工學院(ETH Zürich)服役,其機械內(nèi)存運行良好[7]

最令我驚訝的是,康拉德·祖思是何等年輕,就對計算機引擎給出了如此優(yōu)雅的設計。在美國,ENIAC或MARK I團隊都是由經(jīng)驗豐富的科學家和電子專家組成的,與此相反,祖思的工作孤立無援,他還沒有什么實際經(jīng)驗。從架構上看,我們今天的計算機進與1938年的祖思機一致,反而與1945年的ENIAC不同。直到后來的EDVAC報告草案,以及馮·諾依曼和圖靈開發(fā)的位串行機中,才引進了更優(yōu)雅的體系結構。約翰·馮·諾依曼(John von Neumann)1926~1929年間居于柏林,是柏林大學最年輕的講師(報酬直接來自學生學費的無薪大學教師)。那些年,康拉德·祖思和馮·諾依曼許能在不經(jīng)意間相遇相知。在那瘋狂席卷、那黑夜籠罩德國之前,柏林本該有著許多的可能。

圖20:祖思早期為Z1復制品設計的草圖之一。日期不明。

參考文獻

[1] Horst Materna, Die Geschichte der Henschel Flugzeug-Werke in Sch?nefeld bei Berlin 1933-1945, Verlag Rockstuhl, Bad Langensalza, 2010.
[2] Zuse, K., Der Computer – Mein Lebenswerk, Springer-Verlag, Berlin, 3rd Edition, 1993.
[3] Rojas, R., "Konrad Zuse's legacy: the architecture of the Z1 and Z3", Annals of the History of Computing, Vol. 19, N. 2, 1997, pp. 5–16.
[4] Ursula Schweier, Dietmar Saupe, "Funktions- und Konstruktionsprinzipien der programmgesteuerten mechanischen Rechenmaschine Z1", Arbeitspapiere der GMD 321, GMD, Sankt Augustin, August 1998.
[5] Rojas, R. (ed.), Die Rechenmaschinen von Konrad Zuse, Springer-Verlag, Berlin, 1998.
[5] Website: Architecture and Simulation of the Z1 Computer, http: http://zuse-z1.zib.de/, last access: July 21st, 2013.
[6] Konrad Zuse, "Rechenvorrichtung aus mechanischen Schaltglieder", Zuse Papers, GMD 019/003 (undated), http://zuse.zib.de/, last access July 21st, 2013.
[7] Bruderer, H.: Konrad Zuse und die Schweiz: Wer hat den Computer erfunden?, Oldenbourg Wissenschaftsverlag, Munich, 2012.
[8] Goldstine, H.: "The Electronic Numerical Integrator and Computer (ENIAC)", Annals of the History of Computing, Vol. 18 , N. 1, 1996, S. 10–16.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容