de.openvms.org - Für die deutschsprachige VMS-Community https://de.openvms.org:443/stories.php?story=09/06/10/4478641

Der OpenVMS-Fachberater: Berechnete GOTOs in DCL
Der OpenVMS-Fachberater - 10-Jun-2009 14:36 UTC
vom OpenVMS-Fachberater Bob Gezelter

Verzweigung auf Basis von mehreren Auswahlmöglichkeiten ist eine der altehrwürdigsten Einrichtungen von Programmiersprachen, seien sie konventionelle oder Skriptsprachen, interpretiert oder kompiliert, Assembler oder Hochlevel. Es wird oft fälschlich angenommen, zu ihrer Implementation sei Indirektion notwendig; das ist aber nicht der Fall. Brauchbare Mehrfach-Verzweigungen können auch ohne Indirektion implementiert werden; alles, was vonnöten ist, ist eine Methode, um den Ort der nächsten auszuführenden Instruktion (oder Zeile in einer Skriptsprache) zu berechnen.

Die Syntax von Mehrfach-Verzweigungen hängt von der individuellen Syntax der verwendeten Programmiersprache ab, und kann verschiedene Formen annehmen, u.a.:

  • Berechnetes GOTO (FORTRAN)

  • switch/case (C/C++/JAVA)

  • GOTO DEPENDING ON (COBOL)

  • ON GOTO (BASIC)

  • Verzweigungs-/Sprung-Tabellen (Assembler)

Über die grundlegende Fähigkeit hinaus, die nächste auszuführende Anweisung zu berechnen, ist die wichtigste Anforderung an die Implementierung einer Mehrfach-Verzweigungen die Prüfung, ob sich der Verzweigungswert in einem geeigneten Bereich befindet. In der Tat enthält die VAX-Architektur die CASE-Maschineninstruktion zur Grenzwertkontrolle und Verzweigung auf Basis einer eingebetteten Tabelle von Offsets.

Im einfachsten Fall basiert eine Mehrfach-Verzweigungen auf einem ganzzahligen Index. Diese grundlegende Form gibt es in den meisten Assembler- und 3GL-Sprachen. Enums in C, C++ und JAVA sind in den meisten Fällen ganze Zahlen. DCL, Perl, EnScript® und andere Skriptsprachen erweitern dieses Konzept häufig auf Strings. Diese Erweiterung wandelt die Grenzwertkontrolle in eine Prüfung, die auf dem Vorhandensein eines Indexstring-Werts in einer Aufzählung möglicher Werte basiert. Diese Prüfung kann am einfachsten mit einer Stringindex-Funktion implementiert werden. In DCL wird die Stringindex-Operation durch die lexikalische Funktion F$LOCATE bereitgestellt.

Es ist jedoch Vorsicht bei der Verwendung von F$LOCATE (oder jeder anderen Index-Funktion) zur Lokalisierung eines Substrings in einem längeren String geboten. Angenommen, der Indexstring kann die Werte "THEE" und "EEM" annehmen. Zugegebenermassen birgt diese Wahl von Werten das Potential für Verwirrung; es ist aber ein nützliches Beispiel.

Eine einfache Prüfung darauf, ob der Indexstring in einer Liste möglicher Strings enthalten ist, ist unzureichend (z.B. wäre der String "THE" kein gültiger Index, er ist aber in dem gültigen Indexstring "THEE" enthalten). Die Lösung besteht darin, sicherzustellen, dass der String der gültigen Werte mit einem Begrenzungszeichen beginnt und endet. Dieses Verfahren wurde bereits in einer vorangegangenen Kolumne mit dem Titel "Pitfalls of F$LOCATE and other functions" besprochen (die vor der Gründung von de.OpenVMS.org veröffentlicht wurde - Anm.d.Ü.).

Mit diesen Extra-Begrenzern fällt der Code zur Gültigkeitsprüfung einfach aus (INDEX_VALUE enthält den Indexstring):

$       VALID_INDICES = "/ONE/TWO/THREE/FOUR/"
$       IF F$LOCATE("/"+indexvalue+"/", VALID_INDICES) -
           .EQ. F$LENGTH(VALID_INDICES) THEN {error processing}

Nachdem der Stringindex auf Gültigkeit geprüft wurde, besteht die Verzweigung aus einer einfachen GOTO-Anweisung kombiniert mit Symbol-Substitution:

$       GOTO TARGET_’INDEXVALUE’
$ TARGET_ONE:
$       ...
$       GOTO EXITTARGET
$ TARGET_TWO:
$       ...
$       GOTO EXITTARGET
$ TARGET_THREE:
$       ...
$       GOTO EXITTARGET
$ TARGET_THREE:
$       ...
$       GOTO EXITTARGET
$ TARGET_FOUR:
$       ...
$ EXITTARGET:
$ ...

Dieser Ansatz ist weit sicherer als der Versuch, IF-THEN-ELSE-Bedingungen zu verschachteln. Die Option wird direkt verarbeitet. Ein ungültiger Index wird sofort bemerkt und verarbeitet. Das Hinzufügen eines weiteren gültigen Wertes benötigt lediglich das Hinzufügen des Werts zu VALID_STRING und den entsprechenden Code zur Verarbeitung.

Ein DCL-Schnipsel zur Demonstration der obigen Methode befindet sich auf meinem Website unter "DCL GOTO".

Leserfragen zur Verwendung von DCL und andere, auf OpenVMS bezogene Fragen sollten an OpenVMSConsultant (at) OpenVMS.org adressiert werden. Obwohl ich nicht versprechen kann, alle Nachrichten zu beantworten, werde ich es versuchen, wie es meine Zeit erlaubt. Der OpenVMS-Fachberater begrüßt Fragen von Lesern über OpenVMS und verwandte Technologien. Bitte senden Sie Ihre Fragen an den OpenVMS Consultant.



Über den Autor:

Robert Gezelter, CDP, CSA, CSE, Software Consultant, hat mehr als 30 Jahre internationale Erfahrung mit der Fachberatung im privaten und öffentlichen Sektor. Er ist regelmäßiger Gastredner auf technischen Konferenzen weltweit, einschließlich des HP Technology Forums. 2004 hat die IEEE Computer Society Mr. Gezelter in ihr Distinguished Visitors Program berufen, das Redner auf Veranstaltungen von IEEE-Verbänden in ganz Nordamerika vermittelt. Außerdem hat er zahlreiche technische Artikel und Buchkapitel verfasst, einschließlich zweier Kapitel in dem kürzlich erschienenen Computer Security Handbook, 5. Auflage.

Kürzlich hat er begonnen, Ruminations - An IT Blog über IT-Themen zu schreiben, die nicht mit OpenVMS in Verbindung stehen.

Die Tätigkeit seiner Firma betont detaillierte technische Expertise in den Bereichen Computer-Architekturen, Betriebssysteme, Netzwerke, Sicherheit, APIs und verwandte Themen. Mr. Gezelter hat mit OpenVMS seit der ersten Release von VAX/VMS 1977 gearbeitet.

Seine Kundenstamm umfasst sowohl kleinere Firmen wie auch Firmen in den Fortune 10, lokal, national und international, mit Arbeitsbereichen, die von individuellen Telefon-Fragen bis zu größeren Projekten reichen.

Im Web ist er über den Website seiner Firma unter http://www.rlgsc.com zu erreichen.


Original auf www.openvms.org