GNU COBOL
Nun, sie sagten, dass es nicht möglich sei. Eigentlich war ich es, der sagte, dass es nicht geht. Jetzt ist es geschafft und eine veraltete Sprachfunktion wurde mit der angewendeten Methode neu implementiert.
Die Frage lautet:
Wenn dem Quellcode zusätzliche Leerzeichen oder Anweisungen hinzugefügt werden (die den Codefluss nicht unterbrechen), sollten sie zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren).
Jede Menge an Material kann vor den drei eingefügt DISPLAY
s , die den Start der Ausgabe verursachen, und alles , was nach dem DISPLAY
s würde „Unterbrechung der Strömung des Codes“, so dass das OK.
COBOL hatte früher ein TRACE
Verb (Anweisung), das einfach die Quellzeilennummern auflistete, als sie ausgeführt wurden (kein Zugriff auf die Zeilennummer im Programm). Obwohl dies nur von begrenztem Nutzen ist, habe ich eine Implementierung von TRACE hinzugefügt.
ID Division.
Program-ID. HIWHERE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a b
.
Debug-Declaratives-Paragraph.
Display Debug-Line "!"
.
End Declaratives
.
Main-Program Section.
DISPLAY "Perform"
Display "Hello World, from line " no advancing Perform b
display "GO TO"
Display "Hello World, from line " no advancing GO TO a
.
a.
dISPLay "Fall through"
Display "Hello World, from line " no advancing. b.
The-Last-bit-OF-the-PROGRAM.
GOBACK
.
Die Ausgabe ist
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
Als Beispiel für die Kraft und Flexibilität des Schreibens der Sprache werden in diesem Beispiel gemischte Groß- und Kleinbuchstaben gleichzeitig verwendet. Es spielt keine Rolle, wie bei der Verarbeitung alles in GROSSBUCHSTABEN "gefaltet" wird.
Der einzige Standard-COBOL-Weg, um eine Quell-Zeilennummer im laufenden Programm aus dem laufenden Programm zu erhalten, ist mit einem DEBUGGING
DECLARATIVE
. Innerhalb eines SECTION
, ausschließlich innerhalb eines Absatzes innerhalb eines SECTION
, eines solchen Deklarativs haben Sie Zugriff auf das Sonderregister DEBUG-LINE
. Diese enthält die Quellzeilennummer des Verbs (Anweisung), das die Übertragung der Kontrolle auf einen bestimmten Prozedurnamen (Absatz oder SECTION
) verursacht hat.
Also wird mit PERFORM
, oder GO TO
oder "durchfallen" der Absatz in den Debugging-Deklarativen SECTION
ausgeführt.
OK, aber DISPLAY
keine Übertragung der Kontrolle.
Kein Problem. Stellen Sie es in die gleiche Zeile wie die Übertragung der Kontrolle.
Problem: Wenn "zusätzliche Leerzeichen oder Anweisungen (die den Code-Fluss nicht unterbrechen) zum Quellcode hinzugefügt werden, sollten sie zur Laufzeit wiedergegeben werden (ggf. nach dem Kompilieren)".
Stellen Sie es also in dieselbe Zeile, aber vor einer Übertragung der Kontrolle, und teilen Sie den Inhalt von DISPLAY
in zwei Teile. ) und geben Sie den ersten Teil vor der Übertragung der Kontrolle und den zweiten Teil aus dem aus DEBUG-LINE
, sobald Sie sich in der Debug-Prozedur befinden.
Das letzte knifflige Bit ist für das "Durchfallen" ("Prozeduren" können PERFORM
bearbeitet werden, können das Ziel von a sein GO TO
oder können einfach eingegeben werden, indem die nächste Zeile entlang ist). Setzen Sie in diesem Fall das Zeichen DISPLAY
in die Zeile, die die Prozedur definiert, jedoch vor die Definition .
Die Namen der "Prozeduren" ( a
und b
) wurden stark gekürzt, damit sie in dieselbe Quellzeile passen wie die DISPLAY
. Streng genommen sollte ein COBOL-Prozedurname irgendwo zwischen Spalte 8 und Spalte 11 beginnen. Allerdings ist die Syntax heutzutage viel entspannter. Soweit ich einen Prozedurnamen in derselben Zeile wie Code definieren kann. Sogar in Code eingebettet. Pflege und gelegentliches Anhalten sind erforderlich.
Bei dem PROCEDURE DIVISION
jeweils gezeigten Punkt ist und sind keine weiteren erforderlich.
Kompilieren:
cobc -x -g hiwhere.cbl
So führen Sie (Linux) aus:
COB_SET_DEBUG=Y ./hiwhere
Zum Schluss die Rückgabe von TRACE (ohne READY / RESET).
ID Division.
Program-ID. tRacE.
ENVIRONMENT DIVISION.
configuration section.
source-computer. TinkerToy with debugging mode.
Procedure Division.
Declaratives.
Debug-Declaratives Section.
Use For Debugging on a
.
Debug-Declaratives-Paragraph.
Display Debug-Line
.
End Declaratives
.
Main-Program Section.
* Just append "perform a" to a single-line statement.
DISPLAY "1" . perform a
Display "2" . perform a
display "3" . perform a
* Or prepend "perform a." for a multi-line statement, or a
* statement which won't "come back".
perform a. GOBACK
.
a.
CONTINUE
.
Ausgabe ist:
1
17
2
18
3
19
20
Wobei 1, 2 und 3 von den drei DISPLAY-Anweisungen ausgegeben werden und 17, 18, 19 und 20 die Zeilennummern der "ausführbaren" (nicht debuggenden) Zeilen sind.