Appunti di FORTRAN 77

Download Appunti di FORTRAN 77

Post on 05-Jan-2017

215 views

Category:

Documents

2 download

TRANSCRIPT

<ul><li><p>Appunti di FORTRAN 77</p><p>Maria Grazia Gasparo</p><p>Aprile 2011</p><p>i</p></li><li><p>ii</p></li><li><p>Indice</p><p>1 Linguaggio macchina e assembly 1</p><p>2 Linguaggi interpretati e compilati 3</p><p>3 Storia del FORTRAN 5</p><p>4 Perche insegnare il FORTRAN 77? 7</p><p>5 Realizzazione di un programma FORTRAN 85.1 Compilazione . . . . . . . . . . . . . . . . . . . . . . . . . . . 95.2 Collegamento . . . . . . . . . . . . . . . . . . . . . . . . . . . 11</p><p>6 Elementi di base del FORTRAN 126.1 Alfabeto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126.2 Struttura delle linee . . . . . . . . . . . . . . . . . . . . . . . 126.3 Struttura delle unita di programma . . . . . . . . . . . . . . . 136.4 Costanti, variabili e loro tipo . . . . . . . . . . . . . . . . . . 146.5 Variabili dimensionate (arrays) . . . . . . . . . . . . . . . . . 18</p><p>7 Espressioni e istruzione di assegnazione 227.1 Espressioni aritmetiche . . . . . . . . . . . . . . . . . . . . . . 227.2 Assegnazione aritmetica . . . . . . . . . . . . . . . . . . . . . 257.3 Fortran 90: operazioni fra arrays . . . . . . . . . . . . . . . . 25</p><p>8 Controllo del flusso di esecuzione 268.1 Istruzione GO TO . . . . . . . . . . . . . . . . . . . . . . . . 278.2 Istruzioni IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27</p><p>8.2.1 IF logico . . . . . . . . . . . . . . . . . . . . . . . . . . 288.2.2 IFTHENENDIF. . . . . . . . . . . . . . . . . . . . . 288.2.3 IFTHENELSEENDIF . . . . . . . . . . . . . . . . 308.2.4 IF concatenati. . . . . . . . . . . . . . . . . . . . . . . 32</p><p>8.3 Fortran 90: istruzione SELECT CASE. . . . . . . . . . . . . 348.4 Istruzione DO . . . . . . . . . . . . . . . . . . . . . . . . . . . 348.5 DO impliciti . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388.6 Fortran 90: DO illimitato e DO WHILE . . . . . . . . . . . . 39</p><p>9 Esempi riassuntivi 409.1 Esempio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409.2 Esempio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419.3 Esempio 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42</p><p>iii</p></li><li><p>10 Listruzione WRITE(u,f) 4310.1 Scrivere su un file. . . . . . . . . . . . . . . . . . . . . . . . . 4410.2 Scegliere il formato di scrittura. . . . . . . . . . . . . . . . . . 4510.3 Alcuni esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . 47</p><p>11 Sottoprogrammi 4811.1 Sottoprogrammi FUNCTION . . . . . . . . . . . . . . . . . . 4911.2 Sottoprogrammi SUBROUTINE . . . . . . . . . . . . . . . . 5411.3 Associazione fra argomenti muti e argomenti attuali . . . . . 5611.4 Argomenti muti dimensionati . . . . . . . . . . . . . . . . . . 5811.5 Dimensionamento variabile e indefinito per vettori . . . . . . 6011.6 Dimensionamento variabile e indefinito per matrici . . . . . . 62</p><p>12 Alcune regole di buona programmazione 6512.1 Istruzioni di scrittura nei sottoprogrammi . . . . . . . . . . . 6512.2 Istruzioni STOP e RETURN . . . . . . . . . . . . . . . . . . 6712.3 Arrays di lavoro . . . . . . . . . . . . . . . . . . . . . . . . . . 67</p><p>13 Esempi di programmi con sottoprogrammi 7013.1 Esempio 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7013.2 Esempio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7213.3 Esempio 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7513.4 Esempio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77</p><p>14 Istruzione EXTERNAL 81</p><p>15 Istruzione COMMON 82</p><p>Bibliografia 85</p><p>iv</p></li><li><p>1 Linguaggio macchina e assemblyassembly</p><p>Un linguaggio di programmazione e un linguaggio utilizzabile per scriverealgoritmi che il computer puo capire (direttamente o tramite una traduzione)e eseguire. Nellaccezione piu semplice, che in questo momento ci basta, unprogramma e un algoritmo scritto in un linguaggio di programmazione.</p><p>Il fatto che tutte le informazioni debbano essere memorizzate su un com-puter come sequenze di bits implica che anche le istruzioni di un algoritmo,per poter essere direttamente eseguite dal computer, devono essere scritte inun linguaggio il cui alfabeto e composto soltanto dai simboli 0 e 1. Nonsolo, ma la sintassi di questo linguaggio e strettamente dipendente dallar-chitettura della macchina ed e quindi diversa per ogni processore, o famigliadi processori. Data questa dipendenza, ci si riferisce a questo linguaggiocon lespressione generica linguaggio macchina. In un linguaggio di questotipo, ad ogni operazione elementare (aritmetica, logica, di assegnazione, disalto, etc...) corrisponde un codice operativo e ogni operando e identificatotramite lindirizzo della locazione in cui e memorizzato1. Codici operativi eindirizzi sono sequenze di 0 e 1 di lunghezza prefissata.</p><p>Scrivere o leggere un programma in linguaggio macchina e estremamentedifficile: si tratta in generale di programmi molto lunghi e complessi, incom-prensibili per i non addetti ai lavori. Il primo passo per superare questadifficolta fu la definizione dei cosiddetti linguaggi assembly, che nacqueropraticamente insieme ai primi computers negli anni 40. Questi sono ancoralinguaggi dipendenti dallhardware della macchina per cui sono progettati,perche le istruzioni sono in corrispondenza biunivoca con quelle del lin-guaggio macchina; daltra parte sono linguaggi simbolici e il loro utilizzo edecisamente piu facile. Con lespressione linguaggio simbolico si intendeche i codici operativi binari sono sostituiti da codici alfanumerici mnemonicidetti parole chiave (es: ADD per laddizione, STO per la memorizzazione) ei riferimenti alle locazioni di memoria avvengono attraverso nomi simbolici,o identificatori, scelti dallutente rispettando le regole stabilite dal linguag-gio. Per poter essere eseguito, un programma assembly deve essere tradottoin linguaggio macchina da un opportuno programma detto assembler. Eimportante aver presente che i linguaggi assembly non sono nientaltro cheversioni simboliche dei linguaggi macchina e non sono quindi portabili, nelsenso che un programma scritto per un computer non puo essere eseguitosu un altro computer con un processore diverso.</p><p>Il vero salto di qualita, dal punto di vista della portabilita dei programmie della facilita di programmazione, si ebbe negli anni 50, quando nacqueroi primi linguaggi di programmazione ad alto livello. Lidea di fondo eradefinire dei linguaggi la cui sintassi prescindesse dallarchitettura di un par-</p><p>1Un dato puo essere anche unistruzione del programma stesso. Si pensi ad esempioa unistruzione di salto Vai allistruzione tal dei tali, nella quale loperazione e espressadalla parola Vai e loperando e listruzione tal dei tali.</p><p>1</p></li><li><p>ticolare computer e fosse invece vicina al linguaggio parlato usato perdescrivere gli algoritmi. Siccome il tipo di algoritmi e di conseguenza il lin-guaggio comune utilizzato per descriverli era diverso a seconda degli ambitiapplicativi in cui un programmatore si trovava a lavorare, furono creati di-versi linguaggi ad alto livello destinati a settori diversi. I primi linguaggifurono :</p><p>FORTRAN (FORtran TRANslation), destinato ad algoritmi di naturamatematico/computazionale e sviluppato intorno al 1955 in ambiente IBMda un gruppo di lavoro guidato da J. Backus.</p><p>LISP (LISt Processing), per applicazioni nellambito dellintelligenza arti-ficiale, sviluppato intorno al 1958 al Massachussets Institute of Technologyda J. McCarthy e collaboratori.</p><p>COBOL (COmmon Business Oriented Language), finalizzato alla stesuradi programmi in ambito commerciale e imprenditoriale, sviluppato nel 1959da un comitato pubblico-privato noto come Short Range Committee.</p><p>ALGOL 60 (ALGOrithmic Language), nato nel 1958 come IAL (Interna-tional Algorithmic Language) grazie agli sforzi congiunti di una organiz-zazione europea (GAMM) e una statunitense (ACM) per creare un linguag-gio universale di descrizione degli algoritmi, non orientato a una particolareclasse di problemi. IAL fu successivamente modificato fino a dar luogo aALGOL 60, che e stato molto importante non tanto come linguaggio in sestesso (le versioni commerciali non hanno avuto successo) quanto come pri-mo esempio di linguaggio indipendente dalla macchina e dal problema, concostrutti sofisticati (scelte, cicli) non ancora previsti dagli altri linguaggi dialto livello.</p><p>BASIC (Beginners All-purpose Symbolic Instruction Code), sviluppato nel1964 al Darthmouth College da J. Kemeny e T. Kurtz come linguaggiodidattico, che facilitava lavvicinamento alla programmazione di studenti diqualunque provenienza e formazione culturale.</p><p>Con levolversi della tecnologia e delle architetture dei computers, i lin-guaggi di programmazione si sono evoluti, spesso dando luogo a numerosidialetti anche molto diversi dal linguaggio originale, e molti altri linguag-gi sono nati. ALGOL 60 influenzo in molti casi l evoluzione dei linguaggipreesistenti e la definizione di quelli nuovi. Ad esempio, un discendente di-retto di ALGOL e il PASCAL, sviluppato negli anni 1971-73 da N. Wirthcome linguaggio per insegnare i principi della programmazione nello spiritodi ALGOL, e molto diffuso nelle scuole statunitensi ed europee negli anni70-80. Negli stessi anni nacque il linguaggio C, ad opera di D.M. Richtie eK. Thompson, come linguaggio per la programmazione di sistema nellam-bito dello sviluppo del nascente sistema operativo Unix. La fortuna del C</p><p>2</p></li><li><p>e la sua evoluzione sono dovute al fatto che, pur essendo un linguaggio dialto livello, permette di accedere ad aspetti di basso livello del computer,come fanno i linguaggi assembly. Negli anni 80, con laffermarsi dei Person-al computers e delle interfacce grafiche, si sono sviluppati linguaggi orientatiagli oggetti, come C++ (un discendente del C sviluppato intorno al 1979 daB. Straustrup) e Java (1995, J. Gosling). Vogliamo infine citare MATLAB(MATrix LABoratory), un linguaggio, o meglio dire un ambiente di program-mazione, attualmente molto usato nellinsegnamento dellanalisi numerica edellalgebra lineare anche teorica. Il progetto MATLAB part verso la finedegli anni 70 ad opera di C. Moler per permettere ai suoi studenti di usarele librerie FORTRAN per lalgebra lineare senza dover imparare il linguag-gio FORTRAN. Visto il successo delloperazione, negli anni 80 la proprietafu acquisita dal gruppo Mathworks, che da allora ha curato lo sviluppo e lavendita di MATLAB. Piu o meno negli anni in cui MATLAB diventava unlinguaggio di proprieta, nasceva il linguaggio GNU Octave, che ha molto incomune con MATLAB ed e open-source.</p><p>2 Linguaggi interpretati e compilati</p><p>Come gia detto per i programmi assembly, anche i programmi scritti in unlinguaggio di programmazione ad alto livello devono essere tradotti nel loroequivalente in linguaggio macchina per poter essere eseguiti. La traduzione emolto piu onerosa che per i programmi assembly dal momento che i linguaggiad alto livello prevedono lutilizzo di costrutti e istruzioni che non hannouna controparte diretta nei linguaggi macchina. Ad esempio, la sempliceistruzione di assegnazione</p><p>Assegna a c il valore di a+b,</p><p>che in un linguaggio piu algoritmico potremmo esprimere come</p><p>Poni c = a + b,</p><p>oppurec a + b,</p><p>ha una traduzione immediata del tipo</p><p>c = a + b (1) assegnazione</p><p>in tutti i linguaggi ad alto livello, ma non nel contesto di un linguaggiomacchina, dove ad essa corrisponde una sequenza di piu operazioni di bas-so livello. Per chiarire meglio questo punto, ricordiamo che loperazione diassegnazione si divide in due fasi: il calcolo del valore dellespressione alladestra del segno di = e la memorizzazione del risultato nella locazione as-sociata al nome simbolico indicato a sinistra del segno di =. Ricordiamo</p><p>3</p></li><li><p>anche che per eseguire le operazioni aritmetiche i processori utilizzano lo-cazioni speciali chiamate registri, con un numero di bits piu alto che nellenormali locazioni adibite alla memorizzazione dei numeri floating point (adesempio, 80 bits contro i 32 o 64 dei numeri reali in precisione semplice odoppia). Lo scopo di questa maggiore lunghezza e ovviamente quello di ac-cumulare un risultato piu preciso, la cui mantissa verra poi approssimata perarrotondamento al momento della memorizzazione in una normale locazionefloating point. Supponiamo per semplicita di lavorare su un computer conun solo registro, dove viene copiato un operando, mentre laltro resta nellasua locazione (situazioni piu realistiche, nelle quali i processori usano piu diun registro, sono descritte nel libro</p><p>Overton[3]). Allora, listruzione (</p><p>assegnazione1) viene spez-</p><p>zata in una sequenza di tre operazioni di un livello sufficientemente bassoda avere una codifica in linguaggio macchina:</p><p>1. Copia nel registro il contenuto della locazione corrispondente allidentifi-catore a;</p><p>2. Somma al contenuto del registro il contenuto della locazione individuatadal nome b, memorizzando il risultato nel registro stesso;</p><p>3. Trasferisci il contenuto del registro nella locazione corrispondente alli-dentificatore c.</p><p>Esistono due modalita per la traduzione di un programma in linguaggiomacchina: linterpretazione e la compilazione. Nel primo caso la traduzione elesecuzione vanno di pari passo: un interprete traduce unistruzione per vol-ta e, in assenza di errori di sintassi, la esegue immediatamente; le istruzioniin linguaggio macchina non vengono conservate in memoria. Nel secondocaso un compilatore traduce tutto il programma, generando un programmain linguaggio macchina equivalente a quello originale, che puo essere con-servato in memoria. La compilazione talvolta prevede due passaggi: primail programma viene tradotto in linguaggio assembly e poi lassembler tra-duce in linguaggio macchina. Sia gli interpreti che i compilatori sono a lorovolta programmi, spesso originariamente scritti in un linguaggio di program-mazione, tradotti in linguaggio macchina e definitivamente memorizzati sulcomputer.</p><p>In linea di principio, dato un qualsiasi linguaggio L e un qualsiasi pro-cessore P, si potrebbe progettare sia un interprete che un compilatore pertradurre programmi scritti in L nel linguaggio macchina di P. In prati-ca, alcuni linguaggi vengono tipicamente tradotti mediante interpretazione(linguaggi interpretati) e altri mediante compilazione (linguaggi compilati).Ad esempio MATLAB e la sua controparte GNU Octave sono interpretati,mentre FORTRAN, C e C++ sono compilati. In realta, molti informaticiritengono superata questa classificazione perche oggigiorno le due modalitadi traduzione spesso sono mescolate; ad esempio, il compilatore traduce ilprogramma in un linguaggio intermedio fra quello originale e lassembly, e</p><p>4</p></li><li><p>poi la traduzione in linguaggio macchina viene affidata a un interprete.</p><p>3 Storia del FORTRAN</p><p>Come gia accennato, il FORTRAN fu sviluppato, primo fra i linguaggi diprogrammazione ad alto livello, intorno al 1955 allIBM, destinato allalloranuovo computer IBM-704. Il primo compilatore fu elaborato nel 1957. Ilsuccesso di questo linguaggio rivoluzionario, che permetteva ai programma-tori di scrivere istruzioni piu vicine al linguaggio matematico (e inglese) cheal linguaggio macchina, fu tale che negli anni immediatamente successivicominciarono a proliferare dialetti, e corrispondenti compilatori,...</p></li></ul>