ooRexx (Open Object Rexx) ist der quelloffene Nachfolger von Object REXX, der objektorientierten Erweiterung von REXX, die IBM 1994 einführte. Nachdem IBM die Pflege einstellte, wurde der Quellcode 2005 als Open Source unter dem Namen Open Object Rexx freigegeben. ooRexx ist abwärtskompatibel: Klassische REXX-Programme laufen unverändert.
Starten
Auf Unix-Systemen wird ooRexx über den Interpreter rexx aufgerufen (Debian/Ubuntu-Paket oorexx), auf Windows über rexx.exe:
rexx hello.rex
Objektmodell
ooRexx bringt ein vollständiges Klassenmodell mit. Systemklassen beginnen mit einem Punkt, etwa .array, .list, .directory, .string oder .stream. Neue Klassen und Methoden werden über Direktiven wie ::class, ::method und ::routine definiert. Die REXX-Grundbefehle SAY, PULL, PARSE und DO/END bleiben unverändert gültig.
::class Auto
::method hupe
say 'Hup Hup!'
a = .Auto~new
a~hupe
Der Tilde-Operator ~ ruft eine Methode auf, ~new erzeugt eine neue Instanz.
Java-Anbindung
Mit der Brücke BSF4ooRexx lassen sich Java-Klassen aus ooRexx-Skripten instanziieren und Java-Methoden bidirektional aufrufen — nützlich, um Skripte um Bibliotheken aus dem Java-Ökosystem zu ergänzen.
Verwandte Grundlagen: Rexx-Befehle, NetRexx-Befehle, Regina-Befehle.
Regina ist ein freier REXX-Interpreter, den Mark Hessling ab 1992 entwickelte und der seither kontinuierlich gepflegt wird. Regina implementiert den SAA-Sprachstandard von REXX und wurde auf sehr viele Plattformen portiert: Linux, BSD, Solaris, AIX, macOS, Windows, OS/2, Amiga, OpenVMS und weitere. Damit ist Regina die erste Wahl für klassisches REXX-Skripting unter Unix.
Starten
Ein Regina-Skript wird direkt mit dem Befehl regina ausgeführt (Debian/Ubuntu-Paket regina-rexx):
regina hello.rexx
Die Dateiendung .rexx ist üblich, aber nicht vorgeschrieben — REXX-Quelltext ist reiner Text, das erste Zeichen des ersten Worts bestimmt bei einem Stapelverarbeitungsskript, wie es interpretiert wird.
Sprachkern
Regina deckt den kompletten REXX-Sprachkern ab: SAY für Ausgabe, PULL und PARSE für Eingabe und Zeichenkettenzerlegung, DO/END-Schleifen, IF/THEN/ELSE, benannte Prozeduren mit PROCEDURE und RETURN sowie ADDRESS, um Kommandos an das Betriebssystem zu senden.
say 'Hallo von Regina'
parse arg name
say 'Hallo,' name '!'
do i = 1 to 3
say copies('*', i)
end
Anbindung
Die Regina-API ist konsistent mit IBMs Rexx-SAA-API, sodass C-Programme Regina als eingebettete Skriptsprache nutzen können — ein wichtiger Grund für die weite Verbreitung in Systemwerkzeugen.
Verwandte Grundlagen: Rexx-Befehle, ooRexx-Befehle, NetRexx-Befehle.
NetRexx ist eine von Mike Cowlishaw bei IBM entwickelte Variante von REXX, die direkt auf der Java-Plattform läuft. Der NetRexx-Übersetzer erzeugt aus dem Quelltext Java-Quellcode und daraus Java-Bytecode, sodass NetRexx-Programme wie normale Java-Klassen starten. Eine Besonderheit ist, dass NetRexx keine reservierten Schlüsselwörter kennt: Namen für Klassen und Methoden werden aus dem Kontext erkannt.
Übersetzen und Ausführen
Ein NetRexx-Programm liegt in einer Datei mit der Endung .nrx. Der Übersetzer heißt NetRexxC und wird als Java-Klasse aufgerufen:
java COM.ibm.netrexx.process.NetRexxC hello.nrx
java hello
Die erste Zeile übersetzt die Datei in eine Java-Klasse, die zweite startet das Programm. Optionen wie -format (Quelltext formatieren) oder -utf8 stehen vor oder nach der Dateiangabe.
Syntax im REXX-Stil
NetRexx behält die vertraute REXX-Syntax bei: SAY gibt Text aus, DO/END bilden Schleifen und Blöcke, IF/THEN/ELSE steuern den Ablauf. Da das Java-Objektmodell zugrunde liegt, lassen sich Java-Klassen direkt verwenden, etwa für Ein-/Ausgabe oder Datumsfunktionen.
say 'Hallo von NetRexx'
do i = 1 to 5
say i
end
Verbreitung und Pflege
IBM übergab den Quellcode von NetRexx 3.00 im Juni 2011 an die Rexx Language Association (RexxLA), die den Übersetzer seither als Open Source pflegt. Die Jar-Dateien NetRexxC (Compiler) und NetRexxR (Interpreter) werden im Projektverzeichnis der RexxLA gebaut und verteilt.
Verwandte Grundlagen: Rexx-Befehle, ooRexx-Befehle, Regina-Befehle.
Modula-3 ist eine von Luca Cardelli und weiteren Forschern bei DEC (Digital Equipment Corporation) und Olivetti Ende der 1980er Jahre entworfene Systemprogrammiersprache. Sie übernimmt das Modulkonzept von Modula-2, ergänzt es aber um Objekte und Klassen, Ausnahmen, automatische Speicherbereinigung, Generik und leichtgewichtige Threads. Wichtig ist die Trennung von sicheren und unsicheren Modulen: Unsafe-Features (Zeiger, Typumwandlungen) werden explizit markiert und gekapselt.
Grundgerüst
MODULE Hallo;
IMPORT IO;
BEGIN
IO.Put("Hallo, Welt!
");
END Hallo.
Wichtige Sprachmittel
- INTERFACE / MODULE: Trennung von Schnittstelle und Implementierung wie in Modula-2; jede Schnittstelle deklariert die öffentlichen Typen und Prozeduren.
- REVEAL: sichtbare und versteckte Typ-Eigenschaften — eine Type kann erst später als >= (Obertyp) oder <= (Untertyp) von etwas anderem bekannt gemacht werden.
- REFANY / OBJECT: Referenztyp-Hierarchie; Objekte werden über Referenzen angesprochen, Methoden heißen in Modula-3 Methoden (METHODS ... END).
- GENERIC: generische Interfaces und Module zur typsicheren Wiederverwendung.
- UNSAFE: explizit markierte unsichere Module, in denen Zeiger und Typumwandlungen erlaubt sind.
- THREAD: leichtgewichtige Threads mit MUTEX und Condition-Variablen als Teil der Standardbibliothek.
Werkzeuge
cm3 -build # Projekt bauen (README/Quellbaum)
cm3 -ship # gebaute Artefakte in das Installationsverzeichnis kopieren
cm3 -install # Bibliotheken/Programme systemweit installieren
cm3 -C # (Re-)Kompilierung von Modulen im aktuellen Verzeichnis
m3ship # Ship-Tool der CM3-Distribution
m3tk # Modula-3-Toolkit
m3tohtml # Quelltext-Konverter nach HTML
m3c / m3front # C-/Frontend-Tools der CM3-Toolchain
Praxis-Tipps
- Der Referenz-Compiler ist Critical Mass CM3 (Open Source, aus dem DEC-SRC-Nachfolger hervorgegangen, heute von Elego Software Solutions gepflegt).
- Modula-3 war das erste große System mit automatischer Speicherbereinigung für Systemsprachen und beeinflusste unter anderem Java und C#.
- Die Sprache blieb wissenschaftlich einflussreich, fand aber nie breite kommerzielle Verbreitung — heute vor allem historisch und in Lehrbüchern präsent.
Verwandte Grundlagen: Modula-2-Befehle, Oberon-Befehle, Component-Pascal-Befehle und Sather-Befehle.
Component Pascal ist eine 1994 bei der ETH-Zürich-Ausgründung Oberon microsystems entstandene objektorientierte Variante der Wirth-Sprachfamilie, ursprünglich unter dem Namen Oberon/L entwickelt. Sie ist eine Erweiterung von Oberon-2 um Komponenten- und GUI-Fähigkeiten. Das wichtigste Werkzeug ist die IDE BlackBox Component Builder (Open Source): ein integriertes System zum Editieren, Kompilieren, Ausführen und Debuggen von Component-Pascal-Programmen, in dem jedes Modul eine Einheit aus Kompilierung und Ausführung ist.
Grundgerüst
MODULE Hallo;
IMPORT StdLog;
PROCEDURE Go*;
BEGIN
StdLog.String("Hallo, Welt!"); StdLog.Ln
END Go;
END Hallo.
Wichtige Sprachmittel
- MODULE / IMPORT: Module sind Kompilierungs- und Ausführungseinheiten; exportierte Bezeichner enden mit * (z.B. PROCEDURE Go*).
- PROCEDURE: Prozeduren, auch typ-gebunden (Methoden) mit Receiver — z.B. PROCEDURE (c: Controller) Handle*.
- RECORD-Typerweiterung: objektorientierte Vererbung durch erweiterbare Records.
- POINTER: Referenztypen für dynamische Datenstrukturen.
- Arrays, Sets, CASE, IF…ELSIF: wie in der Wirth-Familie üblich.
Werkzeuge
DevCP.exe # BlackBox-Hauptprogramm (IDE)
DevCtl.exe # Kommandozeilen-/Scripting-Steuerung (Control-Log)
DevTool.exe # Tool-Steuerung für CI-Skripte
DevComp.exe # Compiler-Aufruf aus Skripten
obc # OBNC/BlackBox-Kommandozeilen-Compiler (optional)
Praxis-Tipps
- BlackBox ist stark komponentenorientiert: GUIs, Dokumente und Hosts werden als wiederverwendbare Module entwickelt, die zur Laufzeit geladen werden.
- Der Compiler ist sehr schnell; Module werden erst bei Bedarf in den Speicher geladen (lazy loading).
- Die Sprache gehört zur Wirth-Linie Pascal → Modula-2 → Oberon → Component Pascal und ist damit eine Brücke zwischen klassischen Systemsprachen und Komponenten-Frameworks.
Verwandte Grundlagen: Oberon-Befehle, Modula-2-Befehle, Modula-3-Befehle und Pascal-Befehle.