Introduzione a Tiny Cobol Jonathan Riddell, jr@jriddell.org v0.2 novembre 2001 Una breve introduzione a Tiny Cobol per chi non conosce Tiny Cobol o il Cobol in generale (traduzione di Fabio Teatini, <teafab@tiscali.it>). Questo documento Obbiettivo Una breve introduzione a Tiny Cobol per coloro che non conoscono Tiny Cobol o il Cobol in generale. Il lettore verrà accompagnato in un giro panoramico attraverso il Cobol, realizzerà un primo programma, e un altro più complicato mediante l'uso di make. Nuove versioni di questo documento L'ultima versione di questo documento può essere trovata presso il sito web di Tiny Cobol http://tiny-cobol.sourceforge.net. (NdT: Le informazioni contenute in questo documento sono aggiornate alla versione 0.55 di Tiny Cobol) Nota sui copyright (in lingua originale) This document is Copyright Jonathan Riddell 2001. You may copy and distribute it only under the terms of the GNU Free Documentation License, available at http://www.gnu.org/copyleft/fdl.html Nota sui copyright (in lingua italiana) Questo documento è coperto dal Copyright Jonathan Riddell 2001. Può essere copiato e distribuito soltanto rispettando i termini della licenza GNU Free Documentation License, disponibile presso http://www.gnu.org/copyleft/fdl.html Ringraziamenti Grazie alla squadra di Tiny Cobol, e in special modo a Rildo Pragana (http://members.zoom.com/rpragana), la nostra guida fidata. Grazie a Richard Bland, il mio tutore e maestro di tutto quel che riguarda il Cobol. Un plauso va anche alla gente di Debian, per avervi introdotto un programma sgmltools funzionante. É stato molto apprezzato. Traduzioni Non esistono ancora traduzioni di questo documento (oltre a questa italiana, ndT), e qualsiasi aiuto è benvenuto. Inoltre, questo documento è in Inglese britannico. Le parentesi graffe sono queste (), e i punti (che in inglese sono detti "period" ed assomiglia al nostro "periodo", ndT) sono cose che le ragazze hanno ogni mese. Ritenetevi fortunati, piuttosto, dal momento che questo documento non è scritto in lingua scozzese. Introduzione al Cobol e a Tiny Cobol Cobol Il Cobol è uno dei primi linguaggi di terza generazione. É stato sviluppato nel 1959 (è coetaneo del Fortran) per sostituire i linguaggi assembly specifici dei processori (i linguaggi di seconda generazione). Il primo standard ANSI è lo standard 68 (benché fosse comunemente utilizzato fin dal 1961). Gli standard successivi furono gli standard 74 e 85. La maggior parte dei programmi Cobol, utilizzati a tutt'oggi, sono conformi allo standard 85 (e anche Tiny Cobol è conforme a questo standard). I principali vantaggi del Cobol sui linguaggi concorrenti (come il C) erano: la maggiore velocità di input/output che consentiva, l'aritmetica con il punto decimale fisso che lo rendevano utile nei programmi per la contabilità, e la sintassi simile a quella della lingua inglese lo rendevano ottima la leggibilità e la documentazione. Queste caratteristiche lo hanno reso molto utile nei job per l'elaborazione di grandi moli di dati, o per effettuare l'aggiornamento notturno di un milione di conti correnti bancari, o ancora per l'elaborazione delle buste-paga. La sintassi simile all'inglese ha reso i programmi più facili da comprendere, cosicché i programmi aziendali possono essere modificati facilmente e superare il loro normale ciclo di vita. Il linguaggio Cobol è significativamente diverso dai linguaggi strutturati in blocchi come sono i linguaggi Pascal, C, e i suoi discendenti. Il Cobol non è strutturato in blocchi, e quindi non c'è modo di nascondere le variabili; c'è maggiore libertà mentre si scrivono i programmi; i numeri sono trattati in maniera più vicina alla rappresentazione aritmetica umana, ad esempio la virgola fissa o i numeri decimali vengono solitamente usati al posto della virgola mobile; l'I/O è orientato al record, e non allo stream o flusso; la ricorsione non è permessa e il linguaggio stesso è più vasto, in quanto non usa librerie. Altre informazioni sul Cobol possono essere trovate nelle FAQ relative al Cobol situate presso http://www.cobolreport.com/faqs/cobolfaq.htm Tiny Cobol Tradizionalmente, nella tipologia di persone che utilizzano il software Libero non sono comprese quelle che usano il Cobol. Questo è quanto il Jargon File afferma in merito: COBOL /koh'bol/ n. [COmmon Business-Oriented Language] Un linguaggio fiacco, prolisso, e cadente, usato da perforatori di schede per compiere azioni stupide e noiose sulle macchine mainframe dinosauriche. Gli hacker credono che tutti i programmatori COBOL siano macinatori di codice, e nessun hacker che si rispetti ammetterà mai di aver imparato il linguaggio. Il suo nome esteso viene raramente proferito senza espressioni rituali di disgusto o di orrore. C'è una famosa osservazione di Edsger W. Dijkstra, secondo cui "L'uso del COBOL storpia la mente; il suo insegnamento dovrebbe, quindi, essere considerato come un crimine." Indubbiamente questa è una critica alquanto violenta. Ma a contrastarla ci sono buone ragioni che spiegano perché il Cobol sia tutt'oggi rilevante. Ad oggi, sono utilizzate circa 100 miliardi di righe di Cobol. Moltissimo sviluppo viene tuttora effettuato in Cobol - si pensa che nel mondo ci sia 1 milione di sviluppatori, e che 2 miliardi di righe di Cobol vengano scritte ogni anno C'è una notevole domanda di programmatori Cobol da impiegare su sistemi già esistenti. In molti corsi universitari viene insegnato il Cobol Si può non essere concordi con l'autore del Jargon File Se quindi il Cobol ha ancora oggi la sua importanza, significa che sarà importante per molti utenti di software Libero, e da ciò deriva l'utilità e l'importanza di un compilatore Libero per il Cobol. E qui arriviamo al punto che riguarda Tiny Cobol. La sua creazione è stata diretta da Rildo Pragana ed è stato inizialmente rivolto all'ambiente ristretto del DOS. Ora Tiny Cobol è rivolto all'ambiente di programmazione molto più amichevole di Linux, ed è progredito moltissimo. La concorrenza Cobol per GCC, è un progetto per sviluppare un compilatore Cobol che sarà integrato nella GNU Compiler Collection, GCC. Non è ancora in uno stato utilizzabile. Installazione Come procurarsi Tiny Cobol Attualmente Tiny Cobol funziona solo con Linux o FreeBSD su un computer i386. Di recente è stato compilato con successo anche sulla piattaforma win32 con l'impiego degli strumenti di cygwin e quindi, se siete interessati, potete provare a cercare informazioni in merito negli archivi della mailing list (sono comunque disponibili anche i binari). Molto probabilmente, Tiny Cobol non sarà utilizzabile su qualche altra piattaforma, ma siete invitati a provare comunque. Potete scaricare Tiny Cobol dal suo sito web presso Sourceforge: http://tiny-cobol.sourceforge.net. Lì sono disponibili alcune versioni in formato RPM, ma la maggior parte delle persone vorrà scaricare le versioni compresse con GZIP. La dimensione del file è inferiore al mezzo megabyte. Copiate questo file in qualcosa come /usr/local/src e decomprimetelo (verrà così creata la relativa directory). Entrate nella directory, date uno sguardo al file README, e leggete tutto il file INSTALL. Il file INSTALL vi dirà di quali librerie avete bisogno; se ve ne manca qualcuna, installatela dal CD della vostra distribuzione, o scaricatela dai siti suggeriti. Inoltre questo file vi dirà che dovete avere installato GCC; se non è installato, ora non dovrete andare molto lontano per farlo, usando ancora il CD della vostra distribuzione, o un server ftp, oppure scaricandolo dal sito di GNU. Compilazione e installazione Per preparare la compilazione, recatevi nella directory di Tiny Cobol e digitate ./configure (esistono svariate opzioni per adattare configure, si veda il file INSTALL per leggerne i dettagli). Poi digitate `make' per compilare. Non avrete bisogno di essere root per farlo. Ora cambiate directory, `cd test_suite' e digitate `make tests'. Vedrete un flusso di risultati dovuti al lavoro di compilazione dei programmi di prova, ottenuti impiegando il compilatore appena compilato. Non tutti supereranno la fase di compilazione, (si ricordi che questo software è in stato alpha), ma la maggior parte dovrebbe farcela. Adesso andate nella directory originale e digitate 'make install'; questo copierà una libreria, il compilatore, il preprocessore, e pochi altri file, così da renderli pronti all'uso. Dovete essere root per farlo. I binari vengono posizionati in /usr/local/bin, le librerie in /usr/local/lib, e tutti gli altri file vanno in /usr/local/share/htcobol/, tranne il casi in cui venga specificato diversamente attraverso il programma configure. Aiuto, non funziona! Se qualcosa va storto e non sapete come aggiustarlo, leggete questo documento di nuovo. Assicuratevi di avere installato tutto ciò che serve, come GCC e le librerie necessarie (con le quali dovreste essere in grado di cavarvela, qualsiasi distribuzione Linux utilizziate). Successivamente leggete la pagina web di Tiny Cobol presso http://tiny-cobol.sourceforge.net. Non siete ancora sulla buona strada? Iscrivetevi alla mailing list tiny-cobol-users e chiedete gentilmente ai partecipanti. Potete iscrivervi presso http://lists.sourceforge.net/mailman/listinfo/tiny-cobol-users o inviando una e-mail a tiny-cobol-users-request@lists.sourceforge.net con 'subscribe' nel corpo del messaggio. L'indirizzo per pubblicare è tiny-cobol-users@lists.sourceforge.net. Dovreste anche ricercare negli archivi, nel caso in cui alla vostra domanda fosse già stato risposto prima. Gli archivi sono presso http://lists.sourceforge.net/archives/tiny-cobol-users/. Primo programma Gli editor Come la maggior parte dei linguaggi di programmazione, un programma Cobol è soltanto un file di testo che potete scrivere con il vostro editor preferito. Sia vim che Emacs fanno un buon lavoro col codice Cobol, e questo ci evita le guerre di religione. Emacs Non esiste una modalità Cobol che venga fornita come standard in GNU Emacs. In compenso, scaricatevi una copia del file cobol.el dal progetto 'Cobol for GCC'. Potete scaricare il file direttamente dal loro CVS presso http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/gcc/cobol/cobol.el?cvsroot=CobolForGCC. Aprite Emacs e compilate il file Lisp con M-x byte-compile-file. Spostate il file risultante Cobol.elc nella directory /usr/share/emacs/20.7/lisp/textmodes/ oppure nella directory equivalente per la vostra installazione. Aggiungete infine questo codice al file .emacs (o al .gnu-emacs di qualche distribuzione) situato nella vostra directory personale (in /home): (autoload 'cobol-mode "cobol" "COBOL Editing mode" t) (setq auto-mode-alist (append '(("\\.cpp$" . c++-mode) ("\\.hpp$" . c++-mode) ("\\.lsp$" . lisp-mode) ("\\.scm$" . scheme-mode) ("\\.pl$" . perl-mode) ("\\.cbl$" . cobol-mode) ("\\.CBL$" . cobol-mode) ("\\.COB$" . cobol-mode) ("\\.cob$" . cobol-mode) ("\\.CPY$" . cobol-mode) ("\\.cpy$" . cobol-mode) ) auto-mode-alist)) ;; Auto font lock mode (defvar font-lock-auto-mode-list (list 'c-mode 'c++-mode 'c++-c-mode 'emacs-lisp-mode 'lisp-mode 'perl-mode 'scheme-mode 'scribe-mode 'shell-script-mode 'cobol-mode 'dired-mode) "List of modes to always start in font-lock-mode") (defvar font-lock-mode-keyword-alist '((c++-c-mode . c-font-lock-keywords) (perl-mode . perl-font-lock-keywords) (cobol-mode . cobol-font-lock-keywords) (dired-mode . dired-font-lock-keywords)) "Associations between modes and keywords") (add-hook 'cobol-mode-hook '(lambda () (set (make-local-variable 'dabbrev-case-fold-search) t) (set (make-local-variable 'dabbrev-case-replace) t)) Aprite un file Cobol in Emacs, e digitate `M-x cobol-mode' e `M-x font-lock-mode' per ottenere la sintassi a colori. Grazie alla squadra 'Cobol for GCC' per aver realizzato questa modalità di Emacs. VIM Una guida per scrivere in Cobol con VIM, si trova in http://dimensional.com/~sitaram/cobol/. Altri editor Oltre a quelli detti, ci sono moltissimi altri editor. Tra questi, è interessante THE, un editor che imita gli editor del mainframe come Xedit. É disponibile presso http://www.lightlink.com/hessling/ un primo programma Ecco il programma Hello World in Cobol: * Hello World Program * GPL Copyleft Jonathan Riddell 2001 IDENTIFICATION DIVISION. PROGRAM-ID. hello. ENVIRONMENT DIVISION. DATA DIVISION. PROCEDURE DIVISION. DISPLAY "hello ," WITH NO ADVANCING DISPLAY "world!" STOP RUN. La struttura del programma, alquanto semplice, è composta di quattro sezioni, due delle quali hanno un qualche contenuto. Il PROGRAM-ID è semplicemente un nome per il programma, ma nella IDENTIFICATION DIVISION possono esserci anche altre informazioni. La ENVIRONMENT DIVISION può (è facoltativo) contenere informazioni riguardo la vostra configurazione, come il compilatore che state usando. La DATA DIVISION contiene tutte le dichiarazioni delle variabili di cui avete bisogno. Infine, la PROCEDURE DIVISION contiene le istruzioni vere e proprie del programma. Si noti l'uso abbondante di lettere maiuscole nel codice. L'uso delle maiuscole per le parore chiave del Cobol, permette di mantenere la compatibilità con altri compilatori e garantisce che le parole riservate siano in risalto rispetto alle stringhe e alle variabili. Con Tiny Cobol siete completamente liberi di non usare le maiuscole, così da evitarvi il rapido logorìo del tasto di Caps Lock. L'altra cosa da notare è la spaziatura. Fin dai tempi andati delle schede perforate, il Cobol ha mantenuto un controllo stretto sull'incolonnamento delle varie parti di codice: colonna 1-6 : numero di riga. colonna 7 : indicatore dell'area, asterisco per righe di commento, segno meno per la continuazione delle righe, barra diagonale per salto-pagina del listato altrimenti spazio. colonna 8-11 : Margine A, ove iniziano le divisioni, le sezioni, gli identificatori di paragrafo e qualche numero di livello. colonna 12-72: Margine B, per tutto ciò che non va messo in Margine A. colonna 73-80: area di identificazione del programma. Tiny Cobol non vi forza a mantenere questo regime, ma in questo modo potete mantenere più puliti i vostri programmi, e potete anche evitare che tutti gli altri compilatori facciano storie riguardo alla spaziatura, e inoltre la modalità Cobol di Emacs ne sarà lieta. Tiny Cobol, tuttavia, persiste sull'uso dell'asterisco nella prima o nella seconda colonna a rappresentare un commento. Adesso passiamo alla compilazione del programma. Salvate il codice sopra riportato come hello.cob e digitate il seguente comando: htcobol hello htcobol potrebbe emettere l'avvertimento (warning) che $COBDIR non è impostato; fintanto che l'installazione è avvenuta nella directory predefinita, questo non dovrebbe essere un problema; ma se avete modificato la directory, o se siete disturbati da strani messaggi di warning, aggiungete `export COBDIR=/usr/local/share/htcobol' o qualcosa di simile al vostro file .bashrc (o a .profile). Se poi vi si presenta il messaggio `Processing compiler parameters', si tratta di un buon segno. htcobol produrrà i file hello.lis e hello.s. hello.lis è una conversione del codice Cobol in qualcos'altro di più gestibile da parte del compilatore. hello.s è il codice assembly, il codice in linguaggio-macchina in formato leggibile. Se la vostra shell non riesce a trovare un programma di nome htcobol, verificate prima di tutto che la vostra variabile $PATH punti a /usr/local/bin/htcobol o comunque alla directory in cui avete fatto l'installazione (digitate echo $PATH). Se punta correttamente, allora verificate attentamente che sia stato tutto configurato, compilato e installato correttamente. Se avete scritto scorrettamente il codice sopra riportato, vi renderete conto che Tiny Cobol non è ancora molto bravo a riferire gli errori. Infatti, tutto quello che otterrete è un Segmentation Fault. Verificate attentamente di aver scritto tutto correttamente, non tralasciate alcuna punteggiatura, e mettete gli asterischi dei commenti nella prima colonna. Il prossimo passo è la compilazione del file assembly hello.s in codice macchina. il comando per farlo è: as -o hello.o hello.s as fa parte della collezione di compilatori GNU GCC, e se non l'avete installato dovete proprio avere una strana distribuzione (visto che avete appena adesso compilato Tiny Cobol). Cercate informazioni sull'installazione di as nella documentazione della vostra distribuzione. hello.o è un file oggetto, ma non è eseguibile direttamente perché non è stato linkato con le librerie necessarie. Questo è il comando finale: gcc -o hello hello.o -lhtcobol -lm Se siete arrivati fin qui non dovreste avere avuto i problemi trattati prima ma, se gcc non ha trovato le librerie libhtcobol o libm, potreste dover aggiornare il database delle librerie con il comando ldconfig. Alla fine avrete un programma funzionante che potrà essere eseguito con: ./hello Dovreste poterne vedere l'output: Hello, world! Era facilmente prevedibile. Se osservate il codice del programma dovrebbe essere ovvio quello che fanno DISPLAY e WITH NO ADVANCING (stampa senza andare a capo). Programmazione avanzata Un altro programma Ecco un programma leggermente più complicato; inseritelo in un file e salvatelo col nome addition.cob. IDENTIFICATION DIVISION. PROGRAM-ID. addition. ENVIRONMENT DIVISION. DATA DIVISION. WORKING-STORAGE SECTION. 77 myvar PIC 999 . 77 a PIC 99V999 VALUE 1.777 . 77 b PIC 99V99 VALUE ZERO . 77 c PIC 9V9 VALUE 5.5 . 77 d PIC 9v9 VALUE 5.5 . PROCEDURE DIVISION. DISPLAY "Inserite un numero" ACCEPT myvar DISPLAY "Il numero è ", myvar ADD a TO b ROUNDED DISPLAY "b è ", b ADD c TO d DISPLAY "d è ", d STOP RUN. Potete compilare questo programma con lo stesso procedimento seguito per hello.cob e, se incontrate un qualche Segmentation Fault, controllate bene il vostro programma prima di reclamare. Se siete a digiuno di Cobol, notate che vi troverete un inghippo. Inizialmente abbiamo dichiarato alcune variabili nella WORKING-STORAGE SECTION della DATA DIVISION. Il Cobol impone che tutte le variabili siano dichiarate in questa maniera. Le altre sezioni della DATA DIVISION si occupano dei file e dei link. Tutte le dichiarazioni di variabile iniziano, in questo programma, con `77'. Si intende che la variabile è posta al livello 77: non ha struttura interna e non è definita alcuna relazione con le altre variabili, inoltre non fa parte di un record (che in C corrisponde a una struct). Il nome della prima variabile è myvar; i nomi delle variabili possono essere sia in lettere maiuscole che in lettere minuscole, ma con Tiny Cobol dovete mantenere coerenza in tutto il programma. La clausola PIC specifica il tipo di variabile. Con i numeri 9 si intende che la variabile è un decimale, e utilizzando tre numeri 9 si ottiene una variabile che può assumere i valori da 0 a 999. Ci può anche essere una `S' prima dei numeri 9, e ciò attribuisce il segno alla variabile. Una `V' nella dichiarazione PIC significa che la variabile riserva una virgola decimale nella posizione con la V. Per variabili di grandi dimensioni si può scrivere 9(15), che è una variabile con 15 posizioni. L'impiego delle lettere A al posto dei numeri 9 trasforma la variabile in alfabetica, e utilizzando le X la variabile diventa alfanumerica. Infine, con VALUE può essere assegnato un valore iniziale alla variabile. I programmatori non avvezzi al Cobol potrebbero rimanere stupiti di come venga segnalata la conclusione di un'istruzione. La fine di un blocco di codice viene indicata con un punto, e le istruzioni non sono segnalate in alcun modo, mentre invece il compilatore Cobol riconosce l'inizio di una nuova istruzione quando incontra una delle tante parole caratteristiche del Cobol. La fine di una riga non è importante in Cobol. Un'altra cosa da notare nel codice qua sopra, sono le virgole aggiuntive, Le virgole sono del tutto facoltative in Cobol e potete metterle ovunque vogliate (anche da nessuna parte): non fa differenza. Usatele con parsimonia e manterrete il programma più ordinato. Quando lanciate il programma vi viene chiesto un numero, che poi viene stampato insieme ai risultati dei due calcoli. Il numero dato non può occupare uno spazio maggiore delle 3 posizioni allocategli, in caso contrario vengono accettate solo le ultime tre cifre. Se vengono forniti meno di tre caratteri, il numero verrà stampato con degli zeri iniziali. L'uso dei caratteri non numerici condurrà all'emissione di un qualche codice d'errore. La somma delle variabili a e b dovrebbe essere effettuata correttamente, e comunque vedrete che il risultato viene arrotondato come da noi desiderato (mediante ROUNDED, ndT). la somma di c con d non produrrà nulla, infatti il risultato è troppo grande perche sia ospitato dalla variable d. Provate a cambiare c in 1.5, ad esempio, e tutto andrà bene. Make A questo punto potreste anche esservi un po' stancati della sequenza htcobol, as, e gcc. Ebbene, c'è un modo migliore di procedere, con make. Make prende in input un file chiamato Makefile, e ne usa le istruzioni contenute per effettuare in un colpo solo tutte le compilazioni che servono. Inoltre, make controlla che un file non debba essere compilato prima di fare qualche altra cosa; se nessuna delle dipendenze del programma è cambiata dal'ultima compilazione, non viene effettuato nulla. Le regole del makefile sono della forma: obiettivo:dipendenze comando L'obiettivo (che deve iniziare in prima colonna) è il file che volete ottenere. Le dipendenze sono i file che da cui esso dipende. Il comando (che deve trovarsi sulla seconda riga e deve essere preceduto da un tab) è quello che verrebbe solitamente immesso dalla shell per fabbricare il vostro file. Ecco qui un Makefile per il programma addition: #un semplice makefile per un programma cobol composto da un singolo file addition:addition.o gcc -o addition addition.o -lhtcobol -lm addition.o:addition.s as -o addition addition.s addition.s:addition.cob htcobol addition Salvate questo file col nome 'Makefile' nella stessa directory di addition.cob, e digitate 'make': questo comando compila, assembla e linka tutto al posto vostro. Come comportamento predefinito, make effettua la compilazione del file relativo alla prima regola presente nel Makefile, così da produrre il binario di addition; ma questo file dipende da addition.o, che così deve essere creato prima. addition.o dipende da addition.s, e questo è il primo comando che make esegue. Ora può essere creato addition.o, e infine addition.o viene compilato per creare addition. Se provate a eseguire nuovamente make, non succederà nulla; in effetti, poiché nessuno dei file ha subìto modifiche, make non ha nessun compito da svolgere (e questo, make lo determina consultando la data dell'ultimo salvataggio dei file). Fate una qualche modifica ad addition.cob, ed eseguite make: verrà ripetuto l'intero procedimento. Uso avanzato di make Il precedente Makefile, però, ha un problema: come si fa a trasformarlo per fargli compilare un altro programma? Nel nostro caso vanno sostituiti solo alcuni "addition" ma, con programmi più complicati di questo, ciò potrebbe richiedere delle ore. Fortunatamente, make ha parecchi assi nella manica. Ecco un makefile più avanzato: #un makefile per un programma cobol composto da un singolo file PROGRAM := addition LIBS := -lhtcobol -lm OBJECTS := $(PROGRAM).o $(PROGRAM):$(OBJECTS) gcc -o $(PROGRAM) $(OBJECTS) $(LIBS) #la regola per tutti i file che terminano con .o #dipende dai file con stesso prefisso e che finiscono con .s # $@ è l'obbiettivo %.o:%.s as -o $@ $< %.s:%.cob htcobol $(PROGRAM) Il Makefile comincia con la definizione di alcune variabili. PROGRAM è il nome del programma da creare, e potete vederne l'uso nella prima regola (la variabile è preceduta da un simbolo del dollaro, e delimitata dalle parentesi). Le LIBS sono semplicemente le librerie che vi servono per compilare il programma. OBJECTS è qualsiasi file-oggetto necessario, in questo caso è soltanto quello che ha lo stesso nome del programma ed ha un .o alla fine, che è quanto è stato dichiarato. La seconda regola si applica a qualsiasi obbiettivo terminante con .o (%.o), e richiede il file con lo stesso nome ma col suffisso .s (%.s esprime una dipendenza). La variabile automatica $@ corrisponde al nome dell'obbiettivo e $< corrisponde alla prima dipendenza. A questo punto dovreste riuscire ad arrivare all'obiettivo finale. Se volete adattare questo Makefile ad un altro programma Cobol, tutto quel che dovete fare è una variazione della variabile $PROGRAM. Fine Questo è tutto, per ora. Qui ci sarebbe lo spazio per un altro capitolo che tratti di un programma composto da più di un file e che utilizzi il preprocessore, ma ciò va oltre le mie attuali conoscenze. Forse ci andrebbe anche qualche link a risorse sul Cobol. Jonathan Riddell, jr@jriddell.org