text: Modula-2，是一種通用的結構化程序式程式設計語言，由尼克勞斯·維爾特在1978年至1985年間於蘇黎世聯邦理工學院開發。它具有充分的靈活性用於系統程式設計，和更加廣闊應用領域。特別是，它被設計為以一種直接的方式支援分離編譯和資料抽象。它的很多語法基於了維爾特早先的周知語言Pascal。歷史.在1976年至1977年年間，維爾特在Xerox Palo Alto研究中心，與一群設計Alto電腦的工作夥伴一同工作。1978年，維爾特在瑞士聯邦理工學院資訊研究所，根據其早期對Pascal程式語言、Modula模組程式語言、及Alto電腦的經驗，定義了Modula-2語言，他還開始了一個個人電腦計畫。Modula-2語言本身與Lilith結構之設計，都以優雅及簡單為原則，是以Modula-2為Lilith的系統程式語言，而不需用到組譯器，並且以Lilith為Modula-2的組織架構。為此，Modula-2語言不僅要適用於編寫高階的應用程式，也要應適用於編寫低階的與機器相關的編碼程式，用於裝置的操控與儲存體的配置。Modula-2提供了一些標準程式庫模組，如異常處置、字串處理、輸入/輸出及並行程式設計等，透過重複使用它們來降低語言本身的複雜度。在Lilith計畫從1978年到1988年的整個生命期中，作業系統、繪圖套裝軟體、資料庫系統、網路協議、檔案伺服器，及許多其他系統和應用模組，都是藉著Modula-2發展出來的。描述.Modula-2被設計為顯著的類似於Pascal，移除了一些元素和語法歧義，增補了“模組”這個重要概念，並且對多道程式有直接的語言支援。維爾特將Modula-2看作他早期的程式語言Pascal和Modula的後繼者。主要的概念是：Modula-2提供了。它使用了。Modula-2語言允許使用。和維爾特的這種編譯器大致上比早前的要快上四倍。Modula-2有兩種主要方言：PIM和ISO/IEC 10514-1:1996，PIM得名於Niklaus Wirth的著作《Programming in Modula-2》，這本書一共有四個版本，成為方言的是PIM2。例子程式碼.下面是"Hello world"程式的Modula-2原始碼例子：MODULE Hello;FROM STextIO IMPORT WriteString;BEGINWriteString("Hello World!");END Hello.語言元素.保留字.PIM版本2、3、4定義了40個保留字：內建識別符號.PIM版本3、4定義了29個內建識別符號：模組.Modula-2的模組，可以用來封裝一組有關的子程式和資料結構，並限制它們對程式其他部份的可見性。模組設計以清晰的方式，實現了Modula-2的資料抽象特徵。語言有嚴格的作用域控制。模組的作用域，可以被當作是不可逾越的牆：除了標準識別符號之外，來自外部的物件在模組內是不可見的，除非顯式的匯入它；內部的模組物件在外部是不可見的，除非顯式的匯出它。Modula-2程式是由模組組成，其中“程式模組”包含一個Modula-2程式的主程式。所有Modula-2程式，必須有定義了執行開始之處的一個主程式。在一個單一的程式中，不能有連結在一起的兩個程式模組。“區域性模組”是在其他模組內宣告的模組。程式模組和區域性模組的起始關鍵字，就是單獨的。定義模組與實現模組.除了程式模組之外的“全域性模組”，都構成自兩個部份：作為介面部份的“定義模組”，它只包含“匯出”的那部份子系統，和同名的“實現模組”，它包含模組內部的工作程式碼：DEFINITION MODULE GM;IMPLEMENTATION MODULE GM;定義模組中可以包含宣告，它有如下形式：TYPE name;它對應的實際型別，對於這個模組的使用者是不可見的。這個型別名字，可以用在定義模組內的其他宣告之中。對於在定義模組中宣告的任何不透明型別，在對應的實現模組中，必須包含它的完全型別宣告。完全型別宣告，必須定義一個指標型別。匯出.假定區域性模組codice_1匯出物件codice_2、codice_3、codice_4和codice_5，可將它們的識別符號列舉於顯式codice_6匯出列表之中：MODULE M1;EXPORT a, b, c, P;如果加上了可選的關鍵字codice_7，它們以一種有限制的方式給匯出至外部，必須將匯出的這個模組名字用作限定符，並跟隨著物件的名字。這裡的來自模組codice_1的物件codice_2、codice_3、codice_4和codice_5，在模組codice_1外部就叫做codice_14、codice_15、codice_16和codice_17。PIM2在定義模組中要求顯式的codice_6子句；PIM3從定義模組中刪除了codice_6子句，因為發現了它是多餘的。匯入.假定模組codice_20包含下列codice_21宣告：MODULE M2;IMPORT M1;然後這意味著模組codice_1匯出至它所包圍的程式的外部的物件，現在可以用在模組codice_20內部。它們以一種限定方式來引用，也就是codice_14、codice_15、codice_16和codice_17。例如：...M1.a := 0;M1.c := M1.P(M1.a + M1.b);限定匯出避免了名字衝突：例如，如果另一個模組codice_28也匯出了一個物件叫做codice_5，那麼我們仍可以區分這兩個物件，因為codice_17不同於codice_31。憑藉限定匯出，兩個物件在它們的匯出模組codice_1和codice_28中都叫做codice_5是不礙事的。存在一種可作為替代的方式，它在Modula-2程式設計者中廣泛採用。假定模組codice_28是公式化為如下：MODULE M3;FROM M1 IMPORT a, b, c, P;然後這意味著模組codice_1匯出至外部的物件，可以用在模組codice_28內部，但可以用無限定方式來引用匯出的識別符號，也就是codice_2、codice_3、codice_4和codice_5。例如：...a := 0;c := P(a + b);這種無限定匯入的方法，允許在其匯出模組之外，以同在它們的匯出模組之內一樣簡單的方式，來使用這些變數和其他物件。對於所有這些已經被顯式允許的物件，包圍所有模組的牆變得與它們無關了。當然無限定匯入只在沒有名字衝突時是可用的。這些匯出和匯入規則，看起來可能是沒有必要的限制和冗餘的。但是它們不只是守衛物件免於不希望的訪問，而且還有一個讓人愉悅的副作用，提供了在程式中定義的所有識別符號的自動交叉引用：如果識別符號被一個模組名字所限定，那麼它的定義位於那個模組。否則如果它是無限定的出現的，簡單的回溯查詢，將會要麼遇到這個識別符號的宣告，要麼遇到它出現在一個codice_21語句中，指出了它所來自的模組的名字。這個性質在嘗試理解包含很多模組的大型程式時是非常有用的。本條目部分或全部內容出自以GFDL授權釋出的《自由線上電腦詞典》。
metadata.dataset: erhwenkuo/wikipedia-zhtw
metadata.title: Modula-2
metadata.url: https://zh.wikipedia.org/wiki?curid=4247676