Il COBOL ( COmmon Business Oriented Language ) è stato creato nel 1959 (CODASYL Aprile 1960) per sviluppare applicazioni commerciali.
Il COBOL nasce dall’esigenza di disporre di un linguaggio per trattare problemi commerciali, comune a più piattaforme. Un comitato di persone provenienti dalle industrie produttrici di calcolatori, utilizzatori e dall’esercito, lo Short-Range Committee, produsse le specifiche ispirandosi a linguaggi già in uso, principalmente il molto diffuso FLOW-MATIC, della Remington-Rand UNIVAC, AIMACO (AIr Materiel Command) sviluppato dalla Air Force degli S.U., Commercial Translator (COMTRAN) della IBM, che esisteva solamente come specifiche e FACT, linguaggio commerciale piuttosto evoluto di Honeywell. Da FLOW-MATIC venne l’utilizzo di nomi di variabili significativi, di istruzioni in inglese e l’utilizzo ottimizzato della memoria; dal Commercial Translator venne la gestione delle espressioni, le variabili booleane, che permettevano di scrivere IF VARIABILE, la sottolivellazione dei campi, la clausola NOMEVARIABILE OF NOMEFILE. Dal FACT, ma per le versioni successive di COBOL, l’ispirazione per il Report Writer e per l’istruzione SORT.
Una caratteristica innovativa è stata l’utilizzo dei soggetti impliciti, ad esempio si può scrivere: IF X = Y MOVE A TO B IF GREATER MOVE C TO B ...
Inizialmente fu proposto il verbo DEFINE quale mezzo per creare sequenze di comandi o abbreviazioni per i nomi, ciò fu successivamente abbandonato, sebbene, parzialmente sia rimasta la possibilità di abbreviare i nomi tramite la clausola REDEFINES.
Prim adi arrivare al nome
COBOL, furono scartati: BUSY (Business SYstem), BUSYL (Business SYstem
Language), INFOSYL (INFOrmation SYstem Language) DATASYL (DATA
SYstem Language), COSYL (COmmon SYstem Language) e COCOSYL (COmmonCOmputer
SYstem Language).
Le maggiori revisioni nel
1968 (ANS X3.23-1968), 1974 (ANS X3.23-1974) e 1985.
Il
COBOL è stato utilizzato estesamente, sembra quindi ingeneroso o per lo meno
paradossale il giudizio di Edsger Wybe Dijkstra
: "The use of COBOL
cripples the mind; its teaching should, therefore, be regarded as a criminal
offense." (L’uso del COBOL
indebolisce la mente; il suo insegnamento dovrebbe, quindi, essere considerato
come un’azione criminale).
I programmi COBOL hanno quattro parti (divisions), ognuna con uno specifico compito; all'interno delle DIVISION ci possono essere SECTION e paragrafi.
Esse sono, nell’ordine in cui compaiono in un sorgente:
· Identification Division Identifica il programma; può anche contenere una descrizione del programma. L'unico paragrafo necessario è il PROGRAM-ID. Opzionalmente si può indicare l'AUTHOR, l'INSTALLATION; la DATE-WRITTEN, la DATE-COMPILED e la SECURITY.
· Environment Division Definisce i file utilizzati dal programma, il calcolatore su cui è compilato ed il calcolatore su cui sarà eseguito. E’ la parte del COBOL che “interfaccia” la macchina. Contiene due sezioni: la configuration section e la input-output section. La configuration section indica tramite il paragrafo source computer il computer usato per compilare il programma e col paragrafo object computer il computer che sarà utilizzato per eseguire il programma.
ENVIRONMENT DIVISION.CONFIGURATION SECTION.
SOURCE-COMPUTER.
IBM-ES900.
OBJECT-COMPUTER.
VAX-8800.
Nell'input-output section sono fornite informazioni sui dispositivi di trattamento dei dati utilizzati nel programma. Qui di seguito un esempio.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
SELECT EMPLOYEE-FILE ASSIGN TO C:\EMPFILE .
SELECT TRANS-FILE ASSIGN TO PRINTER.
ORGANIZATION IS LINE SEQUENTIAL.
· Data Division Contiene la descrizione dei dati di input e output. Nella FILE SECTION sono descritti i formati dei record contenuti nei files di input e di output. La WORKING STORAGE SECTION è riservata alla descrizione delle aree di lavoro del programma e delle costanti. La LINKAGE SECTION è presente quando il programma riceve o produce dei dati non tramite file, ma da un altro programma, tramite la memoria del calcolatore, e descrive il formato di questi dati.
La definizione dei dati ha la struttura (fra parentesi [ ] le clausole opzionali):
lv
nome [REDEFINES nome].
lv nome [REDEFINES nome]
PICTURE schema [VALUE 'valore'].
Dove lv è un numero che indica il livello del campo. Il livello 01 inizia nell'area A, i livello da da 02 a 49 indicano una sottodivisione del soprastante campo a livello 01, ed iniziano nell'area B.
PICTURE é la parola chiave che precede schema ossia ampiezza e tipo di campo; esso può essere di tipo alfabetico, alfanumerico o numerico, rispettivamente indicati con A, X, e 9. La lunghezza è data dal numero di A, X, o 9 presenti. Per i numeri, inoltre è possibile indicare i decimali ed il segno.
La prima forma è relativa a campi che sono sottolivellati, il suo tipo è X (alfanumerico) e la lunghezza è la somma delle lunghezze dei suoi sottolivelli. Esempio:
01 VERSAMENTO.
05 VERSATORE PICTURE X(30).
05 DATA_VERSAMENTO.
10 ANNO PICTURE 9999.
10 MESE PICTURE 99.
10 GIORNO PICTURE 99.
05 IMPORTO PICTURE 999V99.
· Procedure Division Contiene le istruzioni del programma.
I programmi COBOL sono scritti su linee con tracciato fisso:
· Colonne 1 - 6: sono utilizzate, facoltativamente, per numerare le righe.
· Colonna 7: se presente *, è un commento. Il simbolo / indica alla stampante di andare a pagina nuova. Altri caratteri sono interpretati come continuazione di una costante della riga precedente.
· Colonne 8 - 11: è detta "Area A"; in essa devono iniziare DIVISION, SECTION, e i paragrafi.
· Colonne 12 - 72: è detta "Area B"; è l'area riservata alle istruzioni.
· Colonne 73 - 80: zona facoltativa utilizzabile per identificare il programma
La PROCEDURE DIVISION è la parte in cui è eseguita l'elaborazione dei dati. L'istruzione OPEN prepara ad accedere ai file riservandone l'utilizzo al programma; tramite l'istruzione READ i dati di input sono portati in memoria e con l'istruzione WRITE dalla memoria sono mandati su file. L'istruzione CLOSE termina le operazioni sul file, di fatto questo è disponibile ad altre elaborazioni o altri programmi.
Le istruzioni condizionali sono PERFORM UNTIL e IF ... THEN ... ELSE, il blocco di istruzioni condizionate da IF è terminato dal carattere . (punto).
Le istruzioni di assegnazione sono:
MOVE nome_di_dato/costante TO nome_di_dato ADD nome_di_dato/costante TO nome_di_dato SUBTRACT nome_di_dato/costante FROM nome_di_dato MULTIPLY nome_di_dato/costante BY nome_di_dato DIVIDE nome_di_dato/costante INTO nome_di_dato
Infine i comandi STOP-RUN ed EXIT rispettivamente terminano il programma o il sottoprogramma.
COBOL LIKE delle Olivetti DE700, macchine per i Data Entry. Un inizio di programmazione ad eventi: la personalizzazione del Data Entry era effettuata da routine associabili agli eventi inizio maschera di immissione, prima di immettere un campo, dopo l'immissione di un campo, ecc….
E’ un COBOL per applicazioni WEB, ha alcune semplificazioni e rigidità sintattiche, rispetto al COBOL standard. In particolare la gestione delle stringhe di dati variabili è inferiore a quella standard, l’istruzione CALL richiama solamente programmi esterni e l’utilizzo di componenti è limitato a componenti COBOL da includere nel sorgente. Contiene istruzioni per accedere a servizi INTERNET e di rete; supporta anche SQL (embedded SQL). Queste funzionalità lo rendono utilizzabile come applicativo CGI.
Qui di seguito un programma che visualizza la struttura delle directory di un disco.
* CobolScript Professional
Edition - release 3.00 (Demo) MS Windows
1
nome_file PIC X(8) VALUE "DIR.TXT".
FD nome_file
RECORD IS 60 BYTES. FD
nome_html RECORD IS 60 BYTES. 1
nome_directory OCCURS 60 TIMES PIC X. 1
nome_direcmemo OCCURS 60 TIMES PIC X. 1
CkSub PIC 999 VALUE 0.
1 I PIC 999 VALUE 0.
1 J PIC 999. 1
Eof PIC 9 VALUE 0. main. *
elenco semplice (/b) delle directory (aD) *
e sottodirctory (/S)
CALL "dir D:\ /s/aD/b |sort >" nome_file.
OPEN nome_file FOR READING.
PERFORM UNTIL Eof
READ nome_file INTO nome_directory
AT END MOVE 1 TO Eof
IF Eof = 0
PERFORM Cerca_Subdir
DISPLAY nome_direcmemo
END-IF
END-PERFORM. Fine_Input.
CLOSE nome_file.
STOP RUN.
Cerca_Subdir. * determina livello sottodirectory
e lascia l'ultima
MOVE ZERO TO
CkSub.
PERFORM VARYING I FROM 1 BY 1
UNTIL I EQUAL 60
IF nome_directory(I) EQUAL "\"
ADD 1 TO CkSub
END-IF
END-PERFORM.
COMPUTE J = 1 + CkSub
* 3.
PERFORM VARYING I FROM 1 BY 1 UNTIL CkSub = 0
IF nome_directory(I) EQUAL "\"
SUBTRACT 1 FROM CkSub
END-IF
MOVE SPACE TO nome_directory(I)
END-PERFORM.
MOVE SPACES TO nome_direcmemo.
PERFORM VARYING I FROM I BY 1 UNTIL I EQUAL 60
MOVE nome_directory(I) TO nome_direcmemo(J)
ADD 1 TO J
END-PERFORM. |
L’output è analogo a:
LINGUAGGI DI PROGRAMMAZIONE ADA APL_S APL2 IAPL111 BASIC_S LIBERTY BASIC PureBasic YABASIC BCPL CLEAN Cobol HASKELL_HUGS LISP ALisp CLisp-2.27 LOGO_S LOGO MSWLOGO LUA Miscellanea malebolge urisc PHP Python REXX Ruby TCL