Modula-2 - Wikiwand
For faster navigation, this Iframe is preloading the Wikiwand page for Modula-2.

Modula-2

维基百科,自由的百科全书

Modula-2
编程范型指令式结构化模块化数据和方法隐藏英语information hiding并发
语言家族Wirth Modula
设计者尼克劳斯·维尔特
发行时间1978年,​43年前​(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
启发语言
ModulaMesaPascalALGOL WEuclid英语Euclid (programming language)
影响语言
Modula-3OberonAdaFortranLuaSeed7英语Seed7Zonnon英语Zonnon、Modula-GM

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

描述

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

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

Modula-2提供了(有限的)单处理器并发(监视器协程和显式控制转移)和硬件访问(绝对地址、位操纵和中断)。它使用了名称类型系统英语nominal type system。Modula-2语言允许使用一趟编译器英语One-pass compilerGutknecht英语Jürg Gutknecht和Wirth的这种编译器大致上比早前的多趟编译器英语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语句中,指出了它所来自的模块的名字。这个性质在尝试理解包含很多模块的大型程序时是非常有用的。

历史

图灵奖获得者Wirth,根据其早期对Pascal、模块编程语言(Modula)或称为Modula-1编程语言、及Alto电脑的经验,来定义Modula-2。在1976年至1977年年间,Wirth在Xerox Palo Alto研究中心,与一群设计Alto电脑的工作伙伴一同工作,次年,他在瑞士联邦理工学院信息研究所,开始了一个Lilith英语Lilith (computer)个人电脑项目。该项目主要的原则,乃是以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)的方式发展,其步骤乃是先创建若干定义模块,只有那些可能会被其他程序员引用到的程序标头,才会被宣告在定义模块内。之后再随着需要创建实现模块的部分。每一个实现模块,可在其被调用前,对其区域性的数据结构设置初始值。

参见

引用

  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. 
  3. ^ Wirth, Niklaus. A Single-pass Modula-2 Compiler for Lilith (PDF). CFB Software. 1 May 1984 [28 January 2019]. 
  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)。

{{bottomLinkPreText}} {{bottomLinkText}}
Modula-2
Listen to this article