加載時(shí)系統(tǒng)占用模塊空間112640字節(jié)(21%),占堆(heap) 的16128字節(jié)(3%)。系統(tǒng)包括所以下幾個(gè)模塊(見(jiàn)行統(tǒng)計(jì)),如圖3 所示:
?
圖3 - 系統(tǒng)及其模塊
?
?
值得注意的是,該系統(tǒng)在加電或重置時(shí),完成初始化僅需兩秒鐘。這包括文件目錄中垃圾回收掃描。
OBERON編譯器
系統(tǒng)自帶的編譯器采用簡(jiǎn)單的自上而下遞歸下降分析法。用戶(hù)使用ORP.Compile @ 命令即可激活模塊選定的源文本上的編譯器。 包解析器通過(guò)掃描儀輸入各種符號(hào),包括識(shí)別符、數(shù)字和特殊符號(hào)(如BEGIN、END、+等)。該方案已被證明在許多應(yīng)用中有效且均表現(xiàn)不凡。這點(diǎn)在我著的書(shū)《編譯器結(jié)構(gòu)》[6,7] 中有詳細(xì)說(shuō)明。
該包解析器調(diào)用代碼生成程序模塊中的程序。這些程序直接將指令添加在代碼陣列上。如果已知所有分支目的地,向前跳轉(zhuǎn)指令(forwardbranch instructions)在模塊編譯結(jié)束時(shí)則會(huì)提供跳轉(zhuǎn)地址(修正)。
所有可變地址都與基址寄存器關(guān)聯(lián)。這就是用于局部變量(運(yùn)行時(shí)設(shè)置在程序輸入)的R14(堆棧指示器)或用于全局和輸入變量的R13。
基址地址按要求通過(guò)地址保存在寄存器R12 內(nèi)的系統(tǒng)全局模塊表載入。R15 用于RISC 架構(gòu)確定的返回地址(鏈接)。因此,R0-R11 可用于表達(dá)式評(píng)估和傳遞過(guò)程參數(shù)。
整個(gè)編譯器由4 個(gè)相對(duì)較小的有效模塊組成(見(jiàn)行統(tǒng)計(jì)):
?
編譯器占用115912 字節(jié)(22%)的模塊空間和17508 字節(jié)(4%)的堆空間(編譯之前)。其源代碼長(zhǎng)約65KB。編譯器自身的編譯在25 MHzRISC 處理器上只需幾秒鐘[8]。
編譯器通常使用值為NIL 的指示檢查數(shù)組索引和基準(zhǔn)值。如果違反規(guī)定,這會(huì)造成陷阱。這種技術(shù)具有高度的安全性,防止錯(cuò)誤和崩潰。事實(shí)上,只能通過(guò)采用偽模塊SYSTEM 中的操作,即PUT 和COPY,才能防礙系統(tǒng)的完整性。這些操作必須局限于接入器件接口的驅(qū)動(dòng)模塊。在輸入列表中,通過(guò)SYSTEM 很容易識(shí)別它們。整個(gè)系統(tǒng)采用Oberon 編程,無(wú)需使用匯編碼。
我選擇Digilent Spartan-3 開(kāi)發(fā)板是由于其成本低、操作簡(jiǎn)便,這使其適于教育機(jī)構(gòu),以獲得整套課堂教學(xué)套件。一個(gè)重大優(yōu)勢(shì)就是該開(kāi)發(fā)板上有靜態(tài)RAM,使得接口連接非常簡(jiǎn)單直觀(甚至用于字節(jié)選擇)。遺憾的是,所有新開(kāi)發(fā)板均采用動(dòng)態(tài)RAM,雖然存儲(chǔ)空間更大,但接口連接復(fù)雜得多,因此刷新和初始化(校準(zhǔn))需要電路。這一電路與帶靜態(tài)RAM 的整個(gè)處理器一樣復(fù)雜。即使控制器以單片式提供,這有悖于我們的開(kāi)放檢查原則。
最后的想法
40 多年前,C.A.R. Hoare 說(shuō),在科學(xué)技術(shù)的所有分支學(xué)科中,學(xué)生在被要求用實(shí)驗(yàn)嘗試自己的想法之前,容易受到許多示范性設(shè)計(jì)實(shí)例的影響。編程和軟件設(shè)計(jì)與這種明智模式形成了鮮明對(duì)比。這里,在閱讀任何實(shí)例之前,要求學(xué)生從一開(kāi)始就編寫(xiě)程序。
這種可怕事實(shí)的原因就是:幾乎不存在大小合適的示范實(shí)例。因此,我決定稍微修正這種情形,我在1975年編寫(xiě)了《算法與數(shù)據(jù)結(jié)構(gòu)》一書(shū)。隨后(與J. Gut-knecht)負(fù)責(zé)操作系統(tǒng)教學(xué)任務(wù),我設(shè)計(jì)了Oberon 系統(tǒng)(1986-88)。
此后,編程教學(xué)并沒(méi)有明顯提高,而系統(tǒng)的規(guī)模和復(fù)雜性顯著增加。雖然開(kāi)源的努力頗受歡迎,但它并沒(méi)有真正改變這種形勢(shì),因?yàn)榇蠖鄶?shù)程序已經(jīng)建成“運(yùn)行”,但卻沒(méi)有真正投入使用。
我繼續(xù)大膽提議,應(yīng)重新設(shè)計(jì)所有程序,不光是計(jì)算機(jī),還有讀取方式。這些程序應(yīng)是可發(fā)行的。即便這種方法正確而有效,但這是一項(xiàng)比創(chuàng)建可執(zhí)行程序更為艱難的任務(wù)。這意味著,沒(méi)有任何部分必須用匯編碼指定。
忽略在這種“人為因素”的結(jié)果就是,在許多地方,新的應(yīng)用沒(méi)有得到精心設(shè)計(jì),而是通過(guò)消除程序中錯(cuò)誤來(lái)實(shí)現(xiàn),其結(jié)果有時(shí)是令人擔(dān)憂(yōu)的。要做到“易懂”的關(guān)鍵就是堅(jiān)持簡(jiǎn)單性和規(guī)律性,放棄不必要的修飾,避免花里胡哨,正確區(qū)分傳統(tǒng)與便捷。
評(píng)論