Modula-2
Modula-2,是一种通用的结构化过程式编程语言,由尼克劳斯·维尔特在1978年至1985年间于苏黎世联邦理工学院开发。它具有充分的灵活性用于系统编程,和更加广阔应用领域。特别是,它被设计为以一种直接的方式支持分离编译和数据抽象。它的很多语法基于了维尔特早先的周知语言Pascal。
编程范型 | 指令式、结构化、模块化、数据和方法隐藏、并发 |
---|---|
语言家族 | Wirth Modula |
設計者 | 尼克劳斯·维尔特 |
发行时间 | 1978年 |
型態系統 | 强,静态 |
系统平台 | Lilith(AMD 2901) |
作業系統 | 跨平台 |
文件扩展名 | .mod .m2 .def .MOD .DEF .mi .md |
網站 | www |
主要實作產品 | |
Niklaus Wirth編写的ETH编译器, GNU Modula-2, ADW Modula-2 | |
衍生副語言 | |
PIM2、PIM3、PIM4、ISO | |
啟發語言 | |
Modula, Mesa, Pascal, ALGOL W, Euclid | |
影響語言 | |
Modula-3, Oberon, Ada, Fortran, Lua, Seed7, Zonnon, Modula-GM |
历史编辑
在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]。主要的概念是:
Modula-2提供了(有限的)单处理器并发(监视器、协程和显式控制转移)和硬件访问(绝对地址、位操纵和中断)。它使用了名称类型系统。Modula-2语言允许使用一趟编译器。Gutknecht和维尔特的这种编译器大致上比早前的多趟编译器要快上四倍[3]。
Modula-2有两种主要方言:PIM和ISO,PIM得名于Niklaus Wirth的著作《Programming in Modula-2》[4],这本书一共有四个版本,成为方言的是PIM2、PIM3和PIM4。
例子代码编辑
下面是"Hello world"程序的Modula-2源代码例子:
MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
WriteString("Hello World!");
END Hello.
模块编辑
Modula-2的模块(module),可以用来封装一组有关的子程序和数据结构,并限制它们对程序其他部份的可见性。模块设计以清晰的方式,实现了Modula-2的数据抽象特征。语言有严格的作用域控制。模块的作用域,可以被当作是不可逾越的墙:除了标准标识符之外,来自外部的对象在模块内是不可见的,除非显式的导入它;内部的模块对象在外部是不可见的,除非显式的导出它。
Modula-2程序是由模块组成,其中“程序模块”包含一个Modula-2程序的主程序。所有Modula-2程序,必须有定义了执行开始之处的一个主程序。在一个单一的程序中,不能有链接在一起的两个程序模块。“局部模块”是在其他模块内声明的模块。程序模块和局部模块的起始关键字,就是单独的MODULE
。
定义模块与实现模块编辑
除了程序模块之外的“全局模块”,都构成自两个部份:作为接口部份的“定义模块”,它只包含“导出”(对其他模块可见)的那部份子系统,和同名的“实现模块”,它包含模块内部的工作代码:
DEFINITION MODULE GM;
...
IMPLEMENTATION MODULE GM;
...
定义模块中可以包含不透明类型声明,它有如下形式:
TYPE name;
它对应的实际类型,对于这个模块的用户是不可见的。这个类型名字,可以用在定义模块内的其他声明之中。对于在定义模块中声明的任何不透明类型,在对应的实现模块中,必须包含它的完全类型声明。完全类型声明,必须定义一个指针类型。
导出编辑
假定局部模块M1
导出对象a
、b
、c
和P
,可将它们的标识符列举于显式EXPORT
导出列表之中:
MODULE M1;
EXPORT a, b, c, P;
...
如果加上了可选的关键字QUALIFIED
,它们以一种有限制的方式给导出至外部,必须将导出的这个模块名字用作限定符,并跟随着对象的名字。这里的来自模块M1
的对象a
、b
、c
和P
,在模块M1
外部就叫做M1.a
、M1.b
、M1.c
和M1.P
。
1983年的PIM2,在定义模块中要求显式的EXPORT
子句;而1985年的PIM3,从定义模块中删除了EXPORT
子句,因为发现了它是多余的。
导入编辑
假定模块M2
包含下列IMPORT
声明:
MODULE M2;
IMPORT M1;
...
然后这意味着模块M1
导出至它所包围的程序的外部的对象,现在可以用在模块M2
内部。它们以一种限定方式来引用,也就是M1.a
、M1.b
、M1.c
和M1.P
。例如:
...
M1.a := 0;
M1.c := M1.P(M1.a + M1.b);
...
限定导出避免了名字冲突:例如,如果另一个模块M3
也导出了一个对象叫做P
,那么我们仍可以区分这两个对象,因为M1.P
不同于M3.P
。凭借限定导出,两个对象在它们的导出模块M1
和M3
中都叫做P
是不碍事的。
存在一种可作为替代的方式,它在Modula-2编程者中广泛采用。假定模块M3
是公式化为如下:
MODULE M3;
FROM M1 IMPORT a, b, c, P;
然后这意味着模块M1
导出至外部的对象,可以用在模块M3
内部,但可以用无限定方式来引用导出的标识符,也就是a
、b
、c
和P
。例如:
...
a := 0;
c := P(a + b);
...
这种无限定导入的方法,允许在其导出模块之外,以同在它们的导出模块之内一样简单的方式,来使用这些变量和其他对象。对于所有这些已经被显式允许的对象,包围所有模块的墙变得与它们无关了。当然无限定导入只在没有名字冲突时是可用的。
这些导出和导入规则,看起来可能是没有必要的限制和冗余的。但是它们不只是守卫对象免于不希望的访问,而且还有一个让人愉悦的副作用,提供了在程序中定义的所有标识符的自动交叉引用:如果标识符被一个模块名字所限定,那么它的定义位于那个模块。否则如果它是无限定的出现的,简单的回溯查找,将会要么遇到这个标识符的声明,要么遇到它出现在一个IMPORT
语句中,指出了它所来自的模块的名字。这个性质在尝试理解包含很多模块的大型程序时是非常有用的。
评价编辑
Modula-2程式語言有幾項特色,使其在電腦科學的發展過程中,有著功不可沒的功勞。首先,它所提出的電腦架構、語言和作業環境的整合概念,是一項創舉;其次,它強調程式設計師,在使用者介面的設計上,至少需花費同於實作程式設計時所耗費的成本和努力。最後,它提出對抽象化資料的簡化。
Modula-2程式是由上而下的方式發展,其步驟乃是先建立定義資料抽象化介面規格的若干定義模組,在其中宣告其他程式設計師可能會引用到的程式標頭,此後再隨著需要建立對應的實作模組。它们個別分開來編譯,一旦編譯好就不必再改變。
參見编辑
引用编辑
- ^ Wirth, Niklaus. Pascal and its Successors. Broy, Manfred; Denert, Ernst (编). Software Pioneers: Contributions to Software Engineering. Berlin, Heidelberg: Springer-Verlag. 2002: 108–120. ISBN 978-3-642-59412-0. doi:10.1007/978-3-642-59412-0.
- ^ Wirth, Niklaus. History and Goals of Modula-2. Dr. Dobb's Journal (Informa PLC). 18 February 2005 [2021-06-15]. (原始内容存档于2021-04-10).
- ^ Wirth, Niklaus. A Single-pass Modula-2 Compiler for Lilith (PDF). CFB Software. 1 May 1984 [28 January 2019]. (原始内容 (PDF)存档于2021-01-24).
- ^ Wirth, Niklaus. Programming in Modula-2 4th. Berlin, Heidelberg: Springer. 1988. ISBN 978-3-642-83565-0. doi:10.1007/978-3-642-83565-0. Page 4.
图书编辑
- 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]. ISBN 978-0669110913. (原始内容存档于2020-02-19).
- Sutcliffe, Richard J. Modula-2: Abstractions for Data and Programming Structures. Arjay Books. 2004–2005 [2021-06-14]. ISBN 978-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.