Modula-2

**Modula-2**，是一種通用的結構化程序式程式語言，由尼克勞斯・維爾特在 1978 年至 1985 年間於蘇黎世聯邦理工學院開發。它具有充分的靈活性用於系統編程，和更加廣闊應用領域。特別是，它被設計為以一種直接的方式支援分離編譯和資料抽象。它的很多語法基於了維爾特早先的周知語言 Pascal。

## 歷史

在 1976 年至 1977 年年間，維爾特在 Xerox Palo Alto 研究中心，與一群設計 Alto 電腦的工作夥伴一同工作。1978 年，維爾特在瑞士聯邦理工學院資訊研究所，根據其早期對 Pascal 程式語言、Modula 模組程式語言、及 Alto 電腦的經驗，定義了 Modula-2 語言，他還開始了一個 Lilith 個人電腦計畫。

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 的後繼者。主要的概念是：

1. 模組是分離編譯的編譯單元。
2. 協程是並行處理的基本建造塊。
3. 類型和過程允許存取特定於機器的資料。

Modula-2 提供了（有限的）單處理器並行（監視器、協程和顯式控制轉移）和硬體存取（絕對位址、位操縱和中斷）。它使用了名稱型別系統。Modula-2 語言允許使用一趟編譯器。Gutknecht 和維爾特的這種編譯器大致上比早前的多趟編譯器要快上四倍。

Modula-2 有兩種主要方言：PIM 和 ISO/IEC 10514-1:1996，PIM 得名於 Niklaus Wirth 的著作《Programming in Modula-2》，這本書一共有四個版本，成為方言的是 PIM2（1983 年）、PIM3（1985 年）和 PIM4（1988 年）。

## 例子代碼

下面是 "Hello world" 程式的 Modula-2 原始碼例子：

## 語言元素

### 保留字

PIM 版本 2、3、4 定義了 40 個保留字：

```
AND         ELSIF           LOOP       REPEAT
ARRAY       END             MOD        RETURN
BEGIN       EXIT            MODULE     SET
BY          EXPORT          NOT        THEN
CASE        FOR             OF         TO
CONST       FROM            OR         TYPE
DEFINITION  IF              POINTER    UNTIL
DIV         IMPLEMENTATION  PROCEDURE  VAR
DO          IMPORT          QUALIFIED  WHILE
ELSE        IN              RECORD     WITH
```

### 內建識別碼

PIM 版本 3、4 定義了 29 個內建識別碼：

```
ABS         EXCL            LONGINT    REAL
BITSET      FALSE           LONGREAL   SIZE
BOOLEAN     FLOAT           MAX        TRUE
CAP         HALT            MIN        TRUNC
CARDINAL    HIGH            NIL        VAL
CHAR        INC             ODD
CHR         INCL            ORD
DEC         INTEGER         PROC
```

## 模組

Modula-2 的模組（module），可以用來封裝一組有關的子程式和資料結構，並限制它們對程式其他部份的可見性。模組設計以清晰的方式，實現了 Modula-2 的資料抽象特徵。語言有嚴格的作用域控制。模組的作用域，可以被當作是不可逾越的牆：除了標準識別碼之外，來自外部的物件在模組內是不可見的，除非顯式的匯入它；內部的模組物件在外部是不可見的，除非顯式的匯出它。

Modula-2 程式是由模組組成，其中「程式模組」包含一個 Modula-2 程式的主程式。所有 Modula-2 程式，必須有定義了執行開始之處的一個主程式。在一個單一的程式中，不能有連結在一起的兩個程式模組。「局部模組」是在其他模組內聲明的模組。程式模組和局部模組的起始關鍵字，就是單獨的 `MODULE`。

### 定義模組與實現模組

除了程式模組之外的「全域模組」，都構成自兩個部份：作為介面部份的「定義模組」，它只包含「匯出」（對其他模組可見）的那部份子系統，和同名的「實現模組」，它包含模組內部的工作代碼：

定義模組中可以包含不透明類型聲明，它有如下形式：

它對應的實際類型，對於這個模組的使用者是不可見的。這個類型名字，可以用在定義模組內的其他聲明之中。對於在定義模組中聲明的任何不透明類型，在對應的實現模組中，必須包含它的完全類型聲明。完全類型聲明，必須定義一個指標類型。

### 匯出

假定局部模組 `M1` 匯出物件 `a`、`b`、`c` 和 `P`，可將它們的識別碼列舉於顯式 `EXPORT` 匯出列表之中：

如果加上了可選的關鍵字 `QUALIFIED`，它們以一種有限制的方式給匯出至外部，必須將匯出的這個模組名字用作限定符，並跟隨著物件的名字。這裡的來自模組 `M1` 的物件 `a`、`b`、`c` 和 `P`，在模組 `M1` 外部就叫做 `M1.a`、`M1.b`、`M1.c` 和 `M1.P`。

PIM2 在定義模組中要求顯式的 `EXPORT` 子句；PIM3 從定義模組中刪除了 `EXPORT` 子句，因為發現了它是多餘的。

### 匯入

假定模組 `M2` 包含下列 `IMPORT` 聲明：

然後這意味著模組 `M1` 匯出至它所包圍的程式的外部的物件，現在可以用在模組 `M2` 內部。它們以一種限定方式來參照，也就是 `M1.a`、`M1.b`、`M1.c` 和 `M1.P`。例如：

限定匯出避免了名字衝突：例如，如果另一個模組 `M3` 也匯出了一個物件叫做 `P`，那麼我們仍可以區分這兩個物件，因為 `M1.P` 不同於 `M3.P`。憑藉限定匯出，兩個物件在它們的匯出模組 `M1` 和 `M3` 中都叫做 `P` 是不礙事的。

存在一種可作為替代的方式，它在 Modula-2 編程者中廣泛採用。假定模組 `M3` 是公式化為如下：

然後這意味著模組 `M1` 匯出至外部的物件，可以用在模組 `M3` 內部，但可以用無限定方式來參照匯出的識別碼，也就是 `a`、`b`、`c` 和 `P`。例如：

這種無限定匯入的方法，允許在其匯出模組之外，以同在它們的匯出模組之內一樣簡單的方式，來使用這些變數和其他物件。對於所有這些已經被顯式允許的物件，包圍所有模組的牆變得與它們無關了。當然無限定匯入只在沒有名字衝突時是可用的。

這些匯出和匯入規則，看起來可能是沒有必要的限制和冗餘的。但是它們不只是守衛物件免於不希望的存取，而且還有一個讓人愉悅的副作用，提供了在程式中定義的所有識別碼的自動交叉參照：如果識別碼被一個模組名字所限定，那麼它的定義位於那個模組。否則如果它是無限定的出現的，簡單的回溯尋找，將會要麼遇到這個識別碼的聲明，要麼遇到它出現在一個 `IMPORT` 語句中，指出了它所來自的模組的名字。這個性質在嘗試理解包含很多模組的大型程式時是非常有用的。

## 參見

* Pascal
* Modula
* Modula-3
* Oberon

## 參照

## 圖書

* Wirth, Niklaus. Programming in Modula-2 4th. Berlin Heidelberg: Springer-Verlag. 1988 [2021-06-14]. ISBN 978-0-387-96051-7. doi:10.1007/978-3-642-83565-0. （原始內容存檔於 2021-06-05）.
* King, K. N. Modula-2: A Complete Guide. Burlington, Massachusetts: Jones and Bartlett Publishers. 1 January 1988 [2021-06-14]. ISBN978-0669110913. （原始內容存檔於 2020-02-19）.
* Sutcliffe, Richard J. Modula-2: Abstractions for Data and Programming Structures. Arjay Books. 2004–2005 [2021-06-14]. ISBN978-0-669-11091-3. （原始內容存檔於 2021-01-26）.  Uses ISO-standard Modula-2.
* Gleaves, Richard. Modula-2 for Pascal Programmers. Springer Books on Professional Computing 1st. Switzerland: Springer Nature. 1984 [2021-06-14]. ISBN 978-0-387-96051-7. doi:10.1007/978-1-4613-8531-8. （原始內容存檔於 2021-06-14）.
* Cooper, Doug. Oh My! Modula-2: An Introduction to Programming. New York City, New York: W. W. Norton & Company. 1 September 1990. ISBN 978-0393960099.

## 外部連結

* 官方網站

本條目部分或全部內容出自以 GFDL 授權發佈的《自由線上電腦詞典》（FOLDOC）。