跳转到内容

Modula-2:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
第114行: 第114行:
==引用==
==引用==
{{reflist}}
{{reflist}}

== 图书 ==
*{{cite book |last=Wirth |first=Niklaus |author-link=Niklaus Wirth |date=1988 |title=Programming in Modula-2 |edition=4th |url=https://link.springer.com/book/10.1007/978-3-642-83565-0 |location=[[Berlin]] [[Heidelberg]] |publisher=[[Springer-Verlag]] |doi=10.1007/978-3-642-83565-0 |isbn=978-0-387-96051-7}}
*{{cite book |last=King |first=K. N. |date=1 January 1988 |title=Modula-2: A Complete Guide |url=http://knking.com/books/modula2/ |location=[[Burlington, Massachusetts]] |publisher=Jones and Bartlett Publishers |isbn=978-0669110913}}
*{{cite book |last=Sutcliffe |first=Richard J. |date=2004–2005 |title=Modula-2: Abstractions for Data and Programming Structures |url=http://www.arjay.bc.ca/Modula-2/Text/ |publisher=Arjay Books |isbn=978-0-669-11091-3}} Uses ISO-standard Modula-2.
*{{cite book |last=Gleaves |first=Richard |date=1984 |title=Modula-2 for Pascal Programmers |series=Springer Books on Professional Computing |edition=1st |url=https://link.springer.com/book/10.1007%2F978-1-4613-8531-8 |location=Switzerland |publisher=Springer Nature |doi=10.1007/978-1-4613-8531-8 |isbn=978-0-387-96051-7}}
*{{cite book |last=Cooper |first=Doug |date=1 September 1990 |title=Oh My! Modula-2: An Introduction to Programming |location=[[New York City]], [[New York (state)|New York]] |publisher=[[W. W. Norton & Company]] |isbn=978-0393960099}}


== 外部連結 ==
== 外部連結 ==

2021年6月14日 (一) 11:57的版本

Modula-2
编程范型指令式结构化模块化数据和方法隐藏英语information hiding并发
設計者尼克劳斯·维尔特
发行时间1978年
型態系統强,静态
系统平台Lilith英语Lilith (computer)AMD 2901英语AMD Am2900
操作系统跨平台
文件扩展名.mod .m2 .def .MOD .DEF .mi .md
主要實作產品
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,是由尼克劳斯·维尔特(Niklaus Wirth)提出的通用的过程式语言,具有充分的灵活性用于系统编程,和更加广阔应用领域。特别是,它被设计用来一种直接的方式支持分离的编译和数据抽象。它的很多语法是基于了Wirth早先的周知语言Pascal。Modula-2被设计为显著的类似于Pascal,移除了一些元素和语法歧义,增补了“模块”这个重要概念,并且对多道程序有直接的语言支持。

描述

Modula-2语言允许使用一趟编译器英语One-pass compiler。Gutknecht和Wirth的这种编译器大致上比早前的多趟编译器英语Multi-pass compiler要快上四倍[1]

下面是"Hello world"程序的源代码例子:

MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
  WriteString("Hello World!");
END Hello.

Modula-2的模块(module)可以用来封装一组有关的子程序和数据结构,并限制它们对程序其他部份的可见性。模块设计以清晰的方式实现了Modula-2的数据抽象特征。Modula-2程序是由模块组成,每个模块构成自两个部份:作为接口部份的"定义模块",它只包含“导出”的那部份子系统(对其他模块可见),和“实现模块”,它包含模块内部的工作代码。

语言有严格的作用域控制。模块的作用域可以被当作是不可逾越的墙:在标准标识符之外,来自外部的对象在模块内是不可见的,除非显式的导入它;内部的模块对象在外部是不可见的,除非显式的导出它。

假定模块M1导出对象abcP,通过列举它们的标识符于显式导出列表之中:

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

然后来自模块M1的对象abcP,在模块M1外部就叫做M1.aM1.bM1.cM1.P。它们以一种有限制的方式给导出至外部(假定模块M1是全局的)。导出的模块名字比如M1,被用作限定符并跟随着对象的名字。

假定模块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编程者中广泛采用。假定模块M4是公式化为如下:

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

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

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

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

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

语言提供了(有限的)单处理器并发(监视器协程和显式控制转移)和硬件访问(绝对地址、位操纵和中断)。它使用了名称类型系统英语nominal type system

历史

图灵奖获得者Wirth,根據其早期對Pascal、模組程式語言(Modula)或稱為Modula-1程式語言、及Alto電腦的經驗,來定義Modula-2。在1976至1977年間,Wirth在Xerox Palo Alto研究中心,與一群設計Alto電腦的工作夥伴一同工作,次年,他在瑞士聯邦理工學院資訊研究所,開始了一個Lilith個人電腦計畫。該計畫主要的原則乃是以Modula-2為Lilith的系統程式語言,而以Lilith為Modula-2的組織架構。由於不需組譯器(Assembler),該語言不僅適用於編寫高階的應用程式,也應適用於編寫低階,與機器相關的編碼程式(Machine-Dependent Coding),用裝置的操控與儲存體的配置。

該語言本身與Lilith結構之設計,都以優雅及簡單為原則,在整個Lilith計畫的生命期中(1978-1988),作業系統、繪圖套裝軟體、資料庫系統、網路協議、檔案伺服器及許多其他系統和應用模組都是藉著Modula-2發展出來的。

特征

Modula-2設計是讓其程式模組得以重複使用(Reuse)。它藉著提供一些標準程式庫,如異常處置(Exception Handling)、字串處理(String Processing)、輸入/輸出(I/O)及並行程式設計(Concurrent Programming)等,來降低語言本身的複雜度。

一個Modula-2的定義模組(Definition Module),定義抽象化資料(Data Abstraction)的介面規格。一個定義模組,是與其相對應的實作模組(Implementation Module),個別分開來編譯。一旦編譯好就不必再改變。一個定義模組(Definition Module)包含對常數、類型(Type)、變數及程序標頭的宣告。只有那些可能會被其他程式設計師引用到的程式標頭,才會被宣告在定義模組內。那些相對應的執行模組,包括區域性的常數、類型、變數宣告;以及外部程序和內部實作所需用到的程序定義。

程式是由上而下(Top-Down)的方式發展,其步驟乃是先建立若干定義模組,之後再隨著需要建立實作模組的部分。每一個實作模組,可在其被呼叫前對其區域性的資料結構設定初始值。Modula-2也需偵測在實作模組內的資料是否已過時而導致資料的不一致。

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

參見

引用

  1. ^ Wirth, Niklaus. A Single-pass Modula-2 Compiler for Lilith (PDF). CFB Software. 1 May 1984 [28 January 2019]. 

图书

外部連結

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