Modula-2
Modula-2 is a structured, procedural programming language developed between 1977 and 1985 by Niklaus Wirth at ETH Zurich. It was created as the language for the operating system and application software of the Lilith personal workstation. It was later used for programming outside the context of the Lilith.
Wirth viewed Modula-2 as a successor to his earlier programming languages Pascal and Modula. The principal concepts are:
- The module as a compilation unit for separate compilation
- The coroutine as the basic building block for concurrent processes
- Types and procedures that allow access to machine-specific data.
Modula-2 was followed by Modula-3 and later the Oberon series of languages.
Description
Modula-2 is a general purpose procedural language, sufficiently flexible to do systems programming, but with much broader application. In particular, it was designed to support separate compilation and data abstraction in a straightforward way. Much of the syntax is based on Wirth's earlier and better-known language, Pascal. Modula-2 was designed to be broadly similar to Pascal, with some elements and syntactic ambiguities removed and the important addition of the module concept, and direct language support for multiprogramming.The language allows compilation in a single pass, and in a compiler of Gutknecht and Wirth was about four times faster than earlier multi-pass compilers.
Here is an example of the source code for the "Hello world" program:
MODULE Hello;
FROM STextIO IMPORT WriteString;
BEGIN
WriteString;
END Hello.
The Modula-2 module may be used to encapsulate a set of related subprograms and data structures, and restrict their visibility from other portions of the program. The module design implemented the data abstraction feature of Modula-2 in a very clean way. Modula-2 programs are composed of modules, each of which is made up of two parts: a definition module, the interface portion, which contains only those parts of the subsystem that are exported, and an implementation module, which contains the working code that is internal to the module.
The language has strict scope control. In particular the scope of a module can be considered as an impenetrable wall: Except for standard identifiers no object from the outer world is visible inside a module unless explicitly imported; no internal module object is visible from the outside unless explicitly exported.
Suppose module M1 exports objects a, b, c, and P by enumerating its identifiers in an explicit export list
DEFINITION MODULE M1;
EXPORT QUALIFIED a, b, c, P;
...
Then the objects a, b,c, and P from module M1 become now known outside module M1 as M1.a, M1.b, M1.c, and M1.P. They are exported in a qualified manner to the universe. The exporting module's name, i.e. M1, is used as a qualifier followed by the object's name.
Suppose module M2 contains the following IMPORT declaration
MODULE M2;
IMPORT M1;
...
Then this means that the objects exported by module M1 to the universe of its enclosing program can now be used inside module M2. They are referenced in a qualified manner like this: M1.a, M1.b, M1.c, and M1.P. Example:
...
M1.a := 0;
M1.c := M1.P;
...
Qualified export avoids name clashes: For instance, if another module M3 would also export an object called P, then we can still distinguish the two objects, since M1.P differs from M3.P. Thanks to the qualified export it does not matter that both objects are called P inside their exporting modules M1 and M3.
There is an alternative technique available, which is in wide use by Modula-2 programmers. Suppose module M4 is formulated as this
MODULE M4;
FROM M1 IMPORT a, b, c, P;
Then this means that objects exported by module M1 to the universe can again be used inside module M4, but now by mere references to the exported identifiers in an "unqualified" manner like this: a, b, c, and P. Example:
...
a := 0;
c := P;
...
This technique of unqualifying import allows use of variables and other objects outside their exporting module in exactly the same simple, i.e. unqualified, manner as inside the exporting module. The walls surrounding all modules have now become irrelevant for all those objects for which this has been explicitly allowed. Of course unqualifying import is only usable if there are no name clashes.
These export and import rules may seem unnecessarily restrictive and verbose. But they do not only safeguard objects against unwanted access, but also have the pleasant side-effect of providing automatic cross-referencing of the definition of every identifier in a program: if the identifier is qualified by a module name, then the definition comes from that module. Otherwise if it occurs unqualified, simply search backwards, and you will either encounter a declaration of that identifier, or its occurrence in an IMPORT statement which names the module it comes from. This property becomes very useful when trying to understand large programs containing many modules.
The language provides for single-processor concurrency and for hardware access. It uses a nominal type system.
Dialects
There are two major dialects of Modula-2. The first is PIM, named after the book"Programming in Modula-2" by Niklaus Wirth. There were three major editions of PIM,
the second, third and fourth editions, each describing slight variants of the
language. The second major dialect is ISO, from the standardization effort by the
International Organization for Standardization. Here are a few of the differences amongst them.
- PIM2
- * Required explicit EXPORT clause in definition modules.
- * Function SIZE needs to be imported from module SYSTEM
- PIM3
- * Removed the EXPORT clause from definition modules following the observation that everything within a definition module defines the interface to that module, hence the EXPORT clause was redundant.
- * Function SIZE is pervasive
- PIM4
- * Specified the behaviour of the MOD operator when the operands are negative.
- * Required all ARRAY OF CHAR strings to be terminated by ASCII NUL, even if the string fits exactly into its array.
- ISO
- * ISO Modula-2 resolved most of the ambiguities in PIM Modula-2. It added the data types COMPLEX and LONGCOMPLEX, exceptions, module termination and a complete standard I/O library. There are numerous minor differences and clarifications.
Supersets
- PIM supersets
- * , extended with Oberon-like extensible records
- * Modula-2+, extended with preemptive threads and exceptions
- * , parallel extension
- * , another parallel extension
- * Modula-Prolog, adding a Prolog layer
- * Modula/R, with relational database extensions
- * Modula-GM, extensions for embedded systems
- ISO supersets
- * ISO10514-2, adding an object-oriented programming layer
- * ISO10514-3, adding a generics layer
- IEC supersets
- * , extended with IEC1131 constructs for embedded development
Derivatives
- Modula-3, developed by a team of ex-Xerox employees who had moved to DEC and Olivetti
- Oberon, developed at ETH Zürich for System Oberon .
- Oberon-2, Oberon with OO extensions
- Active Oberon, yet another object-oriented Extension of Oberon, developed also at ETH with the main objective to support parallel programming on multiprocessor and multicore systems.
- Parallaxis, a language for machine-independent data-parallel programming
- Umbriel, developed by Pat Terry as a teaching language
- YAFL, a research language by Darius Blasband
Language elements
Reserved words
PIM defines the following 40 reserved words:
AND ELSIF LOOP REPEAT
ARRAY END MOD RETURN
BEGIN EXIT MODULE SET
BY EXPORT NOT THEN
CASE FOR OF TO
CONST FROM OR TYPE
DEFINITION IF POINTER UNTIL
DIV IMPLEMENTATION PROCEDURE VAR
DO IMPORT QUALIFIED WHILE
ELSE IN RECORD WITH
Built-in identifiers
PIM defines the following 29 built-in identifiers:
ABS EXCL LONGINT REAL
BITSET FALSE LONGREAL SIZE
BOOLEAN FLOAT MAX TRUE
CAP HALT MIN TRUNC
CARDINAL HIGH NIL VAL
CHAR INC ODD
CHR INCL ORD
DEC INTEGER PROC
Use in embedded systems
Cambridge Modula-2
Cambridge Modula-2 by Cambridge Microprocessor Systems is based on a subset of PIM4 with language extensions for embedded development. The compiler runs on MS-DOS and it generates code for M68k-based embedded microcontrollers running the MINOS operating system.Mod51
Mod51 by Mandeno Granville Electronics is based on ISO Modula-2 with language extensions for embedded development following IEC1131, an industry standard for programmable logic controllers closely related to Modula-2. The Mod51 compiler generates standalone code for 80C51 based microcontrollers.Modula-GM
, then a subsidiary of GM Hughes Electronics, developed a version of Modula-2 for embedded control systems starting in 1985. Delco named it Modula-GM. It was the first high level language used to replace machine language code for embedded systems in Delco's engine control units. This was significant because Delco was producing over 28,000 ECUs per day in 1988 for GM; this was then the world's largest producer of ECUs. The first experimental use of Modula-GM in an embedded controller was in the 1985 Antilock Braking System Controller which was based on the Motorola 68xxx microprocessor, and in 1993 Gen-4 ECU used by the CART and IRL teams. The first production use of Modula-GM was its use in GM trucks starting with the 1990 model year VCM used to manage GM Powertrain's Vortec engines. Modula-GM was also used on all ECUs for GM's 90° Buick V6 family 3800 Series II used in the 1997-2005 model year Buick Park Avenue. The Modula-GM compilers and associated software management tools were sourced by Delco from Intermetrics.Modula-2 was selected as the basis for Delco's high level language because of its many strengths over other alternative language choices in 1986. After Delco Electronics was spun off from GM to form Delphi in 1997, global sourcing required that a non-proprietary high-level software language be used. ECU embedded software now developed at Delphi is compiled with commercial C compilers.
Russian GPS satellites
According to the Modula-2 article in the Russian Wikipedia, all satellites of the Russian GPS framework GLONASS are programmed in Modula-2.Compilers
- Modula-2 for MINIX
- ADW Modula-2 for Windows, ISO compliant, ISO/IEC 10514-1, ISO/IEC 10514-2, ISO/IEC 10514-3
- for Amiga OS 4.0/PPC
- for various micro-controllers and embedded MINOS operating system
- Fitted Software Tools Modula-2 for DOS
- for BSD, Linux, OS/2 and Solaris - ISO compliant, as of July 30, 2014, is down
- for.NET
- for GCC platforms, version 1.0 released December 11, 2010; PIM2, PIM3, PIM4, and ISO compliant
- for Amiga
- by N. Wirth and collaborators from ETH Zurich, platform independent, generates M-code for virtual machine
- by N. Wirth and collaborators from ETH Zurich for Macintosh, but Classic only
- for the Intel 80x51 micro-controller family, ISO compliant, IEC1132 extensions
- for Atari ST computers by T. Tempelmann. Documentation only in German language.
- Reference compiler for Modula-2 R10
- for OpenVMS, both VAX and Alpha, ISO compliant
- for Windows and Linux, ISO compliant, TopSpeed compatible library
- ORCA/Modula-2, a compiler available for the Apple Programmer's Workshop, for the Apple IIgs
- for Macintosh, both Classic and Mac OS X, ISO compliant
- for various platforms, PIM compliant
- TDI Modula-2 for Atari ST from TDI Software, Inc.
- for OpenVMS, both VAX and Alpha, PIM compliant
- for Solaris, both SPARC and MC68K
- for Windows and Linux, 16- and 32-bit platforms, targeting C, ISO compliant, TopSpeed compatible library
Turbo Modula-2
A Z80 CP/M version of Turbo Modula-2 was briefly marketed by Echelon, Inc. under license from Borland. A companion release for Hitachi HD64180 was marketed by Micromint, Inc. as a development tool for their SB-180 single-board computer.
Books
- Niklaus Wirth, "", Fourth Edition, 1988,
- K. N. King, Modula-2,
- Richard J. Sutcliffe, "," 2004-2005 Edition
- Gleaves, Richard, "", First Edition, 1984,.
- Cooper, Doug Oh My! Modula-2: An Introduction to Programming, 1991,