© StonePictures/Shutterstock.com
Auf den Spuren von Niklaus Wirth

Modula, zum Zweiten


Niklaus Wirths Produktivität im Bereich der Sprachentwicklung ist nicht zu verachten: Kurz nach der Einführung von Pascal wandte sich der Schweizer einem als Modula bezeichneten Nachfolger zu. Dieser wurde allerdings nicht alt – Modula-2 erschien nur ein Jahr nach der Veröffentlichung der Sprachspezifikation.

Die Arbeit an Modula wurde durch einen Besuch Wirths bei Xerox motiviert: Kurze Zeit später begann man an der ETH Zürich mit der Arbeit an einer Lilith genannten Workstation. Als Programmiersprache sollte naturgemäß eine Eigenentwicklung dienen – das als Lehrsprache vorgesehene Pascal war aus mehreren Gründen ungeeignet. Erstens bot Pascal keine Möglichkeit zur Unterteilung des Codes – Modula sollte diesem Problem durch die Einführung der namensgebenden Module abhelfen. Die zweite Veränderung war die native Implementierung von Nebenläufigkeit, um die Parallelisierung von Aufgaben zu vereinfachen.

Installation

Modula-2 wurde im Jahre 1996 von der ISO standardisiert. Wir wollen in diesem Tutorial auf die GNU-Version zurückgreifen, die für diverse Betriebssysteme gleichermaßen zur Verfügung steht. Die folgenden Schritte erfolgten auf einer Workstation mit Ubuntu 14.04 LTS – andere Betriebssysteme dürften sich bis auf das Deployment analog verhalten. Übrigens: Wer GNU Modula nicht mag, kann beim Unternehmen Excelsior eine IDE für Modula für Windows herunterladen. Weitere Informationen hierzu finden sich unter [1].

Zur Installation öffnen Sie im ersten Schritt die Datei /etc/apt/sources.list (am einfachsten geht das durch Eingabe von sudo gedit /etc/apt/sources.list) und ergänzen sie um die Deklaration von zwei Repositories:

deb http://floppsie.comp.glam.ac.uk/debian/ jessie main deb-src http://floppsie.comp.glam.ac.uk/debian/ jessie main

Im nächsten Schritt folgen die übliche Aktualisierung der Paketliste und das Herunterladen der beiden Pakete mit dem Modula-Compiler:

sudo apt-get update sudo apt-get install gm2-doc gm2

Legen Sie nach der Abarbeitung der Installationsbefehle eine Datei namens helloworld.mod an, die fürs Erste mit folgendem Inhalt bevölkert wird:

MODULE hello ; FROM StrIO IMPORT WriteString, WriteLn ; BEGIN WriteString('hello world') ; WriteLn END hello.

Nach der Deklaration des Moduls importieren wir einige Unterstützungsfunktionen aus der StrIO-Bibliothek – spezifischerweise die Ausgabefunktionen WriteString und WriteLn. Danach folgt – ganz im Stil von Pascal – die Einleitung des eigentlichen Programmcodes, der eigentlich nur aufgrund der separaten Nutzung von WriteString zum Ausgeben eines Strings und WriteLn zum Ausgeben von Carriage Return interessant ist. Befehle werden in Modula-2 normalerweise durch ein Semikolon beendet. Beim letzten Statement eines Blocks ist dies allerdings optional, was sich hier an WriteLn feststellen lässt.

Auf der mit gcc 4.8.4 ausgestatteten Workstation des Autors kann sodann ein erster Kompilationsversuch durch Eingabe von gm2 hellomodula.mod erfolgen – bei einem normalen Ubuntu-System scheitert er mit der Fehlermeldung cannot find -lpth. Nach dem Nachladen der Bibliothek mittels sudo apt-get install libpth-dev können wir das Programm sodann folgendermaßen ausführen:

tamhan@tamhan:~/SUSModula2$ ./a.out hello world

Modula-2 ist in Form eines GCC-Frontends realisiert. Die Universität Glamorgan bietet unter [2] ein lesenswertes Paper an, das die Vorgehensweise im Detail beschreibt.

Beachten Sie, dass das unsaubere Abschließen des letzten Statements in der Praxis zu Ärger führt. Ein anderer Programmierer könnte das betreffende Snippet nämlich später folgendermaßen erweitern, was ob des fehlenden Semikolons vor WriteLn zu Ärger führt:

BEGIN WriteString('hello world') ; WriteLn WriteString('puber') END hello.

Modula-2 und Lilith – eine enge Bindung

Die enge Beziehung zwischen Modula-2 und Lilith zeigt sich in den grundlegenden Variablentypen: Da Wirth für seine Workstation einen 16-Bit-Typ avisierte, gibt es zwei Typen namens INTEGER und CARDINAL. INTEGER beschreibt dabei eine vorzeichenbehaftete Zahl, während CARDINAL ohne ein Vorzeichen auskommen muss. Modula-2 unterscheidet sich von C und Co. insofern, als Zuweisungen zwischen vorzeichenbehafteten und nicht vorzeichenbehafteten Variablen nur in sehr begrenztem Rahmen erlaubt sind. Testen wir dies anhand des Codes in Listing 1, der einen CARDINAL-Typ durch geschicktes Subtrahieren in einen unerlaubten Bereich bringt.

Listing 1

MODULE hello ; FROM NumberIO IMPORT WriteCard ; FROM StrIO IMPORT WriteString, WriteLn ; VAR myField:CARDINAL; BEGIN myField:=12; myField:=myField-22; WriteCard(myField, 10); WriteLn; END hello

Auffällig ist hier vor allem die von Pascal bekannte Syntax – die Variablendeklaration, der dedizierte Bereich für die Deklaration von Variablen und der Wirth-typische Zuweisungsoperator sind abermals mit von der Partie. Die Inklusion von WriteCard ist insofern interessant, als die verschiedenen Compilerhersteller im Bereich der Platzierung ihrer Bibliotheksfunktionen mehr oder weniger freie Hand haben. Auf der Workstation des Autors finden sich die diversen Module im Verzeichnis /opt/gm2/lib/gcc/x86_64-linux-gnu/4.7.4/m2/pim/ – zum Durchforsten der diversen .def-Dateien bietet sich beispielsweise der Kommandozeilenbefehl grep an. Ein weiterer netter Unterschied ist, dass der zweite Parameter die für die Ausgabe zu verwendende Menge von Zeichen angibt – manche Runtimes bieten diese Möglichkeit nicht an, was bei der Kompilation von Code zu Beschwerden wegen fehlender Parameter führt.

Wer das vorliegende Programm ausführt, wird auf manchen Runtimes mit einer Fehlermeldung konfrontiert – unter GNU Modula-2 verhält sich die Ausführungsumgebung etwas toleranter, was zum in Abbildung 1 gezeigten Resultat führt. Ein weiteres interessantes Hindernis ist das Code-Snippet in Listing 2, das schon bei der Kompilation den in Abbildung 2 gezeigten Fehler produziert.

Listing 2

VAR myField:CARDINAL; myInt:INTEGER; BEGIN myField:=12; myInt:=12; myField:=myField+myInt+2; . . . END hello.

Bei Betrachtung der Fehlermeldung fällt auf, dass Integers und Kardinalzahlen nicht in einer arithmetischen Zuweisung stehen dürfen. Ein Weg zu einer gültigen Formulierung bestünde darin, eine weitere Variable einzuführen, mit der die Zuweisung von Kardinalzahl und Integer vor der Berechnung korrigiert wer...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang