RPG II als Vehikel zur besseren Programmierung:

Strukturierung in jeder Sprache machbar

04.11.1983

Hohe Programmiersprachen wie Pascal und Algol bieten Sprachelemente an, welche die Konstruktionen abbilden können, die während des strukturierten Programmentwicklungsprozesses benutzt werden. Programmierer, die mit Sprachen wie Fortran, Assembler oder anderen nicht strukturierten Sprachen arbeiten, können jedoch mit Hilfe einiger im folgenden vorgestellten Schemata erreichen, daß eine Strukturierung möglich wird.

Bei der Programmentwicklung bietet sich folgende Vorgehensweise an: Der Entwurf wird mit Hilfe einer höheren Programmiersprache erstellt und die einzelnen Strukturen dann in die nicht strukturierte Sprache umgesetzt. Als Beispielsprache wird RPG II verwendet; die Methode ist jedoch auch in jeder anderen Sprache praktikabel. Grundkenntnisse von RPG II werden im Text vorausgesetzt. Eine erste Grundlage strukturierter Programmierung, das Aufteilen eines Programms in zusammengehörige Einheiten, wird in RPG Il durch das Unterprogrammkonzept (BEGSR, ENSDR) realisiert. Eine weitere Möglichkeit der Strukturierung ist nicht gegeben.

Einige in RPG-II-Programmen oft vorkommende Bestimmungen sollen Ausgangspunkt dieser Abhandlung sein (Abb. 1.1 und Abb. 1.2).Das Testen der Bezugszahlen kostet in jeder Bestimmung Rechenzeit. Der dritte Test könnte entfallen, da die Bedingungen gleich dem zweiten Test sind. Ein überspringen beider Bestimmungen, nachdem beim ersten Test die geforderte Bedingung nicht zutrifft, wäre sinnvoll.

Im nächsten Abschnitt werden nun Konstruktionen, wie sie in einer (hypothetischen) hohen Programmiersprache vorkommen können, in RPG II umgeschrieben. Die "Klammerung", welche in der hohen Programmiersprache die Zusammengehörigkeit eines "Blocks" gewährleistet, kann in RPG II durch Marken (labels, tags) und einige wenige Befehle verifiziert werden.

Die IF-Anweisung ermöglicht clie Ausführung einer Folge von Bestimmungen, wenn eine zuvor angegebene Bedingung zutrifft (Abb. 2).Das Testen der Bedingung (IF a kleiner b) wird ersetzt durch eine COMP-Operation, bei welcher die Bezugszahl 27 angeht, wenn a kleiner b ist. Ist dies der Fall, werden die Bestimmungen 1 bis n ausgeführt, andernfalls wird dieser Block übersprungen. Der bedingte Sprung (GOTO, XY100E) entspricht dem THEN, das Sprungziel XY100E dem FI, was Ende von IF bedeuten soll. Um die Klammerung in RPG II zu verdeutlichen, wurde der Beginn der bedingten Anweisung durch eine zusätzliche Marke (XY100B) angezeigt, die aber nicht unbedingt notwendig ist.

Eine Erweiterung der IF-Anweisungen besteht darin, abhängig von einer Bedingung, entweder die eine oder die andere Folge von Bestimmungen auszufahren (Abb. 3).

Die Folge IF - THEN - ELSE - FI (wenn . . dann . . andernfalls . .) wird in gleicher Weise wie das erste Beispiel aufgelöst. Jedoch wird jetzt bei Nichterfüllung der Bedingung in ein anderes Programmstück B verzweigt; bei Erfüllung der Bedingung A wird ausgeführt. A und B stehen im weiteren für eine beliebige Folge von Bestimmungen.

Trifft die Bedingung a<b zu, werden die auf den Vergleich folgenden Bestimmungen ausgeführt, das heißt der Sprung GOTO XY100X findet nicht statt. Am Ende des "IF-Teils" muß ein Sprung auf das Ende der IF-Konstruktion folgen, damit nicht die Befehlsfolge B ausgeführt wird, die ja bei Nichterfüllung der Bedingung durchlaufen werden soll.

Unschwer auflösbar sind auch "geschachtelte IF-Konstruktionen" der Abb. 4.

Um die Schachtelung zu verdeutlichen, wurden die zusammengehörenden Ebenen der hohen Programmiersprache verschieden eingerückt. In RPG II wird die Zusammengehörigkeit durch die Numerierung der Marken (TAG) erreicht: So entspricht dem " äußeren" IF-THEN -ELSE-FI die Klammer XY100B-GOTO XY100E, XY100X-XYl00E, dem inneren entsprechenden XY110B etc.

Die CASE-Anweisung selektiert eine Folge von Bestimmungen in Abhängigkeit vom Wert einer numerischen variablen x: CASE x OF 5: A ; 7: B ; 8: C ELSE Z ESAC

Hat x den Wert 5, werden die Bestimmungen A ausgeführt, bei x=7 B, bei x= 8 C. Hat x keinen der angegebenen Werte werden die "ELSE-Bestimmungen" durchlaufen (Ausnahmefall).

Die Auflösung der CASE-Anweisung kann aussehen wie in Abb. 5.

Die angegebenen Konstruktionen scheinen zwar auf den ersten Blick sehr aufwendig. Diesem scheinbaren Nachteil steht jedoch eine wesentliche Steigerung der Übersichtlichkeit eines RPG Il Programms gegenüber. Werden die Konstruktionen konsequent angewandt wird an jeder Stelle im Programm sofort ersichtlich, um welche Konstruktion es sich handelt. Unkontrollierte Sprünge werden überhaupt nicht zugelassen, weil das "Gerüst" diese nicht benötigt; Sprünge werden nur zur Klammerung verwendet.

Wiederholungsanweisungen sind solche Konstruktionen die eine Folge von Bestimmungen in der Regel mehrere Male durchführen, bis eine bestimmte Bedingung (Ende-Bedingung) eintritt, beziehungsweise eingetreten ist. Der Test, ob die Folge noch einmal dürchgeführt werden soll, kann am Anfang oder am Ende der Bestimmungen erfolgen. Das Verlassen der Schleife geschieht nach diesem Test. Es soll hiermit vermieden werden, daß eine Schleife an beliebiger Stelle verlassen wird.

Die FOR-Anweisung führt Bestimmungen einer vorgegebenen Anzahl von Durchgängen aus. Sie wird beispielsweise beim Füllen von Feldern (Feldgruppen) mit einem Initialisierungswert oder beim Kopieren von Feldern angewandt (Abb. 6).Zuerst müssen der "Index" i mit dem Schleifenstartwert 1 und der "Schleifenendwert" e mit 10 vorbesetzt werden. Am Beginn der Schleife wird überprüft, ob der Index größer als der Schleifenwert ist. Ist dies der Fall, wird die Schleife beendet (Sprung auf XY300E), andernfalls wird sie ein weiteres Mal ausgeführt, Am Schleifenende wird der Index um 1 erhöht (dies geschieht in der hohen Programmiersprache automatisch) und wieder auf den Blockbeginn (XY300B) gesprungen. Insgesamt wird die Schleife im Beispiel also 10mal durchlaufen.Standardmäßig wird eine "Schrittweite" (Erhöhungswert) von 1 angenommen. Die Konstruktion erlaubt aber auch andere:FOR i: = 1 TO 11 BY 2DOF(i): = 0ROF;Hier werden nur die ungeraden Feldgruppenelemente mit 0 initialisiert. Wir führen die Schrittweite s ein: Im RPG II Beispiel wird bei der Vorbesetzung noch ein Z-ADD 2 s zugefügt und am Schleifenende anstatt ADD 1 i, ein ADD s i gesetzt

wird fortgesetzt