Object REXX ist eine universell nutzbare, interpretierte, objektorientierte höhere Programmiersprache. Heute wird sie oft als ooRexx (kurz für „Open Object Rexx“) bezeichnet, welches der direkte Open Source Nachfolger von Object REXX ist.

Open Object Rexx (ooRexx)
Logo
Logo
Basisdaten
Paradigmen: multiparadigmatisch (objektorientiert, prozedural, imperativ, strukturiert)
Erscheinungsjahr: 1988
Designer: Simon C. Nash (IBM)
Entwickler: IBM
Aktuelle Version: 5.0.0  (22.12.2022)
Aktuelle Vorabversion: 5.1.0  (19.09.2024)
Typisierung: dynamisch
Wichtige Implementierungen: Object REXX (until 2004), ooRexx (since 2005)
Standardisierungen: ANSI
Beeinflusst von: Rexx, Smalltalk
Beeinflusste: NetRexx
Betriebssystem: Plattformunabhängigkeit: Linux, Microsoft Windows, macOS, Solaris, OpenIndiana, AIX, FreeBSD, OS/2
Lizenz: CPL 1.0, GPLv2
www.rexxla.org

Es ist eine Erweiterung der Rexx Programmiersprache (oft als „Classic Rexx“ bezeichnet), die alle Funktionen und die Syntax beibehält, aber objektorientierte Programmierung (OOP) und andere Erweiterungen hinzufügt. Dem Einfluss von Classic Rexx folgend, ist ooRexx so konzipiert, dass die Programmiersprache leicht zu erlernen und zu benutzen ist und der Quelltext einfach zu pflegen ist. Konformität mit dem „Information Technology - Programming Language REXX“ ANSI X3.274-1996[1] Standard gewährleistet plattformübergreifende Interoperabilität mit anderen konformen Rexx Implementierungen. Daher laufen Classic Rexx Programme in der Regel ohne Änderungen unter ooRexx.

Es gibt auch Rexx Object Oriented („roo!“), eine weitere Implementierung, die ursprünglich von Kilowatt Software entwickelt wurde und nicht mehr weiter entwickelt wird.[2]

Geschichte

Bearbeiten

Im Jahr 1988 wurde im Rahmen des „Oryx“-Projekt bei IBM unter der technischen Leitung von Simon C. Nash mit der Verschmelzung von Classic Rexx und dem Objektmodell von Smalltalk experimentiert.[3][4] Ziel des Projektes war es, die Vorteile des objektorientierte Paradigmas auf Classic Rexx zu übertragen und gleichzeitig die Benutzerfreundlichkeit von Classic Rexx in die Welt der OOP zu bringen.[5] Schon früh konzentrierte man sich daher darauf, alles als Objekte zu betrachten, Kapselung, Nachrichtenaustausch, objektbasierte Nebenläufigkeit, Klassen und Vererbung.[6]

 
IBM Object REXX (bis 2004)

Diese anfängliche Arbeit führte später unter der Leitung von Rick McGuire zum ersten Prototyp von Object REXX, der 1992 vorgestellt wurde. Im Jahr 1994 kündigte IBM an, dass Object REXX den Classic Rexx Interpreter in der nächsten Version von OS/2 ersetzt.[4] Objekt REXX wurde 1996 offiziell als Teil des Betriebssystems OS/2 Warp 4 veröffentlicht.[7] Im Folgejahr kamen Versionen für Windows 95, Windows NT und Linux auf den Markt.[8][9] Eine Version für AIX V4.1.5+ wurde 1999 eingeführt, und Versionen für zLinux und Sun/Solaris folgten im Jahr 2000.[10] Das letzte Update für Windows 2000, Windows Me, Windows 98 und Windows NT 4.0 wurde 2001 herausgegeben.[11]

Am 12. Oktober 2004 kündigte IBM die Einstellung von Object REXX an und übertrug den Quelltext und die Lizenzrechte an die Rexx Language Association (RexxLA). Der von IBM freigegebene Quelltext enthielt nicht die nötigen Klassen für die Unterstützung des IBM System Object Model (SOM) und der Workplace Shell (WPS). Die letzte OS/2-Version von Object REXX enthält diese nötigen Klassen, welche auch für die Nachfolgeprodukte von OS/2, eComStation und ArcaOS, lauffähig sind.[12][13][14]

 
Open Object Rexx (ab 2005)

Im Jahr 2005 veröffentlichte die RexxLA mit ooRexx 3.0.0 eine neue Inkarnation von Object REXX unter der Common Public License.[15] Der Quelltext dieser Version wurde stark überarbeitet, um die Lesbarkeit zu verbessern. Später wurde der ooRexx-Kernel in C++ umgeschrieben, und eine neue Architektur und native Schnittstellen unter der technischen Leitung von Rick McGuire entworfen und umgesetzt. Diese Arbeit ermöglichte es der RexxLA, ooRexx 4.0.0 mit 64-Bit Unterstützung im Jahr 2009 zu veröffentlichen. Die RexxLA entwickelt und pflegt weiterhin ooRexx, Classic Rexx (Regina) sowie NetRexx und organisiert jährlich internationale Symposien.[16]

Versionsüberblick

Bearbeiten

Die folgende Tabelle gibt einen Überblick über die wichtigsten Versionen von Object REXX und ooRexx. Alle veröffentlichten ooRexx-Versionen und die dazugehörige Dokumentation sind auf Sourceforge frei verfügbar.[17][18] Für Arch Linux basierte Distributionen sind die aktuelle und die Entwicklungsversion jeweils als Arch User Repository verfügbar. Seit Version 5.0.0 gibt es portable Versionen des Interpreters, die ohne Installation verwendet werden können. Für IntelliJ IDEA bietet das ooRexxPlugin Unterstützung für Syntaxhervorhebung, Syntaxprüfung, Autovervollständigung und Dokumentation unter Verwendung von Annotationen nach dem Vorbild von Javadoc.[19]

Version Veröffentlichung Anmerkungen
Ältere Version; nicht mehr unterstützt: Object REXX
1.0.0
(OS/2)[7]
25. Sep. 1996
  • Erste offizielle Veröffentlichung als Teil von OS/2 Warp 4
  • Unterstützung für objektorientiertes Paradigma
  • Konzepte wie SELECT, DO Schleifen, IF-THEN-ELSE Verzweigungen
  • Unterstützung von Prozedur- und Funktionsaufrufen, Stems und zusammengesetzten Variablen
  • Bietet Array-Verarbeitung, Arithmetik und integrierte Funktionen
  • Enthält Schnittstellen zu DB2, TCP/IP-Sockets und C-Anwendungen
Ältere Version; nicht mehr unterstützt: Object REXX
1.0.0
(Windows)[8]
28. Feb. 1997
  • Erste Veröffentlichungen für Windows
  • Development Edition (30. Mai 1997) bietet zusätzlich eine Dialogbibliothek und einen Dialogeditor sowie einen eingebauten Tokenisierer
Ältere Version; nicht mehr unterstützt: Object REXX
1.1.0
(AIX)[10]
9. Apr. 1999
  • Erste Veröffentlichung für AIX V4.1.5
  • Hinzufügung einer Bibliothek für das Filetransferprotokoll (FTP)
Ältere Version; nicht mehr unterstützt: Object REXX
2.1.0
(Windows)[11]
21. Apr. 2001
Ältere Version; nicht mehr unterstützt: ooRexx
3.0.0[20][21]
30. März 2005
  • Erste Veröffentlichung als Open Source
  • Enthält eine Erweiterungsklasse für reguläre Ausdrücke und ooDialog 3.0.0
  • Verbesserte PDF-Dokumentation
Ältere Version; nicht mehr unterstützt: ooRexx
3.1.0[20]
21. Aug. 2006
  • Verschiedene Erweiterungen
  • Gesonderte Dokumentation für ooDialog
Ältere Version; nicht mehr unterstützt: ooRexx
3.1.1[20]
23. Nov. 2006
  • Unterstützung für Linux, Windows, AIX und Solaris
  • Zusätzliche Methoden für verschiedene Klassen und neue Funktionen für die RexxUtil-Bibliothek
  • Hinzufügung der Klasse CircularQueue
Ältere Version; nicht mehr unterstützt: ooRexx
3.1.2[20]
17. Sep. 2007
  • Unterstützung für MacOS
  • Zusätzliche Methoden für die Klassen MutableBuffer, String und Object
  • Enthält eine Schnittstelle zu Open Office
Ältere Version; nicht mehr unterstützt: ooRexx
3.2.0
22. Jan. 2008
  • Verschiedene Erweiterungen
Ältere Version; nicht mehr unterstützt: ooRexx
4.0.0[22]
30. Sep. 2009
  • Unterstützung für 64bit-Versionen von Linux, AIX und Windows
  • Unterstützung für WSH-Engine eingestellt
  • Verbesserte C++-Anwendungsprogrammierschnittstelle
  • Hinzufügen der Klassen Buffer, IdentityTable, Orderable, Package, Pointer, RexxContext, Routine, WeakReference und SocketClass
  • Neue Methoden für die Klassen RexxQueue, Object, DateTime, Method, Stem, String, MutableBuffer und OLEObject
  • Zusätzliche Klassen und Methoden für ooDialog
  • Hinzufügung von Beispielprogrammen und separater Dokumentation für die Windows-Erweiterungsbibliothek
Ältere Version; nicht mehr unterstützt: ooRexx
4.1.0[23]
28. Sep. 2011
  • Hinzufügen der RxUnixSys-Bibliothek und der ooSQLite-Erweiterung[24]
  • Verbesserung der TCP/IP socket und ooDialog Unterstützung
  • Hinzufügen der Klasse File und neuer Methoden für die Klasse DateTime
  • Hinzufügung von Erweiterungsklassen für den Umgang mit CSV, Multipurpose Internet Mail Extensions und dem Simple Mail Transfer Protocol
  • Separate Dokumentation für die Rexx- und die Unix-Erweiterungsbibliothek (RxUnixSys)
Ältere Version; nicht mehr unterstützt: ooRexx
4.2.0[25]
23. Feb. 2014
  • Mehr als 43 Verbesserungen (z. B. Tracing)
  • Eigenständiges Installationsprogramm für ooDialog 4.2.3 und mehrere neue Klassen und Methoden
  • Systemd-Unterstützung und Konformität mit Linux Standard Base
  • Neue Methoden für die Klassen Relation, OrderedCollections, Array, String, Mutablebuffer, StackFrame, Queue und OrderedCollection
  • Separate Dokumentation für die externe Bibliothek ooSQLite
Aktuelle Version: ooRexx
5.0.0[26]
22. Dez. 2022
  • Insgesamt 86 neue Funktionen und 76 Erweiterungen
  • Hinzufügen der Klassen AlarmNotification, Json, MessageNotification, RexxInfo, StringTable und Validate
  • Neue Methoden für die Klassen Alarm, Class, Collection, Directory, Message, Method, MutableBuffer, Object, Package, Routine, String und RxFtp
  • Separate Dokumentation ooRexxUnit (Modultest-Framework), orxnCurses (ncurses-Bibliothek), C/C++-APIs und die Release- und Build-Umgebung
Vorabversion: ooRexx
5.1.0
19. Sep. 2024
  • Hinzufügung der TraceObject-Klasse zur Unterstützung der Überwachung von Multithreading-Programmen
Legende:
Alte Version
Ältere Version; noch unterstützt
Aktuelle Version
Aktuelle Vorabversion
Zukünftige Version

Sprachdesign

Bearbeiten

Das Sprachdesign von ooRexx folgt der Philosophie von Classic Rexx, die darauf abzielt, eine „menschenzentrierte“ Programmiersprache anzubieten, die leicht zu erlernen, zu programmieren, zu merken und zu pflegen ist. Diese Ziele werden zum Teil dadurch erreicht, dass der Sprachumfang klein gehalten wird und die Sprache dem Principle of Least Surprise folgt.[2][27] Eine lesbare Syntax wird durch das Ignorieren von Groß- und Kleinschreibung, freie Formatierung, die Verwendung weniger Interpunktion und Anweisungen in einfachem Englisch ermöglicht.[27] Außerdem handelt es sich um eine dynamische Programmiersprache, was Flexibilität ermöglicht und es erlaubt, sich auf die Entwicklung und nicht auf sprachliche Beschränkungen zu konzentrieren. Dem Designprinzip „Dokumentation vor Implementierung“ folgend, bietet ooRexx eine umfassende Dokumentation gemäß dem IBM Style Guide, mit Syntaxdiagrammen und Beispielen.[27][28]

Anweisungen

Bearbeiten

Wie in Classic Rexx gibt es Zuweisungs-, Schlüsselwort- und Befehlsanweisungen. Im Einklang mit dem Ziel, die Sprache klein zu halten, hat ooRexx 5.0.0 nur dreißig Schlüsselwortanweisungen.[28] Im Gegensatz zu vielen anderen Sprachen sind keine Schlüsselwörter reserviert, so dass es nicht notwendig ist, eine reservierter Wörter vorab zu lernen.[29] Wenn eine Anweisung weder als Zuweisungs- noch als Schlüsselwortanweisung erkannt wird, gilt sie als Zeichenkette oder, falls es sich um einen gültigen Befehl handelt, als Befehlsanweisung und wird zur Ausführung an das Betriebssystem übergeben. Nach der Ausführung wird die Variable RC mit dem Rückgabewert gefüllt. Darüber hinaus ermöglicht die Anweisung ADDRESS die Umleitung von Befehlen in bestimmte Befehlsumgebungen wie Bourne Shell, Bash, Z-Shell, CMD oder einige Editoren wie ISPF, TSO EDIT, XEDIT und andere. Mit ADDRESS können auch Fehler abgefangen werden.

a = "Hallo Welt"            /* Zuweisungsanweisung                   */
do i = 1 to 2               /* Stichwortanweisung "DO"               */
  say "Runde #" i":" a      /* Stichwortanweisung "SAY"              */
end                         /* Stichwortanweisung "END"              */
"echo Hallo Welt"           /* Befehl an das Betriebssystem          */
say "RC:" rc                /* numerische Rückgabewert des Befehls   */

Zusätzlich zu den drei Anweisungstypen von Classic Rexx fügt ooRexx Direktiven hinzu, die am Ende des Quelltextes platziert werden müssen. Nach dem Laden und Prüfen der Syntax führt der Interpreter alle definierten Direktiven aus, um die Ausführungsumgebung einzurichten, bevor er weitere Anweisungen verarbeitet werden. Direktiven können verwendet werden, um Routinen, Klassen, Methoden, Attribute oder Ausführungsoptionen wie zum Beispiel die Genauigkeit der Arithmetik zu definieren. Um Direktiven leicht erkennbar zu machen, werden sie mit zwei aufeinander folgenden Doppelpunkten (::) eingeleitet.[28]

Um die Wiederverwendbarkeit von Code zu erleichtern, ermöglicht die ::REQUIRES Direktive die Integration eines anderen Rexx-Programms (auch als Paket bezeichnet) oder einer externen (nativen) Bibliothek. Diese Direktive veranlasst den Interpreter, jede Routine und Klasse, welche die PUBLIC Option spezifiziert, direkt zugänglich zu machen. Externe Pakete verwenden üblicherweise die Dateierweiterung .cls, zum Beispiel ::requires "csvstream.cls" oder ::requires "json.cls". Einige externe Pakete und Bibliotheken werden mit dem ooRexx-Interpreter ausgeliefert.

Freie Formatierung

Bearbeiten

Die Positionierung des Quelltextes ist bei ooRexx irrelevant, was ein hohes Maß an Flexibilität ermöglicht. Vor der Ausführung fügt der Interpreter mehrere nicht in Anführungszeichen stehende Leerzeichen zu einem zusammen, während eine in Anführungszeichen (einfach oder doppelt) eingeschlossene Zeichenkette nicht verändert wird. Zur Verkettung können zwei senkrechte Linien (||), die Trennung von Begriffen mit Leerzeichen oder aneinanderstoßende Begriffe verwendet werden. Optional können Codezeilen auf mehrere Zeilen verteilt werden, indem das Komma (,) oder das Minuszeichen (-) als Fortsetzungszeichen verwendet wird. Außerdem können mehrere Zeilen durch ein Semikolon (;) in einer einzigen Zeile zusammengefasst werden.[28] Da durch freie Formatierung weniger syntaktische Regeln berücksichtigt werden müssen, wird davon ausgegangen, dass dies den Lernaufwand reduziert, indem die intrinsische kognitive Belastung verringert wird.[30]

say   "Hallo Welt!"         /* Ausgabe: Hallo Welt!!                        */
say "   Das"     'ist' -    /* nachfolgender Strich für die Weiterführung   */
        "REXX"   || "!"     /* Ausgabe:    Das ist REXX!                    */

Case-insensitive

Bearbeiten

Wie bei Classic Rexx spielt auch bei ooRexx die Groß- und Kleinschreibung keine Rolle. Der Interpreter macht automatisch alle Zeichen außerhalb von Anführungszeichen groß, bevor er diese ausführt. Da nicht zwischen Groß- und Kleinbuchstaben unterschieden werden muss, müssen weniger zusätzliche Details erlernt werden, was Syntaxfehler verhindern kann.[30]

a = "Das ist REXX!"
Say A                       /* Ausgabe: Das ist REXX!  */
SAY a                       /* Ausgabe: Das ist REXX!  */

Alles ist ein Objekt

Bearbeiten

Während Classic Rexx der „Alles ist eine Zeichenkette“ Philosophie folgt und Zeichenkette als einzigen Datentyp hat, betrachtet ooRexx alles als Objekte, einschließlich Zeichenketten, Arrays, Streams und viele andere. Objekte werden mit Methoden anstelle von traditionellen Funktionen manipuliert. In ooRexx ist eine Variable, die eine Zeichenkette enthält, ein Verweis auf ein Zeichenketten-Objekt. Dieses Objekt muss nicht deklariert werden, was den Aufwand im Vergleich zu streng typisierten Sprachen reduziert.[31] Ein Zeichenketten-Objekt kann beliebige Zeichen enthalten, einschließlich numerischer Werte. Es ist daher möglich, numerische Werte mit Methoden der Zeichenketten-Klasse (String) zu manipulieren. Darüber hinaus kann eine Zeichenkette jeden Art von Ausdruck enthalten, einschließlich ausführbarer Anweisungen, welche mit dem Schlüsselwort INTERPRET ausgeführt werden können.[28]

a = 2                               /* Zeichenkette mit numerischem Wert    */
a = a || '0'                        /* resultierende Zeichenkette: 20       */

str = "do i = 1 to "a"; say i; end" /* Zeichenkette mit Schleifenanweisung  */
interpret str                       /* Interpretieren: Zählen bis 20        */

Nachrichten-Paradigma

Bearbeiten

Ähnlich wie bei dem von Alan Kay in Smalltalk implementiertem Nachrichten-Paradigma kann mit Objekten durch die Benennung von Methoden mit Hilfe von Nachrichten kommuniziert werden.[29] Im Gegensatz zu Smalltalk gibt es einen expliziten Nachrichtenoperator, die Tilde (~), mit dem Empfangsobjekt links davon und dem Ergebnis der Operation als Rückgabe. Das Versenden einer Nachricht führt zur Aktivierung einer Methode mit dem entsprechenden Methodennamen und zur Manipulation des empfangenen Objekts. Wie bei Smalltalk können Nachrichten kaskadiert werden, wenn zwei Tilden (~~) statt einer verwendet werden, wobei das empfangende Objekt und nicht das erzeugte Ergebnis zurückgegeben wird.[32]

Das Grundverhalten der meisten Methoden kann durch Angabe einer Option geändert werden. Diese Option kann entweder ausgeschrieben oder abgekürzt werden und auch hier spielt die Groß- und Kleinschreibung keine Rolle. Dies ermöglicht beim Lesen von Code ein wortgetreues Verständnis und verringert den Lernaufwand für Anfänger, da die Bedeutung von Abkürzungen nicht gelernt werden muss.[30] Die Methode mit dem Namen Strip entfernt standardmäßig führende und nachgestellte Leerzeichen. Dieses Verhalten kann zum Beispiel durch die Angabe von „leading“ oder „l“ als Option geändert werden. Während Funktionen in Classic Rexx verschachtelt sind, können Nachrichten in ooRexx verkettet werden, was die Lesbarkeit verbessert.[29]

a = "   Ich bin ooRexx!"
say a                           /* Ausgabe:    Ich bin ooRexx! */
say a~Strip("Leading")          /* Ausgabe: Ich bin ooRexx!    */
say a~strip("l")~reverse        /* Ausgabe: !xxeRoo nib hcI    */

Plattformübergreifende Interoperabilität

Bearbeiten

ooRexx ist so konzipiert, dass alle Merkmale von Classic Rexx beibehalten werden und entspricht im Wesentlichen dem ANSI-Standard für die Rexx-Sprache (X3.274-1996, „Programming Language REXX“).[1] Entgegen einer optionalen Spezifikation im Standard erlaubt ooRexx keine Zeichen wie @, #, $ und ¢ in Symbolen. Während der Ausdruck b. = a. in Classic Rexx dazu führt, dass b. dem Wert enthalten in a. zugewiesen wird, macht ooRexx b. zu einem Alias für a.. Außerdem erlaubt ooRexx -- als Kommentarzeichen und - als Fortsetzungszeichen, was nicht im Standard spezifiziert ist.[1]

Rexx-Skripte laufen in der Regel ohne Änderungen unter ooRexx, so dass eine Migration zur OOP leicht möglich ist, ohne dass die in den ursprünglichen Code investierte Zeit verloren geht.[2] Da der Interpreter eine große Anzahl an Plattformen und Betriebssysteme unterstützt, ist eine Migration auf diese möglich.

Merkmale

Bearbeiten

Insbesondere hat ooRexx objektorientierte Merkmale wie Vererbung, Polymorphismus, Datenkapselung und Mehrfachvererbung über Mixin-Klassen. Der Interpreter enthält das Dienstprogramm rexxc, das es ermöglicht, ooRexx-Programme zu kompilieren und optional als Base64 zu kodieren, was den Programmstart beschleunigt, da das erste Parsen und Kompilieren bereits erfolgt ist.[32]

Die PARSE Schlüsselwortanweisung ermöglicht es, eine Zeichenkette schnell und flexibel zu zerlegen und Teile davon in einem einzigen Schritt verschiedenen Variablen zuzuweisen.[2] Die nachfolgende Anweisung spezifiziert die Quelle der zu zerlegenden Zeichenkette, so zum Beispiel ARG für Argumente die beim Aufruf eines Programms oder einer Funktion gelistet werden, VAR für Variablen, PULL für Warteschlangen oder den Standard-Input (typischerweise die Tastatur) und VALUE für einen beliebigen Ausdruck. Bei der Verwendung von VALUE ist das Schlüsselwort WITH erforderlich, um das Ende eines Ausdrucks anzugeben, gefolgt von einem Parsing-Muster. Ein solches Muster kann eine Liste von Variablen, Positionsnummern oder buchstäblichen Begrenzungszeichen sein; es ist möglich, diese Muster in Kombination zu verwenden.[28]

str = "Person: Rick McGuire"
/* Parsen der Zeichenkette mit dem Literal „:“ und Leerzeichen zwischen den
   Wörtern in die Variablen a ("Person"), b ("Rick"), und c ("McGuire")      */
parse var str a ":" b c         /* Parsen nach Literal und Leerzeichen       */
say b c                         /* Ausgabe: Rick McGuire                     */

Prozedur und Funktion

Bearbeiten

ooRexx bietet die Möglichkeit, mit der ::ROUTINE Direktive Prozeduren und Funktionen zu definieren, die nicht klassengebunden sind. Die CALL Anweisung kann verwendet werden, um eine Routine als Prozedur aufzurufen. Darüber hinaus können Routinen, die mit Hilfe der RETURN Schlüsselwortanweisungen Werte zurückgeben, über Funktionsaufrufe aktiviert werden, indem der Name der Routine, gefolgt von Klammern, angegeben wird. Der Inhalt der Klammern wird als Argument an eine Routine übergeben. Mit der PARSE Anweisung können die empfangenen Argumente zerlegt und Variablen zugewiesen werden.[28]

call MacheEtwas                     /* "CALL" Stichwortanweisung        */
Summe = MeineFunktion("2","4")      /* Funktionsaufruf                  */
say Summe                           /* Ausgabe: 6                       */

::Routine MacheEtwas                /* "ROUTINE" Direktive (Prozedure)  */
  say "Ich habe was getan!"         /* Ausgabe: Ich habe was getan!     */

::Routine MeineFunktion             /* "ROUTINE" Direktive (Funktion)   */
  parse arg FirstVar, SecondVar     /* Argumente an Variablen zuweisen  */
  Summe = FirstVar + SecondVar      /* Berechnung durchführen           */
  return Summe                      /* "RETURN" Ergebnis                */

Klasse und Methode

Bearbeiten

Die Anweisung ::CLASS gefolgt von einem Klassennamen veranlasst den Interpreter, eine neue Klasse zu definieren. Nach dem Klassennamen können Optionen wie METACLASS, SUBCLASS, MIXINCLASS, ABSTRACT und INHERIT gesetzt werden. Die ::METHOD Direktive kann verwendet werden, um eine neue Klassenmethode zu definieren, die mit der vorangegangenen ::CLASS Direktive verknüpft ist. Die ::ATTRIBUTE Anweisung wird verwendet, um eine Zugriffsfunktion zum Abrufen oder Zuweisen einer Objektvariablen zu definieren. Mit EXPOSE kann eine Objektvariable direkt einer Methode zugänglich gemacht werden.[28]

d = .dog~new("Bella")           /* einen Hund anlegen und zuweisen  */
d~bark                          /* Bellen Nachricht senden          */
say d~name                      /* Ausgabe: Bella                   */

::class dog                     /* "CLASS" Direktive                */
::attribute name                /* "ATTRIBUTE" Direktive            */
::method init                   /* Objektinitiierungsmethode        */
  Expose name                   /* enthüllt den Namen des Hundes    */
  Parse arg name                /* weist "Bella" als Namen zu       */
::method bark                   /* "METHOD" Direktive               */
  Expose name
  say Name "macht wuff!"        /* Ausgabe: Bella macht wuff!       */

Multi-threading

Bearbeiten

ooRexx implementiert objektbasierte Nebenläufigkeit, bei welcher Objekte über unabhängige Ressourcen zur Ausführung von Methoden verfügen. Mehrere Objekte können gleichzeitig aktiv sein und Nachrichten zur Synchronisation austauschen.[28] Um Nebenläufigkeit zu erreichen, kann die REPLY Anweisung verwendet werden, die eine frühzeitige Rückkehr aus einer Methode bewirkt, während ihr Rest in einem neuen Thread weiter ausgeführt wird. Darüber hinaus kann die GUARD Anweisung verwendet werden, um eine Methode als ungeschützt festzulegen, so dass sie zusammen mit anderen Methoden der gleichen Klasse ausgeführt werden kann. Schließlich ermöglicht die Verwendung der START Methode (Object oder Message Klasse) dem Empfänger, eine empfangende Nachricht in einem separaten Thread zu verarbeiten.[28]

Wie in Classic Rexx kann sowohl das Schlüsselwort TRACE als auch die eingebaute Funktion TRACE() für die Fehlersuche verwendet werden. Der Detaillierungsgrad lässt sich steuern und das interaktive Debugging kann zur Laufzeit aktiviert werden.[33] Während des interaktiven Debuggings hält der Interpreter nach den meisten zu überwachenden Anweisungen an.[28] ooRexx 5.1.0 führt die Klasse TraceObject ein, die zusätzliche Informationen wie Zeitstempel, Interpreter-Instanzen, Thread-IDs, auf denen Nachrichten versendet werden, und den Zustand der Guard Locks für das Tracing von Multi-Thread-Programmen liefert. Mit dieser Klasse lässt sich leichter feststellen, welche Methode gerade bewacht und blockiert wird.[33]

Integrierte Funktionen und Klassen

Bearbeiten

Da ooRexx darauf abzielt, mit Classic Rexx kompatibel zu sein, sind dessen integrierte Funktionen weiterhin verfügbar.[32] Release 5.0.0 enthält 82 Funktionen, einschließlich Zeichenmanipulation, Konvertierung und Informationsfunktionen, von denen viele Methoden der String Klasse aufrufen. Darüber hinaus bietet die mitgelieferte Bibliothek RexxUtil 29 plattformübergreifende, 25 Windows-spezifische und vier Unix-spezifische Funktionen zur Manipulation von Systemdateien, Verzeichnissen, Klassen und Objekten.[28] Im Einklang mit seinen objektorientierten Wurzeln stellt ooRexx den Großteil seiner Funktionalität über eingebaute Klassen und Methoden zur Verfügung. ooRexx 5.0.0 wird mit insgesamt 57 Klassen ausgeliefert, die in die Klassengruppen Fundamental, Stream, Collection und Utility unterteilt sind.[28]

Fundamental

Bearbeiten

Klassen dieser Gruppe sind die wesentlichen Bausteine aller anderen Klassen. Die Klasse Object ist die Wurzel der Klassenhierarchie, so dass ihre Methoden und Attribute für alle instanziierten Objekte jeder Klasse verfügbar sind. Die Metaklasse Class dient zur Verwaltung der Eigenschaften andere Klassen (z. B. ihrer Methodenobjekte) und wird zur Erzeugung von Instanzen (Objekte) verwendet. Daher wird für jede ::CLASS Direktive eine Instanz dieser Klasse (auch Klassenobjekt genannt) erzeugt.[28] Der Zweck der Method Klasse und der Routine Klasse besteht darin, Methoden- oder Routinenobjekte zu erzeugen. Die Klasse String bietet Methoden für die Verarbeitung von Zeichenketten, wie z. B. logische Operationen, Verkettung, Kopieren, Verbinden, Aufteilen, Umkehren, Arithmetik, Konvertierung usw.[32] Eine Instanz der Klasse Package enthält alle Routinen, Klassen und Methoden und verwaltet externe Abhängigkeiten, welche durch die ::REQUIRES Direktiven inkludiert werden. Die Klasse Message ermöglicht das asynchrone Versenden von Nachrichten, was die gleichzeitige Ausführung von Methoden ermöglicht.[28][32]

Stream-Klassen erleichtern die Kommunikation mit externen Objekten wie Dateien, Warteschlangen, seriellen Schnittstellen und Geräten. Die Stream Klasse selbst ist eine Mixin-Klasse, die vererbt werden kann und eine Unterklasse der Klassen InputOutputStream, InputStream und OutputStream ist.[28] Die Klasse Stream bietet Methoden zum Öffnen, Lesen, Schreiben und Schließen von Streams und zum flushen von Puffern, zum Festlegen des Dateispeicherorts, zum Abrufen von Informationen und zu anderen Stream-bezogenen Operationen. Während die OPEN Methode den Stream öffnet, kann die ARRAYIN Methode verwendet werden, um seinen Inhalt in ein Array-Objekt zu lesen. Die CLOSE Methode schließt einen Stream explizit, bevor das Stream-Objekt vom Garbage Collector zurückgefordert wird.[28][32]

StreamObj = .stream~new("eineDatei.txt")    /* Stream-Objekt erstellen  */
StreamObj~open                              /* den Stream öffnen        */
DateiInhalt = StreamObj~ArrayIn             /* Inhalt lesen             */
StreamObj~close                             /* den Stream schließen     */

say DateiInhalt                             /* Ausgabeinhalt            */

Collection

Bearbeiten

Eine Sammlung ist ein Objekt, das mehrere Elemente mit zugehörigen Indizes enthält, die das Abrufen von Elementen mit den Methoden AT oder [] ermöglichen. Es gibt die Klassen MapCollection, SetCollection und OrderedCollection, welche die Manipulation eines bestimmten Sammlungstyps ermöglichen.[32]

Eine MapCollection ist eine Mixin-Klasse, die Methoden für Sammlungen definiert, die von einem Index auf einen Wert mappen. Die Klassen Directory, StringTable, IdentityTable, Properties, Table, Relation und Stem erben diese Methoden.[28] Ein Directory- oder StringTable-Objekt ist eine Sammlung von eindeutigen String-Indizes. In einem IdentityTable-Objekt ist jedes Element mit einem einzigen Index verbunden, und es kann nur ein Element für jeden Index geben. Das Properties-Objekt bietet spezielle Methoden zum Speichern und Laden von Eigenschaften in Dateien. Im Gegensatz zu einem Table-Objekt, das keine doppelten Indizes enthalten kann, ist ein Relation-Objekt eine Sammlung, in der Elemente denselben Index haben können, der von jedem Objekttyp sein kann.

Ein Stem-Objekt wird automatisch erstellt, wenn eine zusammengesetzte Variable verwendet wird. Wie in Classic Rexx besteht eine solche Variable aus einem Stamm und einem Endteil, getrennt durch einen Punkt (.). Während der Stamm mit einem Buchstaben beginnen muss, kann das Ende ein beliebiges Zeichen sein. Die Verwendung eines numerischen Endes erzeugt den gleichen Effekt wie ein Array, während mehrere numerische Enden verwendet werden können, um ein multidimensionales Array zu erzeugen.[28][32]

Obst.1 = "Apfel"          /* Zuweisung an Stem-Variable */
Obst.4 = "Orange"         /* Zuweisung an Stem-Variable */
say Obst.4                /* Ausgabe: Orange            */
say Obst.[1]              /* Ausgabe: Apfel             */

SetCollections sind spezielle Typen von MapCollections, bei denen der Index und das Element dasselbe Objekt sind. Während die Indizes in einem Set-Objekt eindeutig sind, kann jeder Index mehr als einmal in einem Bag-Objekt vorkommen.[28] Eine OrderedCollection ist eine Mixin-Klasse, die die grundlegenden Methoden für alle Sammlungen definiert, die eine inhärente Indexreihenfolge haben, wie zum Beispiel List, Queue, CircularQueue und Array. Ein Liste-Objekt ermöglicht das Hinzufügen neuer Elemente, für die jeweils ein neuer Index erstellt wird, an jeder Position in einer Sammlung. Der zugehörige Index bleibt für dieses Element unabhängig von anderen Hinzufügungen oder Entfernungen gültig. Bei einem Queue-Objekt können Elemente vom Anfang der Warteschlange entfernt und an das Ende oder den Anfang hinzugefügt werden. Ein CircularQueue-Objekt ist eine Warteschlange mit einer vordefinierten Größe. Sobald das Ende der CircularQueue erreicht ist, werden neue Elemente am Anfang eingefügt, um die vorhergehenden Elemente zu ersetzen.[28][32] Ein Array ist eine sequentielle Sammlung, die nach ganzzahligen Indizes geordnet ist. Wie einige andere Sammlungsklassen bietet die Klasse Array die Methode MAKESTRING, um ihre Elemente als Zeichenkette zu kodieren.[28]

ArrayObj = .array~of("Einz", "Zwei", "Drei")    /* Array mit 3 Elementen      */
say ArrayObj~at(2)                              /* Ausgabe: Zwei              */
say ArrayObj~makeString(,"; ")                  /* output: Einz; Zwei; Drei   */

Es gibt 31 Utility-Klassen, die Implementierungen für allgemeine Aufgaben bieten. Die Klasse MutableBuffer ermöglicht eine größere Effizienz bei Zeichenketten-Operationen wie der Verkettung, da kein neues Objekt zugewiesen werden muss. Die Klasse File bietet Methoden für das Auflisten von Dateien in einem Verzeichnis oder das Abrufen von Informationen über Dateien und Verzeichnisse.[28]

FileObj = .File~new("~/einOrdner/")   /* Datei-Objekt für Ordner erstellen   */
FileArr = FileObj~ListFiles           /* Array von Dateien abrufen           */

do DateiPfad over FileArr             /* Iteration über die Array-Elemente   */
    say DateiPfad                     /* Ausgabe: DateiPfad-Item             */
end

Die DateTime oder TimeSpan Klassen unterstützen das Abrufen und Formatieren eines Datums, einer Uhrzeit oder eines Zeitstempels in verschiedenen Formaten und ermöglichen arithmetische Operationen zwischen ihnen. Mehrere Comparator-Klassen erleichtern das Sortieren für eingebaute Klassen wie File, DateTime und andere. Die Klasse Supplier und ihre Unterklasse StreamSupplier ermöglichen die Aufzählung einer Elementsammlung zusammen mit einer Indexsammlung. Die Klasse Validate bietet Methoden, mit denen geprüft werden kann, ob gegebene Argumente von der richtigen Klasse und vom richtigen Typ sind oder innerhalb eines numerischen Bereichs liegen. Eine VariableReference-Instanz verwaltet einen Verweis, während eine WeakReference-Instanz einen Verweis auf ein anderes Objekt erzeugt, das nicht gepinnt ist.[28]

Ein regulärer Ausdruck ist ein Muster, das für die Suche von Zeichenketten verwendet werden kann. Um die Lesbarkeit von Mustern im Code zu erhöhen, erlaubt die Klasse RegularExpression die Verwendung von symbolischen Namen, die mit Doppelpunkten (:) gekapselt sind. So kann beispielsweise eine Zeichenkette, die nur Buchstaben enthält, die normalerweise als [A-Za-z] beschrieben wird, mit [:alpha:] abgekürzt werden.[28]

Andere Klassen helfen dabei, über den Kontext des aktuell ausgeführten Codes (RexxContext), die Rexx-Sprache oder die ausführende Plattform (RexxInfo) und Ausführungsspezifika (StackFrame) Informationen zu erhalten. Die Klassen Buffer und Pointer sind speziell für die Unterstützung des Schreibens von Methoden und Funktionen in nativem Code unter Verwendung der C/C++ Programmierschnittstellen konzipiert. Die Klassen Alarm und Ticker bieten Benachrichtigungsfunktionen und die Klassen EventSempahore und MutexSempahore implementieren Synchronisationsmechanismen für Multithreading-Aktivitäten. Die Klasse Monitor ermöglicht die Weiterleitung von Nachrichten an verschiedene Zielobjekte und die Klasse RexxQueue bietet einen objektähnlichen Zugriff auf externe Rexx-Datenwarteschlangen.[28]

Externe Pakete und Bibliotheken

Bearbeiten

Mit der Direktive ::REQUIRES und der Option LIBRARY können externe Bibliotheken in ein Programm integriert werden. Solche Bibliotheken sind normalerweise anhand von bereichsspezifischen Funktionen organisiert.[28]

Die Rexx-Erweiterungsbibliothek bietet Klassen zum Lesen und Schreiben von CSV-Dateien (Comma-Separated Values) sowie zur Erstellung und Verarbeitung von JSON-Daten (JavaScript Object Notation). Außerdem ist eine Bibliothek namens „hostemenu“ enthalten, die teilweise eine TSO/CMS-Umgebung emuliert.[34] Die Bibliothek RxSock ermöglicht die Einbindung von TCP/IP-Protokollen,[35] während die Bibliothek RxFtp[36] speziell den Zugriff auf das FTP-Protokoll ermöglicht. Die native Bibliothek RxMath bietet erweiterte mathematische Funktionen wie Quadratwurzelberechnung, Exponentialfunktion, Logarithmus, Sinus, Kosinus, Tangens, Arcussinus und Potenzberechnung.[37]

Say rxcalcsin(1)                /* Ausgabe: 0.0174524064        */

::requires 'rxmath' LIBRARY     /* eine native Bibliothek laden */

Für Windows ist das ooDialog-Framework enthalten, mit dem Windows-Dialoge und damit grafische Benutzeroberflächen erstellt werden können.[38] Der Interpreter wird mit mehreren Beispielprogrammen und Funktionspaketen ausgeliefert, die die Verwendung dieses Frameworks demonstrieren.[32] Für POSIX-kompatible Betriebssysteme ermöglicht die orxnCurses-Klassenbibliothek das Schreiben von zeichenorientierter Benutzerschnittstellen unter Verwendung der ncurses-Programmierbibliothek.[39] Die RxUnixSys-Bibliothek bietet auf den meisten Unix-Systemen Funktionen für die Interaktion mit Prozessen und Threads, Benutzern und Benutzergruppen, Dateien und Dateisystemen und anderen.[40] Viele dieser externen Pakete und Bibliotheken sind auch mit anderen Rexx-Implementierungen kompatibel.

Sprachbrücken

Bearbeiten

Während ooRexx im Vergleich zu Object REXX keine Klassen für SOM- und WPS-Unterstützung mehr enthält, bietet es Programmierschnittstellen zur Interaktion mit in C oder C++ geschriebenem Code.[41] Es gibt auch eine externe Bibliothek, die eine bidirektionale Java-Brücke implementiert, welche die Interaktion zwischen ooRexx und Java ermöglicht.[29] Außerdem werden Klassen zur Automatisierung von Windows-Anwendungen bereitgestellt. Die Klasse ooSQLite bietet eine Schnittstelle zu SQLite, einer prozessinternen Bibliothek, die eine in sich geschlossene, serverlose, konfigurationsfreie, transaktionale SQL-Datenbank-Engine implementiert.[42]

C/C++ APIs

Bearbeiten

Wie Classic Rexx enthält ooRexx Programmierschnittstellen zur Erweiterung von Rexx mit in C geschriebenen Anwendungen und umgekehrt. Dies ermöglicht die Erstellung von Rückruffunktionen für Unterbefehle, die in Rexx-Programmen verwendet werden, die als Makros laufen, externe Funktionen, die eine direkte Erweiterung des ooRexx-Funktionssatzes ermöglichen, und Systemfunktionen, mit denen das Verhalten des Interpreters angepasst werden kann.[41]

Mit ooRexx 4.0.0 wurden Schnittstellen eingeführt, die es C++ Anwendungen ermöglichen, ooRexx zu erweitern und vice versa. Dazu gehören Rückruffunktionen für in C++ geschriebene Methoden und Funktionen, die ooRexx erweitern können und als externe Bibliotheken verpackt sind. Diese werden unter Windows als Dynamic Link Libraries und auf Unix-basierten Systemen als Shared Libraries bezeichnet. Eine externe Bibliothek kann mit der ::REQUIRES Direktive oder mit der EXTERNAL Schlüsselwortanweisung als Teil einer ::ROUTINE, ::METHOD oder ::ATTRIBUTE Direktive geladen werden.

 
Grafische Benutzeroberfläche auf verschiedenen Plattformen (Linux, macOS, Windows)

Unter Verwendung der C++ Schnittstellen wurde BSF4ooRexx als bidirektionale Java-Bridge auf der Grundlage des Bean Scripting Framework entwickelt. Diese Brücke ermöglicht ooRexx die Kommunikation mit Java-Objekten und Java die Interaktion mit Rexx-Anwendungen.[43][44] Die Brücke wird durch das ooRexx-Paket BSF.CLS integriert, welches öffentliche Routinen, Klassen und das Umgebungssymbol .BSF4REXX definiert.[44] Beispiele für die Verwendung von Java-Klassen in Verbindung mit AWT, Swing, JavaFX, JDBC, Java 2D und einigen anderen werden bereitgestellt.[43]

/* Java-Objekt erstellen */
frame=.bsf~new("javax.swing.JFrame", "Hello, my beloved world - from ooRexx!")

frame~setSize(410,20)                       /* Breite und Höhe festlegen	  */
frame~visible=.true                         /* JFrame sichtbar machen     	  */
call SysSleep 10                            /* zehn Sekunden lang schlafen    */

::requires "BSF.CLS"                        /* Java-Unterstützung erhalten    */

Basierend auf BSF4ooRexx wird die Interaktion mit Universal Network Objects (UNO), wie sie in OpenOffice und LibreOffice verwendet werden, über das UNO.CLS Paket unterstützt.[45] Darüber hinaus ermöglicht das CLR.CLS Paket zusammen mit Jini4Net die Nutzung des .NET-Frameworks.[46] Die Kommunikation mit Prozessen über die D-Bus unter Linux ist über das DBUS.CLS Paket möglich.[47]

Windows Automatisierung

Bearbeiten

Die Windows-Erweiterung umfasst die Windows Script Host (WSH) Engine, welche zur Durchführung allgemeiner Automatisierungsaufgaben verwendet werden kann. Diese beinhaltet auch die Unterstützung von Object Linking and Embedding/ActiveX (OLE), was es möglich macht, mit Windows-Programmen über das OLEObject zu interagieren.[48] OLE Automation ist ein von Microsoft entwickelter Interprozess-Kommunikationsmechanismus, der auf einer Teilmenge des Component Object Model (COM) basiert. Dieser Mechanismus ermöglicht unter anderem den Aufruf von Programmfunktionen, das Abfragen und Setzen von Attributen und das Abfangen von Komponentenereignissen. Der ooRexx-Interpreter enthält Beispiele, welche die OLE-Interaktion mit Access, Word, Excel, Active Directory, WMI und anderen Programmen verdeutlichen. Außerdem ist ein Hilfsprogramm für die Suche nach verfügbaren OLE-Objekten enthalten.[32]

exc = .OLEObject~new("Excel.Application")   /* Objekt für Excel erstellen     */
exc~visible = .true                         /* Excel sichtbar machen          */
Worksheet = exc~Workbooks~Add~Worksheets[1] /* Arbeitsblatt hinzufügen        */
Worksheet~cells(1,1)~Value = Erste Zelle  /* Zeichenkette in Zelle einfügen */

Zusätzlich zur OLE-Unterstützung ermöglicht die Windows-Erweiterung die Interaktion mit dem Windows-Programm-Manager, dem System-Ereignisprotokoll, der Zwischenablage und der Registrierungsdatenbank sowie die Abfrage, Bearbeitung und Interaktion mit Fenstern, Menüs oder Untermenüs.[48]

Siehe auch

Bearbeiten

Literatur

Bearbeiten
  • W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Open Object Rexx Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  • W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Programmer Guide. RexxLA, 2022 (sourceforge.net [PDF]).
  • W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Windows Extensions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  • W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Application Programming Interfaces. RexxLA, 2022 (sourceforge.net [PDF]).
  • Howard Fosdick: Rexx Programmer's Reference. 2nd Auflage. Rexx Language Association, 2024, ISBN 978-94-037-4552-7 (rexxinfo.org [PDF]).
  • Rony G. Flatscher: Introduction to Rexx and ooRexx: From Rexx to Open Object Rexx (ooRexx). Mijnbestseller, 2024, ISBN 978-94-037-5503-8.
Bearbeiten

Einzelnachweise

Bearbeiten
  1. a b c X3.274-1996 American National Standards Institute for Programming Language Rexx.
  2. a b c d Howard Fosdick: Rexx Programmer's Reference. 2nd Auflage. Rexx Language Association, 2024, ISBN 978-94-037-4552-7 (rexxinfo.org [PDF]).
  3. 7 Reasons that Rexx Still Matters. In: SmartBear.com. Abgerufen am 19. Juni 2024.
  4. a b IBM Object REXX - EDM2. In: www.edm2.com. Abgerufen am 19. Juni 2024.
  5. Simon C. Nash: Object Oriented REXX. In: Proceedings of the REXX Symposium for Developers and Users. 11. Juni 1990, S. 76–100 (stanford.edu [PDF]).
  6. Simon C. Nash: An Object Rexx Retrospective. In: Proceedings of the 20th Rexx Language Symposium. 21. Mai 2009 (rexxla.org [PDF]).
  7. a b IBM Object REXX for OS/2 - EDM2. In: www.edm2.com. Abgerufen am 19. Juni 2024.
  8. a b IBM Object REXX Now Runs on Windows NT and Windows 95. IBM, 25. Februar 1997;.
  9. Manfred Schweizer, Uwe Berger: From Object REXX to ooRexx. In: Proceedings of the 16th Rexx Language Symposium. 21. April 2005 (rexxla.org [PDF]).
  10. a b IBM Object REXX for AIX - Object-Oriented Scripting Language for Beginners to Advanced Programmers. IBM, 30. März 1999;.
  11. a b IBM Object REXX for Windows V2R1 - Object-Oriented Programming for Beginners to Advanced Users. IBM, 20. März 2001;.
  12. Willis Boughton: SOM and Object REXX. EDM/2, 2004, abgerufen am 2. Februar 2014.
  13. Object REXX Reference. IBM, Accessing Workplace Shell Objects.
  14. Does ArcaOS include REXX support? Abgerufen am 3. September 2020.
  15. Software withdrawal and service discontinuance: IBM Object REXX. IBM, 12. Oktober 2004;.
  16. RexxLA - Rexx Symposia. In: www.rexxla.org. Abgerufen am 17. Mai 2024.
  17. ooRexx (Open Object Rexx) - Browse /oorexx at SourceForge.net. In: sourceforge.net. Abgerufen am 18. Mai 2024.
  18. ooRexx (Open Object Rexx) - Browse /oorexx-docs at SourceForge.net. In: sourceforge.net. Abgerufen am 18. Mai 2024.
  19. Rony G. Flatscher: The IntelliJ IDEA Plugin ooRexxPlugin 2.2 for Rexx and ooRexx 5.0 
  20. a b c d ooRexx News. In: Sourceforge. Abgerufen am 18. Mai 2024.
  21. Open Object Rexx Reference Version 3.0.0 Edition. RexxLA, 24. März 2005 (sourceforge.net [PDF; abgerufen am 18. Mai 2024]).
  22. ooRexx 4.0.0: Readme. Abgerufen am 18. Mai 2024 
  23. ooRexx 4.1.0: ReleaseNotes. Abgerufen am 18. Mai 2024 
  24. ooSQLite: Readme. Abgerufen am 18. Mai 2024 
  25. ooRexx 4.2.0: Changes. Abgerufen am 18. Mai 2024 
  26. ooRexx 5.0.0: Changes. Abgerufen am 18. Mai 2024 
  27. a b c Mike Cowlishaw: The design of the REXX language. In: ACM SIGPLAN Notices. 22. Jahrgang, Nr. 2, 1987, S. 26–35, doi:10.1145/24686.24687 (acm.org [PDF]).
  28. a b c d e f g h i j k l m n o p q r s t u v w x y z aa W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Open Object Rexx Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  29. a b c d Rony G. Flatscher, Till Winkler: Employing the Message Paradigm to Ease Learning Object-oriented Concepts and Programming. In: In 2024 47th MIPRO ICT and Electronics Convention (MIPRO). S. 1244–1249 (wu.ac.at [PDF]).
  30. a b c Till Winkler, Rony G. Flatscher: Cognitive Load in Programming Education: Easing the Burden on Beginners with REXX. In: Central European Conference on Information and Intelligent Systems. (wu.ac.at [PDF]).
  31. Andreas Stefik, Susanna Siebert: An empirical investigation into programming language syntax. In: ACM Transactions on Computing Education. 13. Jahrgang, Nr. 4, 2013, S. 1–40, doi:10.1145/2534973 (acm.org).
  32. a b c d e f g h i j k W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Programmer Guide. RexxLA, 2022 (sourceforge.net [PDF]).
  33. a b Rony G. Flatscher, Till Winkler: Devising a TraceObject Class for Improved Runtime Monitoring of ooRexx Applications. In: Proceedings of the 7th ACM International Workshop on Verification and Monitoring at Runtime Execution. 2024, S. 19–24 (acm.org [PDF]).
  34. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Rexx Extensions Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  35. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxSock TCP/IP Socket Functions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  36. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxFtp Class Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  37. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 RxMath Math Functions Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  38. W. David Ashley, Rony G. Flatscher, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 4.2.4 ooDialog Reference. RexxLA, 2019 (sourceforge.net [PDF]).
  39. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Erich Steinböck, Jon Wolfers: ooRexx Documentation 5.0.0 nCurses Class Library Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  40. W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Erich Steinböck, Jon Wolfers: ooRexx Documentation 5.0.0 Unix Extensions Function Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  41. a b W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Application Programming Interfaces. RexxLA, 2022 (sourceforge.net [PDF]).
  42. W. David Ashley, Rony G. Flatscher, Rick McGuire, Mark Miesfeld, Lee Peedin, Oliver Sims, Jon Wolfers: ooRexx Documentation 1.0.0 ooSQLite Reference. RexxLA, 2022 (sourceforge.net [PDF]).
  43. a b BSF4ooRexx. In: sourceforge.net. Abgerufen am 10. November 2024.
  44. a b Rony G. Flatscher: The 2009 Edition of BSF4Rexx Part I In: 20th Rexx Language Symposium, RexxLA, 2009 
  45. Christoph Waglechner: OpenOffice.org Automation Using ooRexx Scripting Language by means of Selected Nutshell Examples by Andrew Pitonyak. 2009 (wu.ac.at [PDF]).
  46. Adrian Baginski: A .NET Cookbook Using ooRexx.NET. 2016 (wu.ac.at [PDF]).
  47. Richard Lagler: D-Bus Language Binding for ooRexx: An Introduction on Nutshell Examples. 2015 (wu.ac.at [PDF]).
  48. a b W. David Ashley, Rony G. Flatscher, Mark Hessling, Rick McGuire, Lee Peedin, Oliver Sims, Oliver Sims, Jon Wolfers: ooRexx Documentation 5.0.0 Windows Extensions Reference. RexxLA, 2022 (sourceforge.net [PDF]).