Oberon (Programmiersprache)

Oberon
Basisdaten
Paradigmen: imperativ, strukturiert, objektorientiert
Erscheinungsjahr: 1987
Designer: Niklaus Wirth
Entwickler: Niklaus Wirth, Jürg Gutknecht
Beeinflusst von: Pascal, Modula-2
Beeinflusste: Component Pascal, Active Oberon, Zonnon
Lizenz: unbekannt
projectoberon.net

Oberon ist eine von Niklaus Wirth und Jürg Gutknecht entwickelte, objektorientierte, streng strukturierte Programmiersprache. Sie ist den ebenfalls von Wirth entworfenen Vorgängern Pascal und Modula-2 recht ähnlich, allerdings strukturierter und mächtiger als Pascal, gleichzeitig aber erheblich weniger umfangreich als Modula-2. Die Definition der Sprache war Anfang 1986 abgeschlossen. Das Oberon System ist ein eigenständiges Betriebssystem der ETH Zürich, das in der Sprache Oberon implementiert ist, als Entwicklungsgrundlage für die Sprache diente und ebenso wie der Compiler kostenlos erhältlich war.

Überblick

Oberon ist das Ergebnis eines Forschungsprojekts, eine Programmiersprache und ein Betriebssystem für Arbeitsplatzrechner zu entwickeln. Wirth und Reiser führten die Motivation für das Projekt auf die Zeit der Implementierung des persönlichen Rechners zurück. So hätten die damaligen üblichen Betriebssysteme beim Umsetzen der Prinzipien der Softwaretechnik versagt. Dazu seien eine voreilige Flucht in Standards gekommen sowie Programme, die Schichten auf veraltete Grundsysteme stapelten. Die Softwaretechnik habe einen wirtschaftlichen Mitteleinsatz und die Einfachheit der Lösungen vermissen lassen. Als Leitmotiv für das Projekt zitierten sie Einstein: „Mach es so einfach wie möglich, aber nicht einfacher.“[1] Das Projekt wurde nach dem größten Mond des Planeten Uranus benannt, dessen Monde zu dieser Zeit von einer Voyager-Raumsonde fotografiert wurden. Oberon sei auch der Name des Elfenkönigs.[2]

Die Entwicklung von Oberon begann 1985 und mündete in einer vollständigen Definition der Sprache Anfang 1986 als Ergebnis einer Kooperation zwischen Niklaus Wirth und Jürg Gutknecht. Der dazu veröffentlichte Report umfasst lediglich circa 16 Seiten.[3][4]

Ein Ziel der Programmiersprache Oberon war es, den erweiterbaren Entwurf zu unterstützen. Während ihr Vorgänger Modula-2 zwar strukturierte, modulare und hierarchische Programmierung erlaubt, um Abstraktionsebenen einzuführen, fügt Oberon die Erweiterbarkeit von Datentypen hinzu und zwar derart, dass erweiterte Typen kompatibel mit ihren Ausgangstypen bleiben. Modula-2 bietet dieses Merkmal nicht. Reiser und Wirth sahen darin die eigentliche Neuerung der „in den achtziger Jahren zur Modewelle avancierten objektorientierten Sprachen.“ Diese hätten darüber hinaus mit dem Ziel eines Paradigmenwechsels altbekannte Konzepte umbenannt. Aus Variablen wurden Instanzen, aus Prozeduren Methoden und aus dem Prozeduraufruf das Senden von Meldungen. Oberon hingegen blieb bei den Begriffen des Datentyps und der Prozedur, um einen „Bruch mit der Tradition“ zu vermeiden.[5]

Die nachfolgende Tabelle zeigt einen Terminologienvergleich zwischen der objektorientierten Programmierung (OOP) und Oberon.[6]

Terminologienvergleich
OOP-Terminologie Oberon-Terminologie
Klasse Zeigertyp, der einen Record-Typ mit Prozedurvariablen referenziert, welcher einen abstrakten Datentyp definiert
Objekt Zeigervariable, die auf eine Record-Variable dieses Typs zeigt
Methode Eine Prozedur des Record-Typs
Meldung senden Aufruf einer dynamisch gebundenen Prozedur
Unterklasse (Subclass) Erweiterter Record-Typ
Oberklasse (Superclass) Basistyp einer Erweiterung
Vererbung (Inheritance) Typerweiterung
Überschreiben einer Methode Ändern der einem Record-Feld zugewiesenen Prozedur in einer Erweiterung
Empfänger (Receiver) Das als Parameter übergebene Objekt bei einem Prozeduraufruf
Super-Aufruf Aufruf einer Prozedur, die an den Basistyp einer Erweiterung gebunden ist
Dynamisches Binden Aufruf einer Prozedurvariablen

Oberon hat im Vergleich zu seinem Vorgänger Modula-2 einen verminderten Befehlsumfang. In der damit erreichten Vereinfachung und Vereinheitlichung sahen Reiser und Wirth „echten Fortschritt“ beim Vermitteln wissenschaftlicher Grundlagen, da die Ausdruckskraft Oberon erhalten bliebe.[7]

Oberon wurde wie auch schon Modula-2 parallel zu einer Workstation, in diesem Fall Ceres, entwickelt. Oberon fand nach seiner Veröffentlichung unter anderem zu Bildungszwecken in Lehreinrichtungen Verwendung. Es existierten seinerzeit auf Oberon basierende, ebenfalls kostenlos verfügbare Werkzeuge, die auch kommerziell eingesetzt wurden, wie zum Beispiel die Programmiersprache Component Pascal und die integrierte Entwicklungsumgebung BlackBox Component Builder.

Hanspeter Mössenböck und Wirth haben Oberon mit wenigen Ergänzungen zur Programmiersprache Oberon-2 weiterentwickelt, die kompatibel zu Oberon ist. Wesentlich ist die Aufnahme von Prozeduren in den Befehlsumfang, die als Teil des Datentyps eines Objekts definiert werden können. Eine solche Prozedur erhält stets bei ihrem Aufruf eine Referenz auf das Objekt, über das ihr Aufruf erfolgt ist. Bei Oberon muss in diesem Fall eine Prozedur zunächst einer Prozedurvariablen des Objekts zur Laufzeit zugewiesen und, sofern benötigt, eine Referenz auf das Objekt als Parameter der Prozedur bei ihrem Aufruf übergeben werden. Ferner wurden unter anderem die For-Schleife und die Exportmarke - (als Alternative zu *) eingeführt, letzteres, um Variablen oder Objektkomponenten schreibgeschützt sichtbar zu machen.[8]

Die Quelltexte der Compiler waren in der Regel frei verfügbar. Es gab verschiedene integrierte Entwicklungsumgebungen, genannt werden kann zum Beispiel POW!.[9]

Oberon verlangt, dass Operanden in Ausdrücken und die Bestandteile von Wertzuweisungen kompatibel sind, und nennt diese Forderung strenge Typisierung. Ein Compiler kann so prüfen, ob Ausdrücke oder Zuweisungen sinnvoll sind, so dass Programmierfehler bereits vor der Programmausführung erkannt werden.[10] Der im Rahmen des Oberon-Projekts von Wirth und Gutknecht entwickelte Compiler für die NS-32000-Mikroprozessorarchitektur hatte zum Ziel, selbst kompakt zu sein und eine schnelle Übersetzung von Quelltext in effizienten und knappen Maschinencode aufzuweisen.[11] Der erzeugte Maschinencode überprüft zur Laufzeit, ob der für einen Zugriff auf ein Array-Element verwendete Index in dem Bereich liegt, der bei der Deklaration des Arrays im Quelltext angegeben wurde. Ist dies nicht der Fall, liegt ein Fehler vor und die Programmausführung wird abgebrochen.[12] Da die Indexprüfung einen zusätzlichen Laufzeitaufwand nach sich zieht, erlauben manche Compiler, sie per Option abzuschalten.[13]

Es ist möglich, Haltepunkte zu setzen (Anweisung HALT) und auch alle lokalen Variablen nach dem Abbruch des Programms zu analysieren. Globale Variablen können im Laufzeitsystem jederzeit analysiert werden. Die Entwicklungszeiten mit Oberon sind daher sehr kurz, und der Maschinencode ist dennoch sehr effizient und robust. Auch Echtzeitanwendungen können mit Oberon implementiert werden.

Die Programmiersprache Oberon zeichnet sich dadurch aus, dass sie die objektorientierte Architektur im Vergleich beispielsweise mit dem standardmäßigen Verhalten von C++[14] unter anderem mit einem im Oberon System integrierten Laufzeitsystem und einer automatischen Speicherbereinigung (garbage collection) unterstützt. Damit wird die Verwendung von Programmanweisungen zur Deallokation des von Objekten belegten Speichers obsolet. Wird erneut freier Speicher für ein Objekt benötigt, wird zunächst der Speicher von allen Objekten freigegeben, die aus keinem der geladenen Module mehr referenziert werden.[15]

Code-Beispiele

Hello World im Ulmer Oberon-System:[16]

MODULE HelloWorld;

IMPORT Write;

BEGIN

   Write.Line ("Hello World");

END HelloWorld.

Die objektorientierte Programmierung wird mit erweiterten Datenverbünden vom Datentyp RECORD erreicht. Die Definition von Methoden wird durch typengebundene Prozeduren, und die Definition von Sichtbarkeiten wird durch Exportmarken (* für Schreib- und Lesezugriff und - für Lesezugriff) erwirkt. Beispiel in Oberon-2:

MODULE Vererbung;

TYPE

   GraphischesObjekt* = POINTER TO GraphischesObjektBeschreibung; (* Das nachgestellte Malzeichen kennzeichnet einen Datentyp, der exportiert wird *)
   GraphischesObjektBeschreibung = RECORD farbe*: LONGINT; END; (* Das nachgestellte Malzeichen kennzeichnet ein exportiertes Attribut, auf das wahlfrei zugegriffen werden kann *)

   Punkt* = POINTER TO PunktBeschreibung;
   PunktBeschreibung = RECORD (GraphischesObjekt) x*, y*: LONGINT; END; (* Punkt erbt die Eigenschaft "farbe" von GraphischesObjekt *)

   Linie* = POINTER TO LinienBeschreibung;
   LinienBeschreibung = RECORD (GraphischesObjekt) xStart*, yStart*, xEnde*, yEnde*: LONGINT; END; (* Linie erbt die Eigenschaft "farbe" von GraphischesObjekt *)

PROCEDURE (punkt: Punkt) Zeichne*; (* typgebundene Methode "Zeichne" für Instanzen vom Typ "Punkt" *)
BEGIN
   ...
END Zeichne;

PROCEDURE (linie: Linie) Zeichne*; (* typgebundene Methode "Zeichne" für Instanzen vom Typ "Linie" *)
BEGIN
   ...
END Zeichne;

CONST

   ROT = 00000FFH; (* RGB *)

VAR

   punkt: Punkt;
   linie: Linie;

BEGIN

   NEW (punkt);
   punkt.farbe := ROT;
   punkt.x := 1;
   punkt.y := 1;
   punkt.Zeichne ();

   NEW (linie);
   punkt.farbe := ROT;
   linie.xStart := 1;
   linie.yStart := 1;
   linie.xEnde  := 2;
   linie.yEnde  := 2;
   linie.Zeichne ();

END Vererbung.

Attribute, die nur einen Lesezugriff haben, können durch typengebundene Prozeduren (Methoden) verändert werden. Beispiel in Oberon-2:[17][8]

MODULE Schreibschutz;

TYPE

   Objekt* = POINTER TO Objektbeschreibung; (* Das nachgestellte Malzeichen kennzeichnet einen Datentyp, der exportiert wird *)
   Objektbeschreibung = RECORD x-: INTEGER; END; (* Das nachgestellte Minuszeichen kennzeichnet ein exportiertes Attribut, auf das nur lesend zugegriffen werden kann *)

PROCEDURE (objekt: Objekt) SetzeX* (wert: INTEGER); (* typgebundene Methode "SetzeX" *)
BEGIN
   objekt.x := wert; (* Schreibzugriff auf das Attribut "x" nur in typgebundener Methode *)
END SetzeX;

VAR

   objekt: Objekt;
   int: INTEGER;

BEGIN

   NEW (objekt); (* Erzeugen einer anonymen Variable vom Typ "Objektbeschreibung" und Initialisieren des Zeigers "objekt", der damit diese Variable referenziert *)
   objekt.SetzeX (1); (* Schreibzugriff auf das Attribut "x" nur über Methodenaufruf *)
   int := objekt.x; (* Lesezugriff auf das Attribut "x" auch über Zuweisung *)

END Schreibschutz.

Weiterentwicklungen

Ausgehend von Oberon und Oberon-2 sind die Programmiersprachen Component Pascal, Active Oberon und Zonnon entstanden.

Siehe auch

Literatur

  • Hanspeter Mössenböck: Object-Oriented Programming in Oberon-2. 2. Auflage. Springer-Verlag, 1993, 1994 (englisch)
  • Martin Reiser, Niklaus Wirth: Programmieren in Oberon. Das neue Pascal. Addison-Wesley, 1994, ISBN 3-89319-657-9 (338 Seiten, 2. korrigierter Nachdruck 1997).
  • Martin Reiser, Niklaus Wirth: Programming in Oberon. Steps Beyond Pascal and Modula. Addison-Wesley, 1992, ISBN 0-201-56543-9 (englisch, 336 Seiten).
  • Niklaus Wirth, Jürg Gutknecht: Project Oberon. The Design of an Operating System and Compiler. 1. Auflage. Addison-Wesley, 1992, ISBN 0-201-54428-8 (englisch, 548 Seiten).
  • Martin Reiser: The Oberon System. User Guide and Programmer’s Manual. 1. Auflage. Addison-Wesley, 1991, ISBN 0-201-54422-9 (englisch, 300 Seiten).
  • Oberon. Eidgenössische Technische Hochschule Zürich, archiviert vom Original (nicht mehr online verfügbar) am 6. Januar 2017; (englisch).
  • Project Oberon. 10. Januar 2021, abgerufen am 16. November 2023 (Project Oberon is a design for a complete desktop computer system from scratch.).

Einzelnachweise

  1. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. XV–XVI.
  2. Niklaus Wirth, Jürg Gutknecht: Project Oberon. The Design of an Operating System and Compiler. Addison-Wesley, 1992, ISBN 0-201-54428-8, S. 3 (englisch).
  3. Niklaus Wirth: Modula-2 and Oberon. In: HOPL III: Proceedings of the third ACM SIGPLAN conference on History of programming languages. ACM, Inc., 9. Juni 2007, S. 3–8 (englisch).
  4. Niklaus Wirth: From Modula to Oberon and the programming language Oberon. In: Institut für Informatik, Fachgruppe Computer-Systeme. Band 82. Eidgenössische Technische Hochschule Zürich, September 1987, doi:10.3929/ethz-a-005363226 (englisch, 27 Seiten, ethz.ch [PDF; 1,5 MB; abgerufen am 2. Januar 2020]).
  5. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 4–5.
  6. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 249.
  7. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 5.
  8. a b Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 277–279, 288.
  9. Peter René Dietmüller: Pow! - Programmers Open Workbench. 8. September 2005, abgerufen am 5. Oktober 2022 (englisch, eine IDE zu Oberon).
  10. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 48.
  11. Niklaus Wirth, Jürg Gutknecht: Project Oberon. The Design of an Operating System and Compiler. Addison-Wesley, 1992, ISBN 0-201-54428-8, S. VI (englisch).
  12. Niklaus Wirth, Jürg Gutknecht: Project Oberon. The Design of an Operating System and Compiler. Addison-Wesley, 1992, ISBN 0-201-54428-8, S. 338 (englisch).
  13. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 120.
  14. Bjarne Stroustrup: A Tour of C++ – Third Edition. Pearson Education, Inc., 2023, ISBN 978-0-13-681648-5, S. 79 (englisch): “In C++, you can plug in a garbage collector. However, I consider garbage collection the last choice after cleaner, more general, and better localized alternatives to resource management have been exhausted.”
  15. Niklaus Wirth, Jürg Gutknecht: Project Oberon. The Design of an Operating System and Compiler. Addison-Wesley, 1992, ISBN 0-201-54428-8, S. 241 (englisch).
  16. Andreas Borchert: Ulm's Oberon Library: Streams. 22. Mai 2004, abgerufen am 24. November 2024 (englisch).
  17. Martin Reiser, Niklaus Wirth: Programmieren in Oberon – Das neue Pascal. 1. Auflage. Addison-Wesley, 1995, ISBN 3-89319-657-9, S. 144.