Modula-2
Modula-2，是一种通用的结构化过程式编程语言，由尼克劳斯·维尔特在1978年至1985年间于苏黎世联邦理工学院开发。它具有充分的灵活性用于系统编程，和更加广阔应用领域。特别是，它被设计为以一种直接的方式支持分离编译和数据抽象。它的很多语法基于了Wirth早先的周知语言Pascal。
Modula-2被设计为显著的类似于Pascal，移除了一些元素和语法歧义，增补了“模块”这个重要概念，并且对多道程序有直接的语言支持。Wirth将Modula-2看作他早期的编程语言Pascal和Modula的后继者。主要的概念是：
Modula-2提供了（有限的）单处理器并发（监视器、协程和显式控制转移）和硬件访问（绝对地址、位操纵和中断）。它使用了。Modula-2语言允许使用。和Wirth的这种编译器大致上比早前的要快上四倍。
Modula-2有两种主要方言：PIM和ISO，PIM得名于Niklaus Wirth的著作《Programming in Modula-2》，这本书一共有四个版本，成为方言的是PIM2、PIM3和PIM4。
下面是"Hello world"程序的Modula-2源代码例子： MODULE Hello; FROM STextIO IMPORT WriteString; BEGIN END Hello. Modula-2的模块（module）可以用来封装一组有关的子程序和数据结构，并限制它们对程序其他部份的可见性。模块设计以清晰的方式实现了Modula-2的数据抽象特征。语言有严格的作用域控制。模块的作用域可以被当作是不可逾越的墙：除了标准标识符之外，来自外部的对象在模块内是不可见的，除非显式的导入它；内部的模块对象在外部是不可见的，除非显式的导出它。
Modula-2程序是由模块组成，其中“程序模块”包含一个Modula-2程序的主程序。所有Modula-2程序必须有定义了执行开始之处的一个程序。类似的，在一个单一的程序中不能有链接在一起的两个程序模块。“局部模块”是在其他模块内声明的模块。程序模块和局部模块的起始关键字就是单独的codice_1。除了程序模块之外的"全局模块"都构成自两个部份：作为接口部份的"定义模块"，它只包含“导出”（对其他模块可见）的那部份子系统，和同名的“实现模块”，它包含模块内部的工作代码：
DEFINITION MODULE GM; IMPLEMENTATION MODULE GM;
定义模块中可以包含声明，它有如下形式：
TYPE name;
它对应的实际类型对于这个模块的用户是不可见的。这个类型名字可以用在定义模块内的其他声明之中。对应的实现模块必须包含在这个定义模块中声明的任何不透明类型的完全的类型声明。完全的类型声明必须定义一个指针类型。
假定局部模块codice_2导出对象codice_3、codice_4、codice_5和codice_6，可将它们的标识符列举于显式codice_7导出列表之中：
MODULE M1;
如果加上了可选的关键字codice_8，它们以一种有限制的方式给导出至外部，必须将导出的这个模块名字用作限定符，并跟随着对象的名字。这里的来自模块codice_2的对象codice_3、codice_4、codice_5和codice_6，在模块codice_2外部就叫做codice_15、codice_16、codice_17和codice_18。
1983年的PIM2，在定义模块中要求显式的codice_7子句；而1985年的PIM3，从定义模块中删除了codice_7子句，因为发现了它是多余的。
假定模块codice_21包含下列codice_22声明： MODULE M2;
然后这意味着模块codice_2导出至它所包围的程序的外部的对象，现在可以用在模块codice_21内部。它们以一种限定方式来引用，也就是codice_15、codice_16、codice_17和codice_18。例如：
限定导出避免了名字冲突：例如，如果另一个模块codice_29也导出了一个对象叫做codice_6，那么我们仍可以区分这两个对象，因为codice_18不同于codice_32。凭借限定导出，两个对象在它们的导出模块codice_2和codice_29中都叫做codice_6是不碍事的。
存在一种可作为替代的方式，它在Modula-2编程者中广泛采用。假定模块codice_29是公式化为如下： MODULE M3; 然后这意味着模块codice_2导出至外部的对象可以用在模块codice_29内部，但可以用无限定方式来引用导出的标识符，也就是codice_3、codice_4、codice_5和codice_6。例如：
这种无限定导入的方法，允许在其导出模块之外，以同在它们的导出模块之内一样简单的方式，来使用这些变量和其他对象。对于所有这些已经被显式允许的对象，包围所有模块的墙变得与它们无关了。当然无限定导入只在没有名字冲突时是可用的。
这些导出和导入规则看起来可能是没有必要的限制和冗余的。但是它们不只是守卫对象免于不希望的访问，而且还有一个让人愉悦的副作用，提供了在程序中定义的所有标识符的自动交叉引用：如果标识符被一个模块名字所限定，那么它的定义位于那个模块。否则如果它是无限定的出现的，简单的回溯查找，将会要么遇到这个标识符的声明，要么遇到它出现在一个codice_22语句中，指出了它所来自的模块的名字。这个性质在尝试理解包含很多模块的大型程序时是非常有用的。
Wirth根據其早期對Pascal、模組程式語言(Modula)或稱為Modula-1程式語言、及Alto電腦的經驗，來定義Modula-2。在1976年至1977年年間，Wirth在Xerox Palo Alto研究中心，與一群設計Alto電腦的工作夥伴一同工作，次年，他在瑞士聯邦理工學院資訊研究所，開始了一個個人電腦計畫。該計畫主要的原則，乃是以Modula-2為Lilith的系統程式語言，而以Lilith為Modula-2的組織架構。
Modula-2之名是根據其3個編譯單元的模組而來，這些模組分別為程式模組（Program Module），定義模組（Definition Module）及執行模組（Implementation Module）。由於不需組譯器(Assembler)，該語言不僅適用於編寫高階的應用程式，也應適用於編寫低階的與機器相關的編碼程式(Machine-Dependent Coding)，用於裝置的操控與儲存體的配置。
該語言本身與Lilith結構之設計，都以優雅及簡單為原則，在整個Lilith計畫的生命期中(1978年-1988年)，作業系統、繪圖套裝軟體、資料庫系統、網路協議、檔案伺服器，及許多其他系統和應用模組，都是藉著Modula-2發展出來的。
Modula-2程式語言有幾項特色，使其在電腦科學的發展過程中，有著功不可沒的功勞。首先，它所提出的電腦架構、語言和作業環境的整合概念，是一項創舉；其次，它強調程式設計師，在使用者介面的設計上，至少需花費同於實作程式設計時所耗費的成本和努力。最後，它提出對抽象化資料的簡化。
Modula-2設計是讓其程式模組得以重複使用(Reuse)。它藉著提供一些標準程式庫，如異常處置(Exception Handling)、字串處理(String Processing)、輸入／輸出(I/O)及並行程式設計(Concurrent Programming)等，來降低語言本身的複雜度。
一個Modula-2的定義模組(Definition Module)，定義抽象化資料(Data Abstraction)的介面規格。一個定義模組，是與其相對應的實作模組(Implementation Module)，個別分開來編譯。一旦編譯好就不必再改變。
程式是由上而下(Top-Down)的方式發展，其步驟乃是先建立若干定義模組，只有那些可能會被其他程式設計師引用到的程式標頭，才會被宣告在定義模組內。之後再隨著需要建立實作模組的部分。每一個實作模組，可在其被呼叫前，對其區域性的資料結構設定初始值。