GNU COBOL
Eh bien, ils ont dit que cela ne pouvait pas être fait. En fait, c'est moi qui ai dit que cela ne pouvait pas être fait. Maintenant c'est fait, et une fonction de langage obsolète a été réimplémentée en utilisant la méthode appliquée.
La question dit:
Si des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après la compilation, le cas échéant).
N'importe quelle quantité de trucs peut être inséré avant les trois DISPLAY
s qui provoquent le début de la sortie, et rien après leDISPLAY
s "interrompra le flux du code", donc c'est OK.
COBOL avait un TRACE
verbe (instruction) qui listait simplement les numéros de ligne source au fur et à mesure de leur exécution (pas d'accès au numéro de ligne dans le programme). Bien que d'utilisation limitée, j'ai inclus une implémentation de TRACE.
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
.
La sortie est
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
Pour montrer la puissance et la flexibilité de l'écriture de la langue, cet exemple utilise à la fois des casse mixte, entièrement en minuscules et entièrement en majuscules. Peu importe, car lors du traitement, tout est "plié" en MAJUSCULE.
La seule façon COBOL standard d'obtenir un numéro de ligne source dans le programme en cours d'exécution, à partir du programme en cours d'exécution, est d'utiliser a DEBUGGING
DECLARATIVE
. Dans un SECTION
, strictement dans un paragraphe dans unSECTION
, d'un tel déclaratif, vous avez accès au registre spécial DEBUG-LINE
. Il contient le numéro de ligne source du verbe (instruction) qui a provoqué le transfert du contrôle vers un nom de procédure particulier (paragraphe ou SECTION
).
Donc avec PERFORM
, ou GO TO
, ou "tomber" dans le paragraphe dans les déclarations de débogageSECTION
est exécuté.
OK mais DISPLAY
ne provoque pas de transfert de contrôle.
Aucun problème. Mettez-le sur la même ligne que le transfert de contrôle.
Problème, car si "des espaces ou des instructions supplémentaires (qui n'interrompent pas le flux du code) sont ajoutés au code source, ils doivent être reflétés au moment de l'exécution (après avoir compilé le cas échéant)".
Donc, mettez-le sur la même ligne mais devant un transfert de contrôle, divisez le contenu duDISPLAY
en deux morceaux (rappelez-vous, "Dans ce contexte, nous voulons que le premier numéro de ligne de l'instruction qui génère la chaîne soit affiché" ) et sortir la première partie avant le transfert de contrôle, et la deuxième partie, depuis leDEBUG-LINE
, une fois à l'intérieur de la procédure de débogage.
Le dernier bit délicat est pour la "chute" (les "procédures" peuvent être PERFORM
éditées, peuvent être la cible d'un GO TO
, ou peuvent être entrées simplement en étant la ligne suivante le long). Dans ce cas, mettez le DISPLAY
sur la ligne qui définit la procédure, mais devant la définition .
Les noms des "procédures" ( a
et b
) ont été considérablement raccourcis pour leur permettre de tenir sur la même ligne source que le DISPLAY
. Strictement, un nom de procédure COBOL devrait commencer quelque part de la colonne huit à la colonne 11. Cependant, la syntaxe est, de nos jours, beaucoup plus détendue à ce sujet. Dans la mesure où je peux définir un nom de procédure sur la même ligne qu'un code. Même intégré dans le code. Des soins et un arrêt complet occasionnel sont nécessaires.
dans le PROCEDURE DIVISION
chaque point d'arrêt indiqué est requis, et pas plus.
Compiler:
cobc -x -g hiwhere.cbl
Pour exécuter (linux):
COB_SET_DEBUG=Y ./hiwhere
Enfin, le retour de TRACE (sans 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
.
La sortie est:
1
17
2
18
3
19
20
Où 1, 2 et 3 sont sortis des trois instructions DISPLAY, et 17, 18, 19 et 20 sont les numéros de ligne des lignes "exécutables" (sans débogage).