2.17        COBOL

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.

2.17.1             Dialetti

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….

2.17.1.1       CobolScript

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