GNU COBOL
Bene, hanno detto che non si poteva fare. In realtà, sono stato io a dire che non si poteva fare. Ora è fatto e una funzionalità di linguaggio obsoleto reimplementata usando il metodo applicato.
La domanda afferma:
Se vengono aggiunti spazi bianchi o istruzioni aggiuntive (che non interrompono il flusso del codice) al codice sorgente, questo dovrebbe essere riflesso in fase di esecuzione (dopo la compilazione, se applicabile).
Qualsiasi quantità di roba può essere inserita prima delle tre DISPLAY
s che causano l'inizio dell'output, e qualsiasi cosa dopo la DISPLAY
s "interromperà il flusso del codice", quindi va bene.
COBOL aveva un TRACE
verbo (istruzione) che elencava semplicemente i numeri di riga sorgente mentre venivano eseguiti (nessun accesso al numero di riga nel programma). Sebbene di uso limitato, ho incluso un'implementazione di 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
.
L'output è
Perform
Hello World, from line 18!
GO TO
Hello World, from line 20!
Fall through
Hello World, from line 23!
Come una dimostrazione della potenza e della flessibilità della scrittura della lingua, questo esempio usa maiuscole e minuscole, tutte minuscole e interamente maiuscole, tutte allo stesso tempo. Non importa, come quando viene elaborato, tutto viene "piegato" in MAIUSCOLO.
L'unico modo COBOL standard per ottenere un numero di riga di origine nel programma in esecuzione, dal programma in esecuzione, è con a DEBUGGING
DECLARATIVE
. All'interno di a SECTION
, rigorosamente all'interno di un paragrafo all'interno di a SECTION
, di tale dichiarante si ha accesso al registro speciale DEBUG-LINE
. Questo contiene il numero di riga di origine del verbo (istruzione) che ha causato il trasferimento del controllo a un particolare nome-procedura (paragrafo o SECTION
).
Quindi, con PERFORM
, o GO TO
, o "fall through" SECTION
viene eseguito il paragrafo nei dichiarativi di debug .
Ok ma DISPLAY
non causa il trasferimento del controllo.
Nessun problema. Mettilo sulla stessa linea del trasferimento del controllo.
Problema, poiché se "qualsiasi spazio bianco o istruzione aggiuntiva (che non interrompe il flusso del codice) viene aggiunto al codice sorgente, dovrebbe essere riflesso in fase di esecuzione (dopo la compilazione se applicabile)".
Quindi, mettilo sulla stessa riga ma davanti a un trasferimento di controllo, dividi il contenuto del DISPLAY
in due pezzi (ricorda, "In questo contesto, vogliamo che sia visualizzato il numero della prima riga dell'istruzione che genera la stringa" ) e produce la prima parte prima del trasferimento del controllo e la seconda parte dalDEBUG-LINE
, una volta all'interno della procedura di debug.
Il bit finale è per il "fall through" (le "procedure" possono essere modificate PERFORM
, possono essere il bersaglio di un GO TO
o possono essere inserite semplicemente essendo la riga successiva). In questo caso, metti DISPLAY
sulla riga che definisce la procedura, ma davanti alla definizione .
I nomi delle "procedure" ( a
e b
) sono stati severamente abbreviati per consentire loro di adattarsi alla stessa linea sorgente del DISPLAY
. Un nome di procedura COBOL dovrebbe iniziare da qualche parte dalla colonna otto alla colonna 11. Tuttavia, la sintassi è, al giorno d'oggi, molto più rilassata al riguardo. Nella misura in cui posso definire un nome di procedura sulla stessa riga di un codice. Perfino incorporato nel codice. Sono necessarie cure e un arresto occasionale.
Nel PROCEDURE DIVISION
ogni punto completo mostrato è richiesto, e non lo sono più.
Compilare:
cobc -x -g hiwhere.cbl
Per eseguire (linux):
COB_SET_DEBUG=Y ./hiwhere
Infine, il ritorno di TRACE (senza 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
.
L'output è:
1
17
2
18
3
19
20
Dove 1, 2 e 3 vengono emessi dalle tre istruzioni DISPLAY e 17, 18, 19 e 20 sono i numeri di riga delle righe "eseguibili" (senza debug).