Vielleicht kennen Sie die Situation.
Tage- und wochenlang steckt man in der Arbeit zu einem großen Programm.
Jede Zeile des Quelltextes ist im Kopf, zumindest glaubt man das.
Während der Testphase werden noch laufend kleine bis große Änderungen angebracht.
Mal läuft das Programm, mal steigt es aus, mal offenbaren sich kleinere und mal größere Schnitzer.
Und irgendwann beschließt man, die Sache ein paar Tage ruhen zu lassen um dann mit neuem Schwung den letzten Wanzen ein rasches Ende zu bereiten.
Doch dann ist die Überraschung groß.
Wer hat eigentlich das Programm geschrieben?
Ihr ureigenes Werk tritt Ihnen so fremd gegenüber, als wären Sie niemals in jenem Tage- und Nächte überdauernden hautengen Verhältnis zueinander gestanden.
Schließlich hilft nur noch eines: die große Aufräumaktion.
Bei dieser Arbeit finden Sie in dem
PDYNAM
eine unschätzbare Hilfe.
Das wichtigste Gestaltungsmittel von
Pascal sind Prozeduren und Funktionen.
Mit ihrer Hilfe ist es möglich, die komplexe Arbeit eines Programms in kleine, überschaubare Happen aufzuteilen.
Gute Programme erkennt man dabei daran, daß alle Prozeduren und Funktionen so lokal wie möglich definiert sind.
Schon allein dadurch ergibt sich eine wesentlich größere Übersicht.
Nicht nur das Programm, das dann aus wenigen großen Modulen besteht, gewinnt an Klarheit.
Auch die einzelnen, in sich weitgehend geschlossenen Module sind durchschaubar.
Solcherart aufgebaute Module sind auch leicht getrennt austestbar, was der Programmsicherheit unmittelbar zugute kommt.
Im ersten Turbo-Special haben wir zwei Werkzeuge zur Dokumentation von Quelltexten vorgestellt:
PLIST
und
PSTAT
1.
Mit
PDYNAM
wird diese Reihe nun fortgesetzt.
Das Programm analysiert Pascal-Programme bezüglich der Definitionen und Aufrufe von Prozeduren und Funktionen.
Als Resultat erhalten Sie eine Liste mit folgenden Angaben:
Prozeduren und Funktionen werden in der Reihenfolge ihrer Deklaration aufgelistet und dabei je nach Verschachtelung eingerückt.
Wenn innerhalb einer Prozedur (oder Funktion) eine andere aufgerufen wird, so wird auch dieser Aufruf ausgedruckt.
Schließlich werden, falls vorhanden, alle Prozeduren und Funktionen angegeben, die innerhalb anderer festgelegt werden können, die also das vorher genannte Kriterium 'so lokal wie möglich' nicht erfüllen.
Dabei kommen auch niemals aufgerufene Prozeduren zum Vorschein.
Zusätzlich wird jeweils der Name der Prozedur ausgegeben, innerhalb derer sie definiert werden könnte.
Beim Auftreten eines Fehlers im zu untersuchenden Programm wird die Arbeit nach Ausgabe der Fehlerstelle unterbrochen.
Bei der Ausgabe können Sie zwischen Bildschirm, Drucker und Datei wählen.
Bildschirm- und Druckerausgabe werden seitenweise formatiert.
Um die Übersicht auch bei mehreren Seiten zu gewährleisten, wird die Verschachtelung zu Beginn jeder Seite wiederholt.
Bei der Druckerausgabe können Sie zudem noch zwischen parallelem und seriellem Ausgang wählen.
Nehmen wir einmal das folgende, zugegebenermaßen etwas übertriebene Beispiel:
program test;
procedure x; begin end;
procedure x0; procedure x1; begin x end;
procedure x2; procedure x3; begin end;
procedure x4; begin x4 end; begin x; x1 end;
begin x2 end; begin x0 end.
Selbst als alter Programmierfuchs müssen Sie schon zweimal hinsehen, ehe Sie erkennen, welche Prozedur lokal zu welcher ist, welche von welcher aufgerufen wird und ob gar die eine oder andere überflüssig ist.
Das Problem hängt nur teilweise mit der 'unstrukturierten' Schreibweise zusammen.
Bei längeren Programmen, bei denen sich schon das Listing über zig Seiten hinzieht, tritt es schon aus Prinzip auf.
PDYNAM
erzeugt aus dem Programm diese Analyse:
Dynamische Struktur von TEST.PAS
TEST.PAS PROGRAM TEST
PROCEDURE X
PROCEDURE X0
PROCEDURE X1
-> X
PROCEDURE X2
PROCEDURE X3
PROCEDURE X4
-> X4
-> X
-> X1
-> X2
-> X0
Liste der ueberfluessig-nichtlokalen Prozeduren:
X (X0)
X1 (X2)
X3 ()
X4 ()
Spätestens bei der Offenbarung der unnützen Prozeduren
X3
und
X4
(die sich nur selbst rekursiv aufrufen) werden Sie
PDYNAM
als fürderhin unverzichtbares Werkzeug einsetzen.
Weitere Vorteile ergeben sich beim Einbinden von Toolboxen und Bibliotheks-Modulen, wenn nicht aufgerufene Prozeduren den Programmcode unnötig vergrößern.
Aber auch bei der Erzeugung von Overlay-Bereichen kann
PDYNAM
nutzbringend eingesetzt werden.
Während sich Pascal-Neulinge wohl schaudernd von den vielen Bäumen, Listen und Stacks abwenden werden (nachdem sie das Listing hoffentlich fehlerfrei abgetippt haben), mag den Fortgeschrittenen unter Ihnen die eine oder andere Routine vielleicht zur Anregung dienen.
Anders als bei manchen anderen 'Analyse-Programmen', bei denen Sie schon bei der Erstellung des Quelltextes den unerquicklichsten Einschränkungen ausgesetzt sind (PROCEDURE
und FUNCTION
müssen in der ersten Spalte einer Zeile beginnen, BEGIN
und END
müssen je nach Verwendung ein- oder ausgerückt werden ...), verarbeitet PDYNAM
Turbo-Programme, wie sie gerade kommen.
Die Arbeitsweise ist stark an die des Turbo-Pascal-Compilers angelehnt.
Bei INCLUDE
-Anweisungen wird erst der gesamte restliche Kommentar überlesen, ehe die Ausführung folgt.
INCLUDE
-Dateien werden auf dem aktuellen Laufwerk erwartet, wenn im Filenamen kein Laufwerksbezeichner enthalten ist.
Wird eine INCLUDE
-Datei nicht gefunden, so wird nach einer entsprechenden Meldung die Arbeit fortgesetzt.
Anstelle eines einfachen Zählmechanismus für die Verschachtelung der Anweisungsblöcke treten relativ aufwendige Stackoperationen, mit deren Hilfe aber alle diesbezüglichen Fehler erkannt werden können.
Um einerseits bei den Bezeichnern die maximale Länge von 127 signifikanten Zeichen zuzulassen, andererseits bei den Listen und Bäumen keinen unnützen Ballast mitzuführen, wurde die Heapverwaltung mit getmem
und freemem
durchgeführt.
Aus diesem Grund läuft das Programm erst ab Turbo-Pascal 2.0.
Übrigens ist der Heap nach jedem Durchlauf wieder vollkommen frei.
Der Speicherbedarf des Programms selbst ist so gering, daß auch unter CP/M 2.2 keine Einschränkungen auftreten.
Listing von PDYNAM.PAS |
|
Listing von PDYNAM-1.INC |
|
Listing von PDYNAM-2.INC |
|
Listing von PDYNAM-3.INC 2 |
|
U.K.