[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico] [volume] [parte]
La divisione ENVIRONMENT DIVISION costituisce la seconda parte di un programma COBOL. La divisione si compone di due sezioni: CONFIGURATION SECTION e INPUT-OUTPUT SECTION.
La sezione CONFIGURATION SECTION serve per indicare delle informazioni relative all'elaboratore usato per la compilazione del programma sorgente e a quello nel quale deve essere eseguito il programma, una volta compilato; inoltre, questa sezione permette di stabilire delle sostituzioni, come nel caso della virgola al posto del punto per separare la parte intera di un numero dalla parte decimale.
La sezione INPUT-OUTPUT SECTION serve per associare i file usati dal programma con le unità fisiche relative, a indicare le caratteristiche di tali file e a stabilire altri aspetti dello scambio di dati.
La struttura della divisione ENVIRONMENT DIVISION è sintetizzabile nello schema sintattico seguente:
ENVIRONMENT DIVISION. .--¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ --. | CONFIGURATION SECTION. | | ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | | [SOURCE-COMPUTER. source-computer-entry]. | | ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | | [OBJECT-COMPUTER. object-computer-entry]. | | ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | | [SPECIAL-NAMES. special-names-entry]. | `--¯¯¯¯¯¯¯¯¯¯¯¯¯ --' .-- --. | INPUT-OUTPUT SECTION. | | ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ | | FILE-CONTROL. file-control-entry... | | ¯¯¯¯¯¯¯¯¯¯¯¯ | | [I-O-CONTROL. input-output-control-entry...]. | `--¯¯¯¯¯¯¯¯¯¯¯ --' |
La sezione CONFIGURATION SECTION contiene le informazioni sul sistema usato per la compilazione del programma (nel paragrafo SOURCE-COMPUTER), il sistema nel quale il programma deve essere eseguito (nel paragrafo OBJECT-COMPUTER) e il paragrafo SPECIAL-NAMES che consente di effettuare alcune sostituzioni a dei valori che altrimenti resterebbero al loro stato predefinito.
CONFIGURATION SECTION. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ [SOURCE-COMPUTER. source-computer-entry]. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ [OBJECT-COMPUTER. object-computer-entry]. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ [SPECIAL-NAMES. special-names-entry]. ¯¯¯¯¯¯¯¯¯¯¯¯¯ |
Il paragrafo SOURCE-COMPUTER identifica l'elaboratore presso il quale si intende compilare il programma. Si utilizza secondo lo schema sintattico seguente:
SOURCE-COMPUTER. computer-name [WITH DEBUGGING MODE]. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |
Al posto della metavariabile computer-name deve essere indicata una parola COBOL, che serve solamente a titolo informativo nel sorgente. Se si specifica l'opzione DEBUGGING MODE si richiede al compilatore di prendere in considerazione, nel sorgente, tutte le righe annotate con la lettera D nella settima colonna e le istruzioni USE FOR DEBUGGING, che altrimenti verrebbero semplicemente ignorate.
Il paragrafo OBJECT COMPUTER identifica l'elaboratore presso il quale deve essere utilizzato il programma, una volta compilato. Lo schema sintattico per l'utilizzo di questo paragrafo è quello seguente:
OBJECT-COMPUTER. computer-name... . ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ |
Il nome dell'elaboratore (computer name) deve essere una parola COBOL e ha un significato puramente informativo. Alla fine dell'indicazione dell'ultimo nome, deve apparire un punto fermo.
Il paragrafo SPECIAL-NAMES serve ad associare un valore a dei nomi prestabiliti, quando si vuole che la funzione loro associata sia diversa da quella predefinita, oppure ad attribuire un «nome mnemonico» a un nome usato dal compilatore, che però non fa parte dello standard. Le dichiarazioni che possono apparire in questo paragrafo dipendono molto dalle caratteristiche del compilatore; quello che si vede nello schema sintattico seguente è il minimo che dovrebbe essere disponibile nella maggior parte dei casi:
SPECIAL-NAMES. ¯¯¯¯¯¯¯¯¯¯¯¯¯ implementor-name IS mnemonic-name ¯¯ [CURRENCY SIGN IS literal] ¯¯¯¯¯¯¯¯ ¯¯ [DECIMAL-POINT IS COMMA]. ¯¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯ |
Si utilizza la dichiarazione CURRENTY SIGN IS per fissare il simbolo predefinito da usare come segno di valuta; si usa la dichiarazione DECIMAL-POINT IS COMMA per rappresentare i valori numerici secondo la forma europea, dove la virgola indica la separazione tra la parte intera e quella decimale.
Si osservi che anche nel modello di definizione di una variabile (PICTURE), quando si usa la dichiarazione DECIMAL-POINT IS COMMA, il punto e la virgola si scambiano i ruoli. |
L'esempio seguente mostra un pezzo di programma in cui si vede l'uso di queste opzioni. Per la precisione, si assegna la lettera «E» per rappresentare la valuta:
|
L'attribuzione di un nome mnemonico a una parola non standard che però fa parte delle funzionalità specifiche del compilatore utilizzato, consente di limitare a questa sezione le modifiche per l'adattamento del programma a un compilatore che ha funzioni simili, ma descritte da parole diverse. Nell'esempio seguente, compilabile con OpenCOBOL, si sostituisce la parola CONSOLE con STANDARD-INPUT, per identificare la fonte dei dati in ingresso per l'istruzione ACCEPT:
|
Nell'esempio appena mostrato sono evidenziate le righe più importanti per la comprensione del meccanismo; si può comprendere che l'istruzione ACCEPT avrebbe potuto essere scritta semplicemente così:
|
Tuttavia, avendo utilizzato il nome mnemonico STANDARD-INPUT, se con un altro compilatore la console fosse identificata dalla sigla SPO (Supervisory printer output, come avveniva nel COBOL CMS (Computer management system della Burroughs negli anni 1980), basterebbe modificare la dichiarazione iniziale:
|
Per chiarezza, è il caso di sottolineare che STANDARD-INPUT ha valore per il compilatore solo in quanto viene dichiarato come nome mnemonico, dal momento che il linguaggio, nella sua veste ufficiale, non prevede la gestione dei flussi standard dei sistemi Unix.
La sezione INPUT-OUTPUT SECTION si suddivide in due paragrafi: FILE-CONTROL e I-O-CONTROL. Il paragrafo FILE-CONTROL specifica l'organizzazione e l'accesso dei file che vengono usati dal programma e le informazioni correlate a tali file; il paragrafo I-O-CONTROL serve a specificare informazioni aggiuntive sui file già dichiarati nell'altro paragrafo.
INPUT-OUTPUT SECTION. ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯ FILE-CONTROL. file-control-entry... ¯¯¯¯¯¯¯¯¯¯¯¯ [I-O-CONTROL. input-output-control-entry...]. ¯¯¯¯¯¯¯¯¯¯¯ |
Il paragrafo FILE-CONTROL serve a dichiarare i file utilizzati dal programma e a definire alcune loro caratteristiche. Tutti i file dichiarati nel paragrafo FILE-CONTROL devono essere descritti nella divisione DATA DIVISION; nello stesso modo, tutti i file descritti nella divisione DATA DIVISION, devono essere dichiarati nel paragrafo FILE-CONTROL.
Il linguaggio COBOL prevede una gestione dei file molto sofisticata, anche se non è detto che i compilatori mettano a disposizione sempre tutte le funzionalità standard. Si distinguono generalmente i tipi, in base alla loro «organizzazione», come sintetizzato nella tabella successiva.
Per il linguaggio COBOL i file sono sempre composti da record, pertanto l'accesso a un file si riferisce sempre a dei record. |
L'organizzazione del file definisce le potenzialità di accesso, ma in generale sono disponibili diverse varianti nel modo particolare di accedere ai record.
Il paragrafo FILE CONTROL si articola in dichiarazioni SELECT, una per ogni file, secondo lo schema sintattico sintetico seguente:
FILE-CONTROL. ¯¯¯¯¯¯¯¯¯¯¯¯ SELECT file-name ASSIGN TO hardware-name [altre-opzioni]. ¯¯¯¯¯¯ ¯¯¯¯¯¯ ... |
Il modo in cui l'istruzione SELECT si articola, dipende dall'organizzazione del file e dal metodo di accesso specifico che si vuole attuare sullo stesso. Nella logica originale del linguaggio, in questa fase non viene ancora indicato il nome del file reale, secondo il sistema operativo, perché generalmente per questa informazione si agisce nella divisione DATA DIVISION; tuttavia, spesso il compilatore permette, o richiede, di specificare il nome del file reale proprio nell'istruzione SELECT.
L'organizzazione di un file è una caratteristica immutabile, che stabilisce, oltre che le potenzialità di accesso, anche la sua forma fisica «reale», ovvero quella che viene gestita attraverso l'astrazione del sistema operativo.
L'organizzazione sequenziale è quella più semplice, dove normalmente i record logici del linguaggio corrispondono esattamente al contenuto del file fisico che li contiene.
L'organizzazione relativa richiede la capacità di abbinare delle informazioni ai record logici, per esempio per poter annotare che un record è stato cancellato. Per fare questo, il compilatore può inserire tutte le informazioni necessarie in un file solo, oppure può avvalersi di due file reali: uno per i dati, l'altro per le informazioni sui record.
L'organizzazione a indice richiede tutte le funzionalità di quella relativa, con l'aggiunta di poter gestire l'accesso in base a una o più chiavi. Nei compilatori COBOL attuali, è molto probabile che tutte le informazioni necessarie vengano gestite in un file fisico soltanto, ma originariamente era frequente l'uso di un file per i dati e di altri file per le chiavi (uno per ogni chiave).
In base a questa premessa, si deve intendere che un file che viene creato con una certa organizzazione, può essere usato solo con quella; inoltre, si può contare sul fatto che un file creato con un programma realizzato attraverso un certo compilatore COBOL, non può essere utilizzato con un programma generato con un altro.
Di fronte a questo problema di compatibilità dei dati, i file organizzati in modo sequenziale sono sempre l'unica garanzia per un trasferimento dei dati. D'altra parte, negli anni in cui il linguaggio COBOL aveva il suo massimo splendore, i nastri magnetici rappresentavano l'unità di memorizzazione «standard» tra le varie architetture proprietarie.
Lo schema sintattico semplificato per l'istruzione SELECT, da usare nel paragrafo FILE-CONTROL, per dichiarare un file sequenziale è quello che si può vedere nella figura successiva:
/ \ | hardware-name | SELECT file-name ASSIGN TO < > ¯¯¯¯¯¯ ¯¯¯¯¯¯ | literal-file-name | \ / .-- .-- --. --. | | AREA | | | RESERVE integer | | | | ¯¯¯¯¯¯¯ | AREAS | | `-- `-- --' --' [ ORGANIZATION IS [LINE] SEQUENTIAL ] ¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ [ ACCESS MODE IS SEQUENTIAL ] ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ [ FILE STATUS IS data-name ]. ¯¯¯¯¯¯ |
Il file sequenziale può essere letto o scritto soltanto in modo sequenziale, a partire dall'inizio. Se l'unità di memorizzazione che lo contiene è sequenziale per sua natura, come avviene per un nastro o un lettore di schede perforate, si può avere solo una fase di lettura o una fase di scrittura, senza la possibilità di mescolare le due operazioni, mentre se si dispone di un'unità di memorizzazione ad accesso diretto, come nel caso di un disco, si può leggere e poi sovrascrivere lo stesso record.
Nello schema sintattico, la metavariabile file-name deve essere sostituita con il nome che si vuole attribuire al file nell'ambito del programma (non si tratta del nome che questo ha eventualmente per il sistema operativo). La metavariabile hardware-name va sostituita con un nome che serve a identificare l'unità di memorizzazione che contiene il file; questo nome dipende dal compilatore ma generalmente si mette DISK per indicare un file su disco. Altri nomi per la metavariabile hardware-name potrebbero essere: TAPE, PRINTER, PUNCH, READER (gli ultimi due sarebbero un perforatore e un lettore di schede).
Il linguaggio COBOL è fatto per poter essere adattato a sistemi operativi molto diversi. In un sistema Unix, l'accesso alle unità di memorizzazione avviene attraverso dei file di dispositivo, pertanto, a seconda del compilatore, potrebbe anche essere superfluo dichiarare il tipo di unità di memorizzazione in questo modo, anche se in passato il linguaggio obbligava a farlo. Proprio per questo motivo, ci sono compilatori che, al posto di indicare il tipo di unità fisica attraverso un nome prestabilito, richiedono di mettere subito il percorso del file a cui si vuole fare riferimento, nonostante il linguaggio preveda per questo una dichiarazione separata nella divisione DATA DIVISION. In questo senso, nello schema sintattico appare la possibilità di indicare una stringa alfanumerica con il percorso del file (literal-file-name). |
Nella dichiarazione RESERVE integer, la metavariabile integer rappresenta un numero intero di record da usare come memoria tampone. Se non si usa questa dichiarazione che, come si vede dallo schema sintattico, è facoltativa, viene usata la dimensione predefinita.
La dichiarazione ORGANIZATION IS SEQUENTIAL è facoltativa e sottintesa; tuttavia va osservato il significato che assume quando si aggiunge la parola LINE. In generale, il linguaggio COBOL considera i file come composti da record di dimensione uniforme. Quando però si vuole lavorare con i file di testo, le righe di questi file sono suddivise in base alla presenza del codice di interruzione di riga (che può cambiare da un sistema operativo all'altro). Volendo considerare in COBOL le righe di un file di testo pari a dei record di dimensione variabile, occorre aggiungere l'opzione LINE, così da chiarire che si tratta sì di un'organizzazione sequenziale, ma di un file suddiviso in «righe».
La dichiarazione ACCESS MODE IS SEQUENTIAL è facoltativa, perché l'accesso a un file organizzato in modo sequenziale può essere solo sequenziale.
La dichiarazione FILE STATUS IS data-name consente di indicare una variabile (da specificare nella sezione WORKING-STORAGE SECTION della divisione DATA DIVISION) da usare eventualmente per conoscere lo stato dell'ultima operazione svolta sul file. Questa variabile deve poter rappresentare un valore di due caratteri (il modello di definizione della variabile deve essere XX) e quando contiene il valore zero indica che l'ultima operazione è stata eseguita con successo (si vedano le tabelle 464.28 e 464.29, che appaiono alla fine del capitolo).
Il punto fermo che conclude l'istruzione SELECT appare una volta sola, alla fine; tutta l'istruzione deve risiedere nell'area B.
Viene mostrato un esempio completo di un programma COBOL che legge un file sequenziale:
|
Il file indicato come FILE-NAME è associato in pratica al file input.seq
. Si può supporre che questo file abbia il contenuto seguente, senza alcun codice di interruzione di riga:
|
Eseguendo il programma dell'esempio si potrebbe ottenere il testo seguente attraverso lo schermo:
FILE STATUS: 00 FILE STATUS: 00 RECORD: aaaaaaaaaaaaaaaaaaaa FILE STATUS: 00 RECORD: bbbbbbbbbbbbbbbbbbbb FILE STATUS: 00 RECORD: cccccccccccccccccccc FILE STATUS: 00 RECORD: dddddddddddddddddddd FILE STATUS: 10 RECORD: dddddddddddddddddddd |
Lo schema sintattico semplificato per l'istruzione SELECT, da usare nel paragrafo FILE-CONTROL, per dichiarare un file organizzato in modo «relativo» è quello che si può vedere nella figura successiva:
/ \ | DISK | SELECT file-name ASSIGN TO < ¯¯¯¯ > ¯¯¯¯¯¯ ¯¯¯¯¯¯ | literal-file-name | \ / .-- .-- --. --. | | AREA | | | RESERVE integer | | | | ¯¯¯¯¯¯¯ | AREAS | | `-- `-- --' --' [ ORGANIZATION IS ] RELATIVE ¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯ .-- / SEQUENTIAL \ --. | | ¯¯¯¯¯¯¯¯¯¯ | | | | / \ | | | ACCESS MODE IS < | RANDOM | > | | ¯¯¯¯¯¯ | < ¯¯¯¯¯¯ > RELATIVE KEY IS data-name-1 | | | | | DYNAMIC | ¯¯¯¯¯¯¯¯ | | `-- \ \ ¯¯¯¯¯¯¯ / / --' [ FILE STATUS IS data-name-2 ]. ¯¯¯¯¯¯ |
Il file organizzato in modo relativo può essere utilizzato secondo un accesso sequenziale, oppure facendo riferimento ai record per numero, considerando che il primo ha proprio il numero uno. Quando si individuano i record per numero, si distinguono due modalità di accesso: diretto (RANDOM) e dinamico (DYNAMIC). L'accesso diretto richiede che per ogni operazione l'indicazione del numero del record a cui si vuole fare riferimento, mentre con l'accesso dinamico è anche possibile eseguire delle operazioni di lettura sequenziali (READ NEXT).
L'organizzazione relativa, oltre alle operazioni di lettura e scrittura, prevede la cancellazione dei record, che comunque possono essere rimpiazzati successivamente attraverso un'operazione di scrittura. Si osservi comunque che un record che risulta essere stato cancellato, non può essere letto.
Osservando lo schema sintattico si può intuire che la prima parte dell'istruzione SELECT funzioni nello stesso modo di un file organizzato sequenzialmente; la differenza più importante riguarda la definizione del tipo di unità di memorizzazione che, date le caratteristiche dei file organizzati in modo relativo, deve consentire un accesso diretto ai dati.
La dichiarazione RESERVE integer si usa nello stesso modo del file organizzato sequenzialmente.
L'indicazione dell'organizzazione, attraverso la dichiarazione ORGANIZATION IS RELATIVE è obbligatoria, anche se probabilmente è sufficiente scrivere soltanto RELATIVE.
Se non viene specificata la dichiarazione ACCESS MODE, si intende che l'accesso debba avvenire in modo sequenziale, altrimenti vale quanto indicato espressamente. Se l'accesso richiesto è diretto o dinamico, è necessario indicare quale variabile usare per specificare il numero del record, nella posizione occupata nello schema sintattico dalla metavariabile data-name-1 (da specificare ulteriormente nella sezione WORKING-STORAGE SECTION della divisione DATA DIVISION).
La dichiarazione FILE STATUS IS data-name-2 funziona nello stesso modo descritto a proposito dei file organizzati in modo sequenziale.
Il punto fermo che conclude l'istruzione SELECT appare una volta sola, alla fine; tutta l'istruzione deve risiedere nell'area B.
Viene mostrato un esempio completo di un programma COBOL che legge un file relativo, ad accesso diretto, scandendo sequenzialmente il numero del record:
|
Il file indicato come MIO-FILE è associato in pratica al file input.rel
. Si può supporre che questo file sia composto dall'elenco seguente di record logici:
aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccc
dddddddddddddddddddd
Eseguendo il programma dell'esempio si potrebbe ottenere il testo seguente attraverso lo schermo:
FILE STATUS: 00 FILE STATUS: 00 RECORD: 0001 aaaaaaaaaaaaaaaaaaaa FILE STATUS: 00 RECORD: 0002 bbbbbbbbbbbbbbbbbbbb FILE STATUS: 00 RECORD: 0003 cccccccccccccccccccc FILE STATUS: 00 RECORD: 0004 dddddddddddddddddddd INVALID KEY! FILE STATUS: 23 RECORD: 0005 dddddddddddddddddddd |
Segue un altro esempio completo per la lettura di un file relativo, utilizzando un accesso dinamico, partendo dal primo record e selezionando i successivi attraverso la richiesta del prossimo:
|
Il file che viene letto è lo stesso dell'esempio precedente e il risultato si dovrebbe ottenere, si può vedere così:
FILE STATUS: 00 FILE STATUS: 00 RECORD: 0001 aaaaaaaaaaaaaaaaaaaa FILE STATUS: 00 RECORD: 0002 bbbbbbbbbbbbbbbbbbbb FILE STATUS: 00 RECORD: 0003 cccccccccccccccccccc FILE STATUS: 00 RECORD: 0004 dddddddddddddddddddd END OF FILE! |
Lo schema sintattico semplificato per l'istruzione SELECT, da usare nel paragrafo FILE-CONTROL, per dichiarare un file organizzato a indici è quello che si può vedere nella figura successiva:
/ \ | DISK | SELECT file-name ASSIGN TO < ¯¯¯¯ > ¯¯¯¯¯¯ ¯¯¯¯¯¯ | literal-file-name | \ / .-- .-- --. --. | | AREA | | | RESERVE integer | | | | ¯¯¯¯¯¯¯ | AREAS | | `-- `-- --' --' [ ORGANIZATION IS ] INDEXED ¯¯¯¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯ .-- / \ --. | | SEQUENTIAL | | | | | | | ACCESS MODE IS < RANDOM > | | ¯¯¯¯¯¯ | ¯¯¯¯¯¯ | | | | DYNAMIC | | `-- \ ¯¯¯¯¯¯¯ / --' RECORD KEY IS data-name-1 [WITH DUPLICATES] ¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ [ ALTERNATE RECORD KEY IS data-name-2 [WITH DUPLICATES] ]... ¯¯¯¯¯¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ [ FILE STATUS IS data-name-3 ]. ¯¯¯¯¯¯ |
Un file organizzato a indice è un file che consente un accesso diretto ai record in base a una chiave costituita da una porzione del record stesso. A titolo di esempio, si può immaginare un file contenente i dati anagrafici dei dipendenti di un'azienda, che in una posizione precisa dei record riporta il numero di matricola di ognuno; in tal modo, il numero di matricola può essere usato per definire la chiave di accesso ai record.
Il file organizzato a indice può disporre di una o più chiavi di accesso e può essere consentita o meno la presenza di record con chiavi uguali.
Rispetto ai file organizzati sequenzialmente o in modo relativo, lo schema sintattico per i file organizzati a indice ha le dichiarazioni RECORD KEY e ALTERNATE RECORD KEY per poter specificare la chiave o le chiavi di accesso. Le metavariabili data-name-1 e data-name-2 devono essere nomi di porzioni di record, come dichiarato nella divisione DATA DIVISION, in corrispondenza della descrizione del record stesso. Naturalmente, l'opzione WITH DUPLICATES serve a dichiarare l'intenzione di gestire chiavi uguali su più record.
Oltre ai file comuni, per i quali si stabilisce un'organizzazione e un tipo di accesso, sono previsti dei file da usare soltanto per ottenere un riordino o una fusione (sort, merge). Per questi file occorre una dichiarazione apposita con l'istruzione SELECT, secondo lo schema sintattico seguente:
/ \ | DISK | SELECT sort-merge-file-name ASSIGN TO < ¯¯¯¯ > . ¯¯¯¯¯¯ ¯¯¯¯¯¯ | literal-file-name | \ / |
Viene proposto un esempio di riordino di file, nel quale, in particolare, si dichiarano i nomi dei file su disco, direttamente nell'istruzione SELECT:
|
Come si può vedere, si vuole ordinare il file input.seq
per generare il file output.seq
, ordinato. Per fare questo, si usa un file intermedio, denominato sort.tmp
. Al termine dell'operazione, non dovrebbe rimanere traccia del file intermedio.
Si osservi che non si rende necessaria l'apertura dei file coinvolti per portare a termine l'operazione. |
L'esempio seguente riguarda la fusione: si hanno i file input-1.seq
e input-2.seq
ordinati e si vuole ottenere il file output.seq
con la somma dei record, mantenendo l'ordinamento:
|
Si osservi che esistono compilatori COBOL, di buona qualità, che però non offrono le funzionalità di riordino e di fusione, oppure non in modo completo. È frequente l'assenza della funzione per la fusione dei file ordinati.
Il paragrafo I-O-CONTROL è opzionale e il suo scopo è quello di specificare l'utilizzo comune delle aree di memoria centrale adibite alla gestione dei file.
I-O-CONTROL. ¯¯¯¯¯¯¯¯¯¯¯ .-- .-- --. --. | | RECORD | | | | ¯¯¯¯¯¯ | | | SAME | SORT | AREA FOR file-name-1 [file-name-2]... |... . | ¯¯¯¯ | ¯¯¯¯ | | | | SORT-MERGE | | `-- `--¯¯¯¯¯¯¯¯¯¯--' --' |
L'utilità dell'utilizzo del paragrafo I-O-CONTROL dipende molto dal compilatore, che potrebbe anche limitarsi a ignorare l'istruzione SAME...AREA, in tutto o solo in parte. Tuttavia, quando l'istruzione SAME...AREA viene presa in considerazione, ci sono delle conseguenze nell'accesso ai file, che bisogna conoscere.
Per cominciare: si intuisce dallo schema sintattico che l'istruzione SAME...AREA inizia nell'area B del modulo di programmazione, si vede che il punto fermo è richiesto solo alla fine del gruppo di istruzioni SAME...AREA, inoltre sono evidenti quattro possibilità:
SAME AREA FOR file-name-1 [file-name-2]... . ¯¯¯¯ SAME RECORD AREA FOR file-name-1 [file-name-2]... . ¯¯¯¯ ¯¯¯¯¯¯ SAME SORT AREA FOR file-name-1 [file-name-2]... . ¯¯¯¯ ¯¯¯¯ SAME SORT-MERGE AREA FOR file-name-1 [file-name-2]... . ¯¯¯¯ ¯¯¯¯¯¯¯¯¯¯ |
Utilizzando la prima forma dell'istruzione SAME AREA, si intende richiedere al compilatore che la gestione dei file elencati sia fatta condividendo tutto quello che si può condividere nella memoria centrale. Così facendo, nell'ambito del gruppo specificato, solo un file può essere aperto simultaneamente; inoltre, se si utilizzano più istruzioni SAME AREA, un file può appartenere soltanto a uno di questi raggruppamenti.
Utilizzando l'istruzione SAME RECORD AREA si richiede al compilatore di gestire lo spazio della memoria tampone (dei record) di un gruppo di file in modo comune. Così facendo, la lettura di un record di un file del gruppo, comporta il fatto che gli stessi dati siano disponibili come se fossero stati letti da tutti gli altri file del gruppo. I file di un gruppo definito con questa istruzione possono essere aperti simultaneamente, ma le operazioni di accesso ai dati non possono essere simultanee; inoltre, un file può appartenere a un solo raggruppamento di questo tipo.
Teoricamente, i file indicati in un raggruppamento con l'istruzione SAME AREA possono apparire anche in un raggruppamento con l'istruzione SAME RECORD AREA, ma in tal caso deve trattarsi di tutti quelli che appartengono al primo di questi due (tutti quelli in SAME AREA devono essere parte di quello in SAME RECORD AREA). Inoltre, questo fatto comporta che i file che si trovano anche in SAME AREA non possono essere aperti simultaneamente.
Nei manuali COBOL classici si sottolinea il fatto che la condivisione dei record offra dei vantaggi in velocità e in risparmio di memoria; in particolare si suggerisce in tali manuali la possibilità di dichiarare nel dettaglio uno solo dei record del gruppo, oppure la possibilità di ridefinire i record cambiando il punto di vista (il record rispetto a quello di un altro). Tuttavia, considerata la potenza elaborativa degli elaboratori attuali, dal momento che esiste comunque la possibilità di ridefinire la suddivisione di un record, l'uso di questo paragrafo diventa sconsigliabile, se non altro per le complicazioni che si creano nell'interpretazione umana del programma sorgente. |
Le istruzioni SAME SORT AREA e SAME SORT-MERGE AREA sono equivalenti e consentono di condividere la memoria utilizzata per i file che servono specificatamente per il riordino o la fusione. Premesso che in questi raggruppamenti non possono apparire file che appartengono a un gruppo definito come SAME AREA, è invece possibile inserire anche nomi di file che non sono stati dichiarati per l'ordinamento o la fusione, ma la loro presenza fa sì che questi file non possano essere aperti quando invece lo sono quelli che si utilizzano proprio per tale scopo.
I file dichiarati con l'indicatore SD nella sezione FILE SECTION servono per portare a termine le operazioni di riordino e di fusione, ma si avvalgono di file in ingresso e di file in uscita, che vengono dichiarati normalmente con l'indicatore FD. Tutti i file coinvolti in un procedimento di riordino e di fusione, non devono essere aperti esplicitamente durante questa fase. |
|
|
Appunti di informatica libera 2006.07.01 --- Copyright © 2000-2006 Daniele Giacomini -- <daniele (ad) swlibero·org>
Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome divisione_171_environment_division_187.htm
[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [translators] [docinfo] [indice analitico]