Modula-2

**Modula-2** er et programmeringsspråk som ble designet og utviklet mellom 1977 og 1985 av Niklaus Wirth (f. 1934) ved *[[Eidgenössische Technische Hochschule Zürich]]*. Språket ble allment tilgjengelig i 1978. Modula-2 ble forstått som etterfølgeren til Pascal og Modula. Det var også påvirket av Mesa og de nye programmeringsmuligheter som Wirth oppdaget i datamaskinen Xerox Alto under hans sabbatsår i 1976 ved Xerox PARC.

Nøkkelkonseptene i Modula-2 var:

* Modulet som separat kompileringsenhet for separat kompilering
* Korutinen som basis for parallelle prosesser
* Datatyper og prosedyrer som tillater aksess til maskin-spesifikke data

I august og september 1984 omtalte det amerikanske tidsskriftet *[[Byte (tidsskrift)|Byte]]* språket og dets miljø. Modula-2 ble første gang brukt på en PDP-11 minidatamaskin i Zürich; i 1980 ble språket portert til arbeidsstasjonen Lilith. I tidens løp er det blitt portert til IBM stormaskiner, så vel som til innebygde systemer, personlige datamaskiner og moderne datamaskinarkitekturer som RISC-V.

Modula-2 ble etterfulgt av Modula-2+ (1984), Modula 3 (1988), Oberon (1987), Oberon-2 (1991) og Oberon-07 (2007).

## Beskrivelse
Modula-2 er et prosedyrisk språk som er laget for generelle formål. Det er både et imperativt og strukturert programmeringsspråk. Det er egnet for både systemprogramming og applikasjonsprogrammering. Syntaksen er basert på programmeringsspråket Pascal, men enkelte elementer og tvetydigheter i syntaksen til Pascal er fjernet. Modula-2 støtter modulær programmering hvor *modulet* er konstruert for separat kompilering og data-abstraksjon; og korutiner sørger for fleroppgavekjøring og parallelle beregninger.

Språket gjør det mulig å bruke en-pass kompilatorer. En slik kompilator som ble laget av Gutknecht og Wirth i 1984 var omkring fire ganger raskere enn tidligere fler-pass kompilatorer.

Her er et eksempel på kildekoden til programmet «Hello world»:


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


## Dialekter
Det finnes to hoveddialekter av Modula-2. Den første er *PIM*, oppkalt etter boken *Programming in Modula-2* av Niklaus Wirth. Det kom fire utgaver av denne boken; Andre, tredje (korrigert) og fjerde utgave beskriver hver enkelt beskriver små varianter av språket. Den andre hoveddialekten er *ISO*, oppkalt etter standardiseringen til International Organization for Standardization. Her er forskjellene på dem.

* *PIM2* (1983)
** Krevde en eksplisitt `EXPORT` klausul i definisjonsmoduler.
** Funksjonen `SIZE` behøver ikke å importeres fra modulet `SYSTEM`
* *PIM3* (1985)
** Fjernet `EXPORT` klausulen fra definisjonsmoduler. Ettersom alt innenfor et definisjonsmodul definerer grensesnittet til dette modulet, ble `EXPORT` klausulen overflødig.
** Funksjonen `SIZE` er gjennomtrengende (synlig i ethvert område uten å importeres)
* *PIM4* (1988)
** Spesifiserte oppførselen til operatoren `MOD` når operandene er negative.
** Krevde at alle `ARRAY OF CHAR` strenger avsluttes med ASCII NUL, selv om strengen passer nøyaktig inn i sin tabell.
* *ISO* (1996, 1998)
** ISO Modula-2 fjernet de fleste tvetydighetene i PIM Modula-2. Den tilføyde datatypene `COMPLEX` og `LONGCOMPLEX`, unntakshåndtering, modulterminering (`FINALLY` klausulen) og et komplett standard I/O-bibliotek. Der finnes mange små forskjeller og avklaringer.

## Språkelementer
### Reserverte ord
PIM [2,3,4] definerer 40 reserverte ord:


```
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
```


### Innebygde identifikatorer
PIM [3,4] definerer 29 innebygde identifikatorer:


```
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
```


## Kompilatorer
### GNU Modula-2
GNU Modula-2 ble lansert (versjon 1.0) den 11. desember 2010. Den er en front-end til GNU Compiler Collection (GCC), er fri og åpen programvare og er lisensiert under GNU General Public License versjon 3 (GPLv3).

I GCC 13.1, som ble lansert 13. april 2023, ble GNU Modula-2 integrert som standard. GNU Modula-2 støtter alle dialektene av språket: PIM2, PIM3, PIM4, og ISO/IEC 10514-1 i et komplett sett med biblioteker. Attributten  støttes med kompilatorflagget -Wreturn-type.

I GCC 15.1 kom følgende nyheter:
* Nøkkelordet FORWARD ble implementert
* SYSTEM-modulet eksporterer datatypen COFF_T som mapper til POSIX-typen off_t. Størrelsen på denne datatypen kan kontrolleres med flagget *-fm2-file-offset-bits=*
*Tilgang til de innebygde GCC-elementene *clz, clzll, ctz* og *ctzll* er tilgjengelige fra modulet *Builtins*.

### Andre kompilatorer
*  Amsterdam Compiler Kit (ACK), ved Vrije Universiteit i Amsterdam, har en kompilator for Modula-2. Den brukes primært på MINIX, men brukes også på en rekke andre operativsystemer og arkitekturer; koden vedlikeholdes fortsatt og kan lastes ned som freeware
* ADW Modula-2 – for 32-biter Microsoft Windows, ISO-kompatibel, følger ISO/IEC 10514-1, ISO/IEC 10514-2 (objektorienterte utvidelser), ISO/IEC 10514-3 (generisk utvidelse); er freeware
* Aglet Modula-2 – for AmigaOS 4.0 og PowerPC; freeware

#### Turbo Modula-2
Turbo Modula-2 var en kompilator og et integrert utviklingsmiljø for MS-DOS. Den ble utviklet, men aldri lansert, av Borland. Jensen and Partners, som inkluderte Borland's medgrunnlegger Niels Jensen, kjøpte kompilatoren og endret navnet til TopSpeed Modula-2. Denne kjørte på OS/2 og ble lansert i 1988; siste versjon kom i 1992. Den ble i 1993 solgt til *Clarion*, senere *SoftVelocity*, som på denne tiden tilbød Modula-2 som en del av Clarion-produktene.

En Zilog Z80 versjon av Turbo Modula-2 for CP/M ble en kort tid markedsført av *Echelon* under lisens fra Borland. En beslektet utgave for 8-biter mikroprosessoren Hitachi HD64180 ble solgt av *Micromint* som et utviklingsverktøy for deres SB-180 datamaskin.

#### IBM Modula-2
IBM utviklet i 1980-årene en Modula-2 kompilator for internt bruk som kjørte på både OS/2 og AIX, og med førsteklasses støtte i IBM's E2-editor. Den var en av fire kompilatorer som ble støttet av denne editoren; de tre andre var IBM C, IBM Pascal og IBM REXX.

IBM Modula-2 er også brukt i OS/400 / IBM i. 

En bakende for Motorola 68000 ble også brukt i innebygde systemer.

## Operativsystemer
Modula-2 er brukt som systemprogramvare til å realisere operativsystemer. Den modulære strukturen til Modula-2 har vært benyttet direkte i tre operativsystemer.

* Modula-2 var det eneste programmeringsspråket og applikasjonsprogramvare for Medos-2, operativsystemet til den personlige arbeidsstasjonen Lilith. De første ti Lilith-maskinene ble innstallert i 1980. Lilith var bygd opp rundt mikrobrikken AMD 2901 fra Advanced Micro Devices som kjørte i 7 MHz, og var implementert som en stakkmaskin.
* Operativsystemet *Excelsior*, for arbeidsstasjonen Kronos, ble bygd opp av moduler fra Modula-2. Kronos ble lansert i 1988, og var bygd omkring en 32-biter proprietær datamaskinarkitektur. Operativsystemet ble utviklet av Kronos Research Group (KRG) i Novosibirsk, som var tilknyttet Sovjetunionens vitenskapsakademi.
* IBM Modula-2 ble 26. august 1988 delvis brukt i OS/400 *Vertical Licensed Internal Code* (kjernen til OS/400). Denne koden ble for det meste erstattet med C++ da OS/400 ble portert til mikroprosessorfamilien IBM RS64 fra 1992 til 1995.  Operativsystemet ble omdøpt til *i5/OS* den 26. august 2004 (fordi den kjørte på POWER5) og til *IBM i* den 2. april 2008; det hadde da fortsatt litt Modula-2 kode i kjernen. 

## Referanser



; Nettsteder




## Kilder
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
* 
*  ‎

## Eksterne lenker
*  Modula-2 Internet directory