本页使用了标题或全文手工转换

Modula-2

维基百科,自由的百科全书
跳到导航 跳到搜索
Modula-2
编程范型指令式结构化模块化数据和方法隐藏英语information hiding并发
语言家族Wirth Modula
設計者尼克劳斯·维尔特
发行时间1978年,​44年前​(1978
型態系統强,静态
系统平台Lilith英语Lilith (computer)AMD 2901英语AMD Am2900
作業系統跨平台
文件扩展名.mod .m2 .def .MOD .DEF .mi .md
網站www.modula2.org
主要實作產品
Niklaus Wirth編写的ETH编译器, GNU Modula-2, ADW Modula-2
衍生副語言
PIM2、PIM3、PIM4、ISO
啟發語言
Modula, Mesa, Pascal, ALGOL W, Euclid英语Euclid (programming language)
影響語言
Modula-3, Oberon, Ada, Fortran, Lua, Seed7英语Seed7, Zonnon英语Zonnon, Modula-GM

Modula-2,是一种通用的结构化过程式编程语言,由尼克劳斯·维尔特在1978年至1985年间于苏黎世联邦理工学院开发。它具有充分的灵活性用于系统编程,和更加广阔应用领域。特别是,它被设计为以一种直接的方式支持分离编译和数据抽象。它的很多语法基于了维尔特早先的周知语言Pascal

历史[编辑]

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

Modula-2語言本身與Lilith結構之設計,都以優雅及簡單為原則,是以Modula-2為Lilith的系統程式語言,而不需用到組譯器,並且以Lilith為Modula-2的組織架構。為此,Modula-2語言不僅要適用於編寫高階的應用程式,也要應適用於編寫低階的與機器相關的編碼程式,用於裝置的操控與儲存體的配置。

Modula-2提供了一些標準程式庫模組,如異常處置、字串處理、輸入/輸出及並行程式設計等,通過重複使用它們來降低語言本身的複雜度。在Lilith計畫從1978年到1988年的整個生命期中,作業系統、繪圖套裝軟體、資料庫系統、網路協議、檔案伺服器,及許多其他系統和應用模組,都是藉著Modula-2發展出來的。

描述[编辑]

Modula-2被设计为显著的类似于Pascal,移除了一些元素和语法歧义,增补了“模块”这个重要概念,并且对多道程序有直接的语言支持。维尔特将Modula-2看作他早期的编程语言PascalModula的后继者[1][2]。主要的概念是:

  1. 模块是分离编译的编译单元。
  2. 协程并发处理的基本建造块。
  3. 类型和过程允许访问特定于机器的数据。

Modula-2提供了(有限的)单处理器并发(监视器协程和显式控制转移)和硬件访问(绝对地址、位操纵和中断)。它使用了名称类型系统英语nominal type system。Modula-2语言允许使用一趟编译器英语One-pass compilerGutknecht英语Jürg Gutknecht和维尔特的这种编译器大致上比早前的多趟编译器英语Multi-pass compiler要快上四倍[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;
  ...

定义模块中可以包含不透明类型英语Opaque data type声明,它有如下形式:

TYPE name;

它对应的实际类型,对于这个模块的用户是不可见的。这个类型名字,可以用在定义模块内的其他声明之中。对于在定义模块中声明的任何不透明类型,在对应的实现模块中,必须包含它的完全类型声明。完全类型声明,必须定义一个指针类型。

导出[编辑]

假定局部模块M1导出对象abcP,可将它们的标识符列举于显式EXPORT导出列表之中:

MODULE M1;
  EXPORT a, b, c, P;
  ...

如果加上了可选的关键字QUALIFIED,它们以一种有限制的方式给导出至外部,必须将导出的这个模块名字用作限定符,并跟随着对象的名字。这里的来自模块M1的对象abcP,在模块M1外部就叫做M1.aM1.bM1.cM1.P

1983年的PIM2,在定义模块中要求显式的EXPORT子句;而1985年的PIM3,从定义模块中删除了EXPORT子句,因为发现了它是多余的。

导入[编辑]

假定模块M2包含下列IMPORT声明:

MODULE M2;
  IMPORT M1;
  ...

然后这意味着模块M1导出至它所包围的程序的外部的对象,现在可以用在模块M2内部。它们以一种限定方式来引用,也就是M1.aM1.bM1.cM1.P。例如:

  ...
  M1.a := 0;
  M1.c := M1.P(M1.a + M1.b);
  ...

限定导出避免了名字冲突:例如,如果另一个模块M3也导出了一个对象叫做P,那么我们仍可以区分这两个对象,因为M1.P不同于M3.P。凭借限定导出,两个对象在它们的导出模块M1M3中都叫做P是不碍事的。

存在一种可作为替代的方式,它在Modula-2编程者中广泛采用。假定模块M3是公式化为如下:

MODULE M3;
  FROM M1 IMPORT a, b, c, P;

然后这意味着模块M1导出至外部的对象,可以用在模块M3内部,但可以用无限定方式来引用导出的标识符,也就是abcP。例如:

  ...
  a := 0;
  c := P(a + b);
  ...

这种无限定导入的方法,允许在其导出模块之外,以同在它们的导出模块之内一样简单的方式,来使用这些变量和其他对象。对于所有这些已经被显式允许的对象,包围所有模块的墙变得与它们无关了。当然无限定导入只在没有名字冲突时是可用的。

这些导出和导入规则,看起来可能是没有必要的限制和冗余的。但是它们不只是守卫对象免于不希望的访问,而且还有一个让人愉悦的副作用,提供了在程序中定义的所有标识符的自动交叉引用:如果标识符被一个模块名字所限定,那么它的定义位于那个模块。否则如果它是无限定的出现的,简单的回溯查找,将会要么遇到这个标识符的声明,要么遇到它出现在一个IMPORT语句中,指出了它所来自的模块的名字。这个性质在尝试理解包含很多模块的大型程序时是非常有用的。

评价[编辑]

Modula-2程式語言有幾項特色,使其在電腦科學的發展過程中,有著功不可沒的功勞。首先,它所提出的電腦架構、語言和作業環境的整合概念,是一項創舉;其次,它強調程式設計師,在使用者介面的設計上,至少需花費同於實作程式設計時所耗費的成本和努力。最後,它提出對抽象化資料的簡化。

Modula-2程式是由上而下的方式發展,其步驟乃是先建立定義資料抽象化介面規格的若干定義模組,在其中宣告其他程式設計師可能會引用到的程式標頭,此後再隨著需要建立對應的實作模組。它们個別分開來編譯,一旦編譯好就不必再改變。

參見[编辑]

引用[编辑]

  1. ^ 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. 
  2. ^ Wirth, Niklaus. History and Goals of Modula-2. Dr. Dobb's Journal (Informa PLC). 18 February 2005 [2021-06-15]. (原始内容存档于2021-04-10). 
  3. ^ Wirth, Niklaus. A Single-pass Modula-2 Compiler for Lilith (PDF). CFB Software. 1 May 1984 [28 January 2019]. (原始内容 (PDF)存档于2021-01-24). 
  4. ^ 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.

图书[编辑]

外部連結[编辑]

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