REXX (Abk. f. Restructured Extended Executor) ist eine von Mike Cowlishaw bei IBM entwickelte Skriptsprache. Sie sollte (durch Verwendung englischer Wörter) einfach zu lernen sein und es erlauben, möglichst einfach Kommandos an eine oder sogar mehrere Umgebungen (z. B. bei Einsatz als Makrosprache in einem Editor, wobei auch Kommandos an eine Systemshell abgesetzt werden) zu senden.

Den Ursprung hatte REXX unter VM/CMS, einem Großrechner-Betriebssystem der IBM. 1988 fand die Sprache den Weg ins MVS (heute z/OS) und ist mittlerweile auf allen Plattformen vertreten. Einen kostenlosen Download gibt es für die PC-Betriebssysteme; einfach unter "REGINA REXX" googeln.


Grundlegende Konzepte

Bearbeiten

Alles ist ein String

Bearbeiten

In klassischem Rexx (im Unterschied zum hier nicht behandelten, jedoch kompatiblen Objektorientierten Rexx) ist jeder Wert ein String – auch Zahlen! Es ist also ohne weiteres möglich, Zahlenwerte mit String-Manipulationen zu ändern und das Ergebnis sofort wieder als Zahl zu verwenden:

a = 2
a = a || '00'
say a / 2

Durch Anhängen zweier Nullen wird a mit 100 „multipliziert“; das Ergebnis, die Zeichenkette 200, kann sofort wieder als Zahl verwendet werden. Ausgegeben wird 100.

Folgerichtig ist die Arbeit mit Strings in Rexx sehr einfach. Die obige Verkettungsoperation hätte auch

a = a'00'

geschrieben werden können. Ein oder mehrere Leerzeichen zwischen a und '00' hingegen hätten dazu geführt, dass bei der impliziten Verkettung ein Leerzeichen eingefügt worden wäre – was sicher unerwünscht ist, wenn das Ergebnis eine Zahl ist.

Wenn eine Zahl benötigt wird, weil der verwendete Operator mit Zahlen arbeitet, versucht Rexx, die vorliegenden Wert als Zahl zu interpretieren:

say ' 1' + 2

gibt tatsächlich 3 aus.

Im Normalfall rechnet Rexx auf neun Dezimalstellen genau; durch Angabe einer höheren Anzahl kann jedoch fast beliebig genau gerechnet werden. Es liegt nahe, dass diese wenig hardwarenahe Methode Rexx nicht unbedingt als Sprache für sehr rechenintensive Probleme prädestiniert.

Auswertungslogik

Bearbeiten

Rexx wurde u. a. entwickelt, um auf einfache Weise Kommandos an eine Umgebung absetzen zu können. Dies wird unterstützt durch die folgende Strategie bei der Auswertung einer Anweisung, die Rexx-Programme unempfindlich gegenüber neu eingeführten Schlüsselwörtern macht und ein Alleinstellungsmerkmal der Sprache sind:

1. Wenn das zweite Token mit einem Gleichheitszeichen beginnt, handelt es sich um eine Wertzuweisung

Hieraus folgt, dass z. B.

if = 1

ungeachtet des Schlüsselworts if eine gültige Anweisung ist, die der Variablen IF den Wert 1 zuweist!

Hingegen wäre

if == 1

zwar ein gültiger logischer Ausdruck, der prüft, ob die Variable if exakt den Wert 1 hat; als eigenständige Anweisung ergibt sie jedoch einen Syntaxfehler, weil der zuzuweisende Wert = 1 eben kein gültiger Ausdruck ist.

2. Ist das zweite Token ein Doppelpunkt, handelt es sich um eine Marke

Marken werden benötigt, um Prozeduren und Funktionen zu realisieren; diese notiert man in Rexx nach dem „ausführbaren Teil“ des Programms. Beispiel:

say: funk('dir x')
exit
funk: return Arg(1)

Man könnte erwarten, dass dir x zur Standardausgabe ausgegeben wird. Das Schlüsselwort say fungiert hier jedoch nur als Marke; der Ausdruck funk('dir x') bildet schon die nächste Anweisung. Gemäß Regel 4 (siehe unten) wird also funk aufgerufen und dir x zur Ausführung an die Umgebung übergeben. (Es ginge natürlich auch ohne die Funktion funk; dies nur als sehr einfaches Beispiel für einen Funktionsaufruf)

Es ist auch möglich, mit signal value Ausdruck eine bestimmte Marke anzusteuern; dies ist eher unüblich und nur in wenigen Fällen sinnvoll. Wer in REXX die Anweisung SIGNAL wie GOTO benutzt, wird bekommen, was er verdient ;-). Das Ergebnis ist nicht immer vorhersehbar.

3. Wenn das erste Token ein Schlüsselwort ist, erfolgt die Auswertung entsprechend dieser Schlüsselwortanweisung

Solche Schlüsselwörter sind z. B. if, do, say. Man beachte, dass die Auswertung der Schlüsselwörter erst an dritter Stelle günstig im Hinblick auf zukünftige Erweiterungen ist. Zukünftige Versionen der Sprache können so neue Schlüsselwörter einführen, ohne dass existierende Programme überarbeitet werden müssen, sowohl Variablen als auch Marken können ihren Namen behalten.

4. In jedem anderen Fall wird die Anweisung als Ausdruck ausgewertet und das Ergebnis an die Umgebung übergeben

Dies bedeutet, dass die folgende Rexx-Anweisung (unter DOS, Windows, OS/2, …) den Inhalt des aktuellen Verzeichnisses ausgibt:

dir

oder auch:

'dir'

Im ersten Fall ist dir eine Variable; wurde ihr kein Wert zugewiesen, so ist ihr Wert DIR (ihr Name in Großbuchstaben), und es wird DIR an die Umgebung übergeben und ausgeführt. Im zweiten Fall wird garantiert dir übergeben und ausgeführt.

Es könnte natürlich sein, dass eine zukünftige Rexx-Version ein Schlüsselwort dir einführt. Um sicherzugehen, dass das Programm auch dann noch funktioniert, kann z. B. durch

''dir

erzwungen werden, dass die Anweisung als Ausdruck (Verkettung der Variablen mit dem Leerstring) erkannt wird; oder man verwendet einfach die Variante, das Kommando als Stringkonstante zu übergeben.

Symbolnamen

Bearbeiten

Rexx unterscheidet bei syntaktischen Elementen (Schlüsselwörter und Bezeichner) nicht zwischen Groß- und Kleinschreibung; aus Gründen der Lesbarkeit wird hier meist Kleinschreibung bevorzugt. Solange Bezeichnern kein Wert zugewiesen wurde, haben sie als impliziten Wert ihren Namen in Großschreibung.

Bezeichner dürfen aus Buchstaben A bis Z (groß und klein), die Ziffern und einigen Sonderzeichen bestehen; ist das erste Zeichen eine Ziffer oder ein Punkt, handelt es sich um eine Konstante, und eine Zuweisung würde einen Syntaxfehler erzeugen.

AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789@$#_?.

Strings dürfen sowohl durch Quotes (Gänsefüßchen (wie in C)) als auch durch Aposts (Hochkommate (wie in Pascal)) begrenzt werden; das Begrenzungszeichen kann enthalten sein, wenn es gedoppelt wird. Stringliterale müssen vor dem Zeilenende abgeschlossen, können allerdings per Fortsetzungszeichen mit dem Inhalt der nächsten Zeile verkettet werden. Es gibt keine Variablenersetzung innerhalb von Strings und auch keine mit Backslash codierten Zeichen ('\n' usw.).

Folgt nach dem schließenden Begrenzungszeichen der Bezeichner x, so wird der Inhalt als hexadezimaler Code interpretiert und darf deshalb nur Hexadezimalziffern und, zur Gruppierung zwecks besserer Lesbarkeit, Leerzeichen enthalten; entsprechend gibt es Binärstrings mit dem Suffix b.

Kommentare

Bearbeiten

Rexx unterstützt die von C bekannten, durch /* und */ begrenzten Kommentare, die Zeilenumbrüche beinhalten, aber nicht geschachteln werden können.