SyntaxEdit
COBOL ha una sintassi simile all’inglese, che viene utilizzata per descrivere quasi tutto in un programma. Ad esempio, una condizione può essere espressa come x È MAGGIORE DI y
o in modo più conciso come x MAGGIORE y
o x > y
. Condizioni più complesse possono essere “abbreviate” rimuovendo condizioni e variabili ripetute. Ad esempio, a > b AND a > c OR a = d
può essere abbreviato in a > b AND c OR = d
. Per supportare questa sintassi simile all’inglese, COBOL ha oltre 300 parole chiave. Alcune delle parole chiave sono semplici ortografie alternative o pluralizzate della stessa parola, che prevede più affermazioni e clausole in stile inglese; ad esempio, le parole chiave IN
e OF
possono essere utilizzate in modo intercambiabile, così come È
e ARE
e VALUE
e VALUES
.
Ogni programma COBOL è composto da quattro elementi lessicali di base: parole, letterali, stringhe di caratteri dell’immagine (vedere § IMMAGINE clausola) e separatori. Le parole includono parole riservate e identificatori definiti dall’utente. Sono lunghi fino a 31 caratteri e possono includere lettere, cifre, trattini e trattini bassi. I valori letterali includono numeri (ad es. 12
) e stringhe (ad es. "Hello!"
). I separatori includono il carattere spazio e virgole e punti e virgola seguiti da uno spazio.
Un programma COBOL è suddiviso in quattro divisioni: la divisione di identificazione, la divisione dell’ambiente, la divisione dei dati e la divisione della procedura. La divisione di identificazione specifica il nome e il tipo dell’elemento sorgente ed è dove vengono specificate le classi e le interfacce. La divisione ambiente specifica tutte le funzionalità del programma che dipendono dal sistema che lo esegue, come file e set di caratteri. La divisione dei dati viene utilizzata per dichiarare variabili e parametri. La divisione della procedura contiene le istruzioni del programma. Ogni divisione è suddivisa in sezioni, che sono composte da paragrafi.
MetalanguageEdit
La sintassi di COBOL è solitamente descritta con un metalinguaggio unico utilizzando parentesi graffe, parentesi, barre e sottolineature. Il metalinguaggio è stato sviluppato per le specifiche COBOL originali. Sebbene all’epoca esistesse il modulo Backus – Naur, il comitato non ne aveva sentito parlare.
Elemento | Aspetto | Funzione |
---|---|---|
Tutte le maiuscole | ESEMPIO | Parola riservata |
Sottolineatura | ESEMPIO | La parola riservata è obbligatorio |
Parentesi graffe | {} | È possibile selezionare una sola opzione |
Parentesi | È possibile selezionare zero o una sola opzione | |
Ellipsis | … | L’elemento precedente può essere ripetuto |
Bar | {| |} | È possibile selezionare una o più opzioni. Qualsiasi opzione può essere selezionata solo una volta. |
È possibile selezionare zero o più opzioni. Qualsiasi opzione può essere solo selezionato una volta. |
Ad esempio, consi der la seguente descrizione di un’istruzione ADD
:
Questa descrizione consente le seguenti varianti:
ADD 1 TO xADD 1, a, b TO x ROUNDED, y, z ROUNDEDADD a, b TO c ON SIZE ERROR DISPLAY "Error"END-ADDADD a TO b NOT SIZE ERROR DISPLAY "No error" ON SIZE ERROR DISPLAY "Error"
Code formatEdit
COBOL può essere scritto in due formati: fisso (predefinito) o libero. Nel formato fisso, il codice deve essere allineato per adattarsi a determinate aree (un ostacolo dall’uso di schede perforate).Fino a COBOL 2002, queste erano:
Nome | Colonna (i) | Utilizzo |
---|---|---|
Area del numero di sequenza | 1–6 | Originariamente utilizzato per la carta / numeri di riga (facilitando l’ordinamento meccanico delle schede perforate per garantire la sequenza del codice del programma previsto dopo la modifica / gestione manuale), quest’area viene ignorata dal compilatore |
Area degli indicatori | 7 | I seguenti caratteri sono consentiti qui:
|
Area A | 8–11 | Questo contiene: DIVISION , SECTION e intestazioni di procedura; Numeri di livello 01 e 77 e descrittori di file / report |
Area B | 12–72 | Qualsiasi altro codice non consentito in Area A |
Area nome programma | 73– | Storicamente fino alla colonna 80 per schede perforate, viene utilizzata per identificare il programma o la sequenza a cui appartiene la carta |
In COBOL 2002, le aree A e B erano fusa per formare l’area di testo del programma, che ora termina con una colonna definita dall’implementatore.
COBOL 2002 ha anche introdotto il codice in formato libero. Il codice in formato libero può essere inserito in qualsiasi colonna del file, come nei linguaggi di programmazione più recenti. I commenti vengono specificati utilizzando *>
, che può essere posizionato ovunque e può essere utilizzato anche nel codice sorgente a formato fisso. Le righe di continuazione non sono presenti e la direttiva >>PAGE
sostituisce l’indicatore /
.
Identification divisionEdit
La divisione di identificazione identifica la seguente entità di codice e contiene la definizione di una classe o di un’interfaccia.
Programmazione orientata agli oggetti Modifica
Le classi e le interfacce sono presenti in COBOL dal 2002. Classi avere oggetti factory, contenenti metodi e variabili di classe, e oggetti istanza, contenenti metodi e variabili di istanza. L’ereditarietà e le interfacce forniscono il polimorfismo. Il supporto per la programmazione generica viene fornito tramite classi parametrizzate, che possono essere istanziate per utilizzare qualsiasi classe o interfaccia. Gli oggetti vengono memorizzati come riferimenti che possono essere limitati a un certo tipo. Esistono due modi per chiamare un metodo: l’istruzione INVOKE
, che agisce in modo simile a CALL
, o tramite invocazione di metodi inline, che è analogo all’uso di funzioni.
*> These are equivalent.INVOKE my-class "foo" RETURNING varMOVE my-class::"foo" TO var *> Inline method invocation
COBOL non fornisce un modo per nascondere i metodi. I dati della classe possono essere nascosti, tuttavia, dichiarandoli senza una clausola PROPERTY
, che non lascia all’utente alcun modo per accedervi. Il sovraccarico dei metodi è stato aggiunto in COBOL 2014.
Divisione ambienteEdit
La divisione ambiente contiene la sezione di configurazione e la sezione di input-output. La sezione di configurazione viene utilizzata per specificare caratteristiche variabili come segni di valuta, impostazioni locali e set di caratteri. La sezione input-output contiene informazioni relative ai file.
FilesEdit
COBOL supporta tre formati di file o organizzazioni: sequenziale, indicizzato e relativo. Nei file sequenziali, i record sono contigui e devono essere attraversati in sequenza, in modo simile a un elenco collegato. I file indicizzati hanno uno o più indici che consentono l’accesso casuale ai record e che possono essere ordinati su di essi. Ogni record deve avere una chiave univoca, ma le altre chiavi di record alternative non devono essere univoche. Le implementazioni dei file indicizzati variano a seconda dei fornitori, sebbene le implementazioni comuni, come C-ISAM e VSAM, siano basate sull’ISAM di IBM. I file relativi, come i file indicizzati, hanno una chiave record univoca, ma non hanno chiavi alternative. A La chiave del record relativo è la sua posizione ordinale; ad esempio, il decimo record ha una chiave di 10. Ciò significa che la creazione di un record con una chiave di 5 può richiedere la creazione di record precedenti (vuoti). I file relativi consentono anche l’accesso sequenziale e casuale.
Un’estensione non standard comune è l’organizzazione sequenziale di riga, utilizzata per elaborare i file di testo. I record in un file sono terminati da una nuova riga e possono essere di lunghezza variabile.
Data divisionEdit
La divisione dei dati è divisa in sei sezioni che dichiarano elementi differenti: la sezione file, per record di file; la sezione work-storage, per le variabili statiche; la sezione di archiviazione locale, per le variabili automatiche; la sezione di collegamento, per i parametri e il valore di ritorno; la sezione report e la sezione schermo, per le interfacce utente basate su testo.
Dati aggregatiEdit
Gli elementi di dati in COBOL sono dichiarati gerarchicamente tramite l’uso di numeri di livello che indicano se un elemento di dati fa parte di un altro. Un elemento con un numero di livello superiore è subordinato a un elemento con uno inferiore. Gli elementi dati di primo livello, con un numero di livello 1, sono chiamati record. Gli elementi che hanno dati aggregati subordinati sono chiamati elementi di gruppo; quelli che non lo sono sono chiamati elementi elementari. I numeri di livello utilizzati per descrivere gli elementi di dati standard sono compresi tra 1 e 49.
Nell’esempio precedente, l’elemento elementare num
e l’elemento di gruppo the-date
sono subordinati al record some-record
, mentre gli elementi elementari l'anno
, il mese
e il -day
fa parte dell’elemento del gruppo the-date
.
Gli elementi subordinati possono essere disambiguati con IN
(o OF
). Ad esempio, considera il codice di esempio sopra insieme al seguente esempio:
01 sale-date. 05 the-year PIC 9(4). 05 the-month PIC 99. 05 the-day PIC 99.
I nomi l'anno
, il mese
e il giorno
sono ambigui di per sé, poiché più di un elemento di dati è definito con quei nomi. Per specificare un particolare elemento di dati, ad esempio uno degli elementi contenuti nel gruppo sale-date
, il programmatore utilizza the-year IN sale-date
(o l’equivalente the-year OF sale-date
). (Questa sintassi è simile alla “notazione punto” supportata dalla maggior parte dei linguaggi contemporanei.)
Altri livelli di dati Modifica
Un numero di livello 66 viene utilizzato per dichiarare un raggruppamento di elementi definiti in precedenza, indipendentemente da come sono strutturati. Questo livello di dati, indicato anche dalla clausola RENAMES
associata, è usato raramente e, intorno al 1988, si trovava di solito nei vecchi programmi. La sua capacità di ignorare i dati della struttura gerarchica e logica significava che il suo uso non era raccomandato e molte installazioni ne vietavano l’uso.
Un numero di livello 77 indica che l’elemento è autonomo e in tali situazioni è equivalente a il numero di livello 01. Ad esempio, il codice seguente dichiara due elementi di dati di livello 77, nome-proprietà
e sales-region
, che sono elementi di dati non di gruppo indipendenti (non subordinati a) altri elementi di dati:
77 property-name PIC X(80). 77 sales-region PIC 9(5).
Un numero di livello 88 dichiara un nome di condizione (un cosiddetto livello di 88) che è vero quando l’elemento di dati padre contiene uno dei valori specificati nel suo VALUE
clausola. Ad esempio, il codice seguente definisce due elementi nome-condizione di livello 88 che sono veri o falsi a seconda del valore dei dati carattere corrente dell’elemento dati tipo salario
. Quando l’elemento di dati contiene un valore di "H"
, il nome-condizione salario è orario
è vero, mentre quando contiene un valore di "S"
o "Y"
, la condizione-nome salario annuale
è vera. Se l’elemento di dati contiene un altro valore, entrambi i nomi delle condizioni sono falsi.
01 wage-type PIC X. 88 wage-is-hourly VALUE "H". 88 wage-is-yearly VALUE "S", "Y".
Tipi di datiModifica
COBOL standard fornisce i seguenti tipi di dati:
Tipo di dati | Dichiarazione di esempio | Note |
---|---|---|
Alfabetico | PIC A (30) |
Può contenere solo lettere o spazi |
Alfanumerico | PIC X (30) |
Può contenere qualsiasi carattere |
Booleano | PIC 1 USAGE BIT |
Dati memorizzati sotto forma di 0 e 1, come numero binario |
Indice | INDICE DI UTILIZZO |
Utilizzato per fare riferimento agli elementi della tabella |
Nazionale | PIC N (30) |
Simile a alfanumerico, ma utilizza un carattere esteso impostato, ad es. UTF-8 |
Numerico | PIC 9 (5) V9 (5) |
Può contenere solo numeri |
Oggetto | USAGE OBJECT REFERENCE |
Può fare riferimento a un oggetto o a NULL |
Puntatore | PUNTO DI UTILIZZO |
La sicurezza del tipo è variabile in COBOL.I dati numerici vengono convertiti silenziosamente tra diverse rappresentazioni e dimensioni ei dati alfanumerici possono essere inseriti in qualsiasi elemento di dati che può essere memorizzato come una stringa, inclusi i dati numerici e di gruppo. Al contrario, i riferimenti a oggetti e i puntatori possono essere assegnati solo da elementi dello stesso tipo e i loro valori possono essere limitati a un certo tipo.
Clausola PICTUREModifica
A PICTURE
(o PIC
) è una stringa di caratteri, ognuno dei quali rappresenta una parte dell’elemento dati e cosa può contenere. Alcuni caratteri dell’immagine specificano il tipo di elemento e quanti caratteri o cifre occupa in memoria. Ad esempio, un 9
indica una cifra decimale e un S
indica che l’elemento è firmato. Altri caratteri dell’immagine (chiamati caratteri di inserimento e modifica) specificano come deve essere formattato un elemento. Ad esempio, una serie di caratteri +
definiscono le posizioni dei caratteri e il modo in cui deve essere posizionato un carattere del segno iniziale nei dati del carattere finale; il carattere non numerico più a destra conterrà il segno dell’elemento, mentre le altre posizioni dei caratteri corrispondenti a un +
a sinistra di questa posizione conterranno uno spazio. Ripetuto i caratteri possono essere specificati in modo più conciso specificando un numero tra parentesi dopo un carattere immagine; ad esempio, 9 (7)
è equivalente a 9999999
. Specifiche dell’immagine contenenti solo una cifra ( 9
) e un segno ( I caratteri S
) definiscono elementi di dati puramente numerici, mentre le specifiche dell’immagine contengono caratteri alfabetici ( A
) o alfanumerici ( X
) definiscono elementi di dati alfanumerici. La presenza di altri caratteri di formattazione definisce elementi di dati numerici modificati o alfanumerici modificati.
Clausola USAGEModifica
Il USAGE
dichiara il formato i dati vengono memorizzati in. A seconda del tipo di dati, può essere complementare o essere utilizzato al posto di una clausola PICTURE
. Sebbene possa essere utilizzato per dichiarare puntatori e riferimenti a oggetti, è principalmente orientato alla specifica di tipi numerici. Questi formati numerici sono:
- Binario, dove una dimensione minima è specificata dalla clausola
PICTURE
o da unaUSAGE
clausola comeBINARY-LONG
. -
USAGE COMPUTATIONAL
, dove i dati possono essere archiviato in qualsiasi formato fornito dall’implementazione; spesso equivale aUSAGE BINARY
-
USAGE DISPLAY
, il formato predefinito , dove i dati sono archiviati come stringa - Virgola mobile, in un formato dipendente dall’implementazione o secondo IEEE 754.
-
USAGE NATIONAL
, dove i dati vengono memorizzati come una stringa utilizzando un set di caratteri esteso -
USAGE PACKED-DECIMAL
, dove i dati è memorizzato nel formato decimale più piccolo possibile (tipicamente decimale codificato in binario)
Report writerEdit
Il report writer è una funzione dichiarativa per la creazione di report. Il programmatore deve solo specificare il layout del report e i dati necessari per produrlo, liberandolo dal dover scrivere codice per gestire cose come interruzioni di pagina, formattazione dei dati e intestazioni e piè di pagina.
I report sono associati al report file, che sono file che possono essere scritti solo tramite istruzioni di scrittore di report.
FD report-out REPORT sales-report.
Ogni report è definito nella sezione report della divisione dati. Un report è suddiviso in gruppi di report che definiscono le intestazioni, i piè di pagina e i dettagli del report. I report aggirano le interruzioni del controllo gerarchico. Le interruzioni del controllo si verificano quando una variabile chiave ne modifica il valore; ad esempio, quando si crea un report che descrive in dettaglio gli ordini dei l’interruzione del controllo potrebbe verificarsi quando il programma raggiunge gli ordini di un cliente diverso. Di seguito è riportata una descrizione di un rapporto di esempio per un rapporto che fornisce le vendite di un venditore e che avverte di eventuali record non validi:
La descrizione del rapporto precedente descrive il seguente layout:
Quattro istruzioni controllano l’autore del report: INITIATE
, che prepara l’autore del report per la stampa; GENERATE
, che stampa un gruppo di rapporti; SUPPRESS
, che elimina la stampa di un gruppo di rapporti; e TERMINATE
, che termina l’elaborazione del rapporto.Per il precedente esempio di report sulle vendite, la divisione della procedura potrebbe essere simile a questa:
OPEN INPUT sales, OUTPUT report-out INITIATE sales-report PERFORM UNTIL 1 <> 1 READ sales AT END EXIT PERFORM END-READ VALIDATE sales-record IF valid-record GENERATE sales-on-day ELSE GENERATE invalid-sales END-IF END-PERFORM TERMINATE sales-report CLOSE sales, report-out .
L’uso della funzione Report Writer tendeva a variare considerevolmente; alcune organizzazioni lo hanno utilizzato ampiamente e altre per niente. Inoltre, le implementazioni di Report Writer variavano in termini di qualità, con quelle all’estremità inferiore che talvolta utilizzavano quantità eccessive di memoria in fase di esecuzione.
Divisione procedureEdit
ProceduresEdit
Le sezioni ei paragrafi nella divisione procedure (chiamate collettivamente procedure) possono essere utilizzate come etichette e come semplici sottoprogrammi. A differenza di altre divisioni, i paragrafi non devono necessariamente essere in sezioni. L’esecuzione segue le procedure di un programma finché non viene terminata. Per utilizzare le procedure come subroutine, il PERFORM .
Un’istruzione PERFORM
assomiglia in qualche modo a una chiamata di procedura in un linguaggio moderno, nel senso che l’esecuzione ritorna al codice seguendo l’istruzione PERFORM
alla fine del codice chiamato; tuttavia, non fornisce alcun meccanismo per il passaggio di parametri o per la restituzione di un valore di risultato. Se una subroutine viene invocata utilizzando una semplice istruzione come PERFORM subroutine
, il controllo ritorna alla fine della procedura chiamata. Tuttavia, PERFORM
è insolito in quanto può essere utilizzato per chiamare un intervallo che copre una sequenza di diverse procedure adiacenti. Questa operazione viene eseguita con il costrutto PERFORM sub-1 THRU sub-n
:
PROCEDURE so-and-so. PERFORM ALPHA PERFORM ALPHA THRU GAMMA STOP RUN.ALPHA. DISPLAY "A".BETA. DISPLAY "B".GAMMA. DISPLAY "C".
L’output di questo programma sarà: “AABC”.
PERFORM
differisce anche dalle chiamate di procedure convenzionali in che non esiste, almeno tradizionalmente, la nozione di stack di chiamate. Di conseguenza, sono possibili invocazioni nidificate (una sequenza di codice PERFORM
“ed può eseguire un PERFORM
stesso), ma richiedono un’attenzione particolare se parti dello stesso codice vengono eseguite da entrambe le invocazioni. Il problema sorge quando il codice nell’invocazione interna raggiunge il punto di uscita dell’invocazione esterna. Più formalmente, se il controllo passa attraverso punto di uscita di una chiamata PERFORM
chiamata in precedenza ma non ancora completata, lo standard COBOL 2002 stabilisce ufficialmente che il comportamento non è definito.
Il motivo è che COBOL, piuttosto che un “indirizzo di ritorno”, opera con quello che può essere chiamato un indirizzo di continuazione. Quando il flusso di controllo raggiunge la fine di qualsiasi procedura, l’indirizzo di continuazione viene cercato e il controllo viene trasferito a quell’indirizzo. Prima il programma viene eseguito, l’indirizzo di seguito per ogni procedura viene inizializzato all’indirizzo iniziale del professionista cedura che viene dopo nel testo del programma in modo che, se non si verificano istruzioni PERFORM
, il controllo scorre dall’alto verso il basso attraverso il programma. Ma quando viene eseguita un’istruzione PERFORM
, modifica l’indirizzo di continuazione della procedura chiamata (o l’ultima procedura dell’intervallo chiamato, se PERFORM THRU
è stato utilizzato), in modo che il controllo torni al sito della chiamata alla fine. Il valore originale viene salvato e successivamente ripristinato, ma c’è solo una posizione di memorizzazione. Se due invocazioni annidate operano su codice sovrapposto, possono interferire con la reciproca gestione dell’indirizzo di continuazione in diversi modi.
L’esempio seguente (preso da Veerman & Verhoeven 2006) illustra il problema:
Ci si potrebbe aspettare che l’output di questo programma sia “1 2 3 4 3”: dopo aver visualizzato “2”, il secondo PERFORM
fa sì che “3” e “4” vengano visualizzati, quindi la prima invocazione continua con “3”. Nelle implementazioni COBOL tradizionali, questo non è il caso. Piuttosto, il primo PERFORM
imposta l’indirizzo di continuazione alla fine di LABEL3
in modo che torni al chiama il sito all’interno di LABEL1
. La seconda istruzione PERFORM
imposta il ritorno alla fine di LABEL4
ma non modifica l’indirizzo di continuazione di LABEL3
, torna al PERFORM istruzione e il programma smette di stampare solo "1 2 3". D'altra parte, in alcune implementazioni COBOL come il compilatore open source TinyCOBOL, le due istruzioni
PERFORM
non interferiscono l'una con l'altra e l'output è effettivamente "1 2 3 4 3 ".Pertanto, il comportamento in questi casi non è solo (forse) sorprendente, ma non è nemmeno portabile.
Una conseguenza speciale di questa limitazione è che PERFORM
non può essere utilizzato per scrivere codice ricorsivo. Un altro semplice esempio per illustrarlo (leggermente semplificato da Veerman & Verhoeven 2006):
MOVE 1 TO A PERFORM LABEL STOP RUN.LABEL. DISPLAY A IF A < 3 ADD 1 TO A PERFORM LABEL END-IF DISPLAY "END".
Ci si potrebbe aspettare che l’output sia “1 2 3 END END END”, e in effetti questo è ciò che alcuni compilatori COBOL produrranno. Ma alcuni compilatori, come IBM COBOL, produrranno codice che stampa “1 2 3 END END END END …” e così via, stampando “END” più e più volte in un ciclo infinito. Poiché lo spazio per archiviare gli indirizzi di continuazione del backup è limitato, i backup vengono sovrascritti durante le chiamate ricorsive e tutto ciò che può essere ripristinato è il salto indietro a DISPLAY "END"
.
StatementsEdit
COBOL 2014 ha 47 istruzioni (chiamate anche verbi), che possono essere raggruppate nelle seguenti grandi categorie: flusso di controllo, I / O, manipolazione dei dati e l’autore del rapporto. Le dichiarazioni del redattore del rapporto sono trattate nella sezione del redattore del rapporto.
Flusso di controlloEdit
Le istruzioni condizionali di COBOL sono IF
e EVALUATE
. EVALUATE
è un’istruzione simile a uno switch con la capacità aggiuntiva di valutare più valori e condizioni. Può essere utilizzato per implementare tabelle decisionali. Ad esempio, il seguente potrebbe essere utilizzato per controllare un tornio CNC:
EVALUATE TRUE ALSO desired-speed ALSO current-speed WHEN lid-closed ALSO min-speed THRU max-speed ALSO LESS THAN desired-speed PERFORM speed-up-machine WHEN lid-closed ALSO min-speed THRU max-speed ALSO GREATER THAN desired-speed PERFORM slow-down-machine WHEN lid-open ALSO ANY ALSO NOT ZERO PERFORM emergency-stop WHEN OTHER CONTINUEEND-EVALUATE
L’istruzione PERFORM
viene utilizzata per definire i cicli che vengono eseguiti finché una condizione non è vera (non mentre è vera, che è più comune in altre lingue). viene utilizzato anche per chiamare procedure o intervalli di procedure (vedere la sezione delle procedure per maggiori dettagli). CALL
e INVOKE
chiama rispettivamente sottoprogrammi e metodi. Il nome del sottoprogramma / metodo è contenuto in un str ing che può essere un valore letterale o un elemento di dati. I parametri possono essere passati per riferimento, per contenuto (dove una copia viene passata per riferimento) o per valore (ma solo se è disponibile un prototipo). CANCEL
scarica i sottoprogrammi dalla memoria. VAI A
fa in modo che il programma salti a una procedura specificata.
Il GOBACK
STOP
arresta il programma. L'istruzione EXIT
ha sei diversi formati: può essere usata come istruzione return, istruzione break, istruzione continue, marker di fine o per uscire da una procedura.
Le eccezioni vengono sollevate da un’istruzione RAISE
e rilevate con un gestore, o dichiarativo, definito nel DECLARATIVES
parte della divisione della procedura. Le dichiarazioni sono sezioni che iniziano con un’istruzione USE
che specifica gli errori da gestire. Le eccezioni possono essere nomi o oggetti. RESUME
viene utilizzato in un dichiarativo per passare all’istruzione successiva a quella che ha generato l’eccezione oa una procedura esterna a DICHIARAZIONE
. A differenza di altri linguaggi, le eccezioni non rilevate potrebbero non terminare il programma e il programma può procedere inalterato.
I / OEdit
L’I / O del file è gestito dall’auto-descrizione OPEN
, CLOSE
, LEGGI
, e le istruzioni WRITE
insieme ad altre tre: REWRITE
, che aggiorna un record; START
, che seleziona i record successivi a cui accedere trovando un record con una determinata chiave; e UNLOCK
, che rilascia un blocco sull’ultimo record a cui si accede.
L’interazione dell’utente viene eseguita utilizzando ACCETTA
e DISPLAY
.
Manipolazione dei datiModifica
I seguenti verbi manipolano i dati:
-
INITIALIZE
, che imposta gli elementi di dati sui valori predefiniti. -
MOVE
, che assegna valori agli elementi di dati; MOVE CORRESPONDING assegna campi corrispondenti con lo stesso nome. -
SET
, che ha 15 formati: può modificare indici, assegnare riferimenti a oggetti e alterare tabelle capacità, tra le altre funzioni. -
ADD
,SUBTRACT
,MULTIPLY
,DIVIDE
eCOMPUTE
, che gestiscono aritmetica (conCOMPUTE
che assegna il risultato di una formula a una variabile). -
ALLOCATE
eFREE
, che gestiscono la memoria dinamica. -
CONVALIDA
, che convalida e distribuisce i dati come specificato nella descrizione di un elemento nella divisione dati. -
STRING
eUNSTRING
, che concatena e divide le stringhe, rispettivamente. -
INSPECT
, che corrisponde o sostituisce le istanze di sottostringhe specificate all’interno di una stringa. -
SEARCH
, che cerca la prima voce in una tabella soddisfare una condizione.
I file e le tabelle vengono ordinati utilizzando SORT
e MERGE
verbo unisce e ordina i file. Il verbo RELEASE
fornisce i record da ordinare e RETURN
recupera i record ordinati in ordine.
Scope terminationEdit
Alcune istruzioni, come IF
e READ
, possono contenere a loro volta istruzioni. Tali istruzioni possono essere terminate in due modi: da un punto (terminazione implicita), che termina tutte le istruzioni non terminate contenute, o da un terminatore di ambito, che termina l’istruzione aperta corrispondente più vicina.
Le istruzioni nidificate terminano con un periodo sono una fonte comune di bug. Ad esempio, esamina il codice seguente:
IF x DISPLAY y. DISPLAY z.
Qui, lo scopo è visualizzare y
e z
se la condizione x
è vera. Tuttavia, z
verrà visualizzato qualunque sia il valore di x
perché l’istruzione IF
è terminata da un punto errato dopo DISPLAY y
.
Un altro bug è il risultato del problema else penzoloni, quando due possono essere associate a un ELSE
.
IF x IF y DISPLAY aELSE DISPLAY b.
Nel frammento precedente, l’istruzione ELSE
viene associata all’istruzione IF y
invece che all’istruzione IF x
, che causa un bug. Prima dell’introduzione di terminatori di ambito espliciti, impedirlo richiedeva che ELSE NEXT SENTENCE
fosse inserito dopo IF
.
Codice auto-modificante Modifica
La specifica COBOL originale (1959) supportava il famigerato ALTER X TO PROCCEED TO Y
istruzione, per la quale molti compilatori hanno generato codice auto-modificante. X
e Y
sono etichette di procedura e il singolo VAI A
istruzione nella procedura X
eseguita dopo tale istruzione ALTER
significa VAI A Y
invece. Molti compilatori lo supportano ancora, ma è stato ritenuto obsoleto nello standard COBOL 1985 ed è stato eliminato nel 2002.
L’istruzione ALTER
è stata scarsamente considerata perché ha minato la “località del contesto” e ha reso la logica generale di un programma difficile da comprendere. Come scrisse l’autore del libro di testo Daniel D. McCracken nel 1976, quando “qualcuno che non ha mai visto il programma prima deve familiarizzarsi con esso il più rapidamente possibile , a volte sotto pressione temporale critica perché il programma ha fallito … la vista di un’istruzione GO TO in un paragrafo da sola, che segnala l’esistenza di un numero imprecisato di dichiarazioni ALTER in posizioni sconosciute in tutto il programma, fa paura il cuore del programmatore più coraggioso. “
Hello, worldEdit
Un programma” Hello, world “in COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. hello-world. PROCEDURE DIVISION. DISPLAY "Hello, world!" .
Quando il – ora famoso – esempio di programma “Hello, World!” in The C Programming Language è stato pubblicato per la prima volta nel 1978 un simile mai L’esempio del programma nframe COBOL sarebbe stato inviato tramite JCL, molto probabilmente utilizzando un lettore di schede perforate e schede perforate a 80 colonne. L’elenco seguente, con una DATA DIVISION vuota, è stato testato utilizzando GNU / Linux e l’emulatore System / 370 Hercules con MVS 3.8J. Il JCL, scritto nel luglio 2015, deriva dai tutorial e dagli esempi di Hercules ospitati da Jay Moseley. In linea con la programmazione COBOL di quell’epoca, HELLO, WORLD viene visualizzato in tutte le lettere maiuscole.
Dopo aver inviato JCL, la console MVS mostrava:
19.52.48 JOB 3 $HASP100 COBUCLG ON READER1 COBOL BASE TEST 19.52.48 JOB 3 IEF677I WARNING MESSAGE(S) FOR JOB COBUCLG ISSUED 19.52.48 JOB 3 $HASP373 COBUCLG STARTED - INIT 1 - CLASS A - SYS BSP1 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSLIB DD STATEMENT MISSING 19.52.48 JOB 3 IEC130I SYSPUNCH DD STATEMENT MISSING 19.52.48 JOB 3 IEFACTRT - Stepname Procstep Program Retcode 19.52.48 JOB 3 COBUCLG BASETEST COB IKFCBL00 RC= 0000 19.52.48 JOB 3 COBUCLG BASETEST LKED IEWL RC= 0000 19.52.48 JOB 3 +HELLO, WORLD 19.52.48 JOB 3 COBUCLG BASETEST GO PGM=*.DD RC= 0000 19.52.48 JOB 3 $HASP395 COBUCLG ENDED
Riga 10 dell’elenco di console sopra è evidenziato per effetto, l’evidenziazione non fa parte dell’effettivo output della console.
L’elenco del compilatore associato generato su quattro pagine di dettagli tecnici e informazioni sull’esecuzione del lavoro, per la singola riga di output dalle 14 righe di COBOL.