Fortran

Fortran (fino alla versione 90 FORTRAN)  è un linguaggio di programmazione, compilato e imperativo, particolarmente adatto per il calcolo numerico e la scienza computazionale. 

Si tratta di uno dei primi linguaggi di programmazione, sviluppato a partire dal 1954 da un gruppo di lavoro guidato da John Backus; il primo manuale di riferimento per i programmatori in FORTRAN I, The FORTRAN automatic coding system for the IBM 704 EPDM, scritto dallo stesso Backus, è del 1956, mentre il compilatore fu pubblicato nel 1957.

Storia 
Il primo compilatore FORTRAN fu sviluppato a partire dal 1954 per il calcolatore IBM 704 da un gruppo di lavoro guidato da John Backus. Si trattava di un compilatore ottimizzante (o ottimizzatore), poiché i progettisti ritenevano che nessuno avrebbe usato un linguaggio la cui efficienza non si avvicinasse a quella dei linguaggi assemblatori.

Il linguaggio fu usato su larga scala soprattutto per scrivere programmi che eseguivano molti calcoli matematici e questo incoraggiò i progettisti a creare compilatori che generavano codice molto veloce. L'inclusione del tipo numero complesso rese poi il Fortran il linguaggio d'elezione nella comunità scientifica. Al giorno d'oggi vengono ancora progettati nuovi compilatori Fortran, con prestazioni sempre più alte. Non si deve dimenticare poi che molti progressi nella teoria e nel progetto dei compilatori sono proprio derivati dalla necessità di ottenere compilatori Fortran in grado di generare un "buon" codice.

Diverse sono le versioni Fortran apparse: il FORTRAN I nel 1957, il FORTRAN II nel 1958, il FORTRAN III nel 1958 (usato da una ventina di clienti dell'IBM, ma mai pubblicato come prodotto commerciale per la sua mancanza di portabilità),
il FORTRAN IV nel 1961 (la versione di maggiore uso e diffusione), il FORTRAN 66 nel 1966, il FORTRAN 77 nel 1977, il Fortran 90 nel 1990, il Fortran 95 nel 1995, il Fortran 2003 nel 2003 e il Fortran 2008 nel 2008.

Il FORTRAN II introdusse la possibilità di compilazioni separate, il FORTRAN III la possibilità di usare espressioni booleane (o logiche) e quella di inserire "in linea" codice in linguaggio assemblatore (cioè di mescolare istruzioni Fortran e istruzioni in linguaggio assemblatore). Fu questo a renderlo non portabile, poiché ciascun assemblatore ovviamente è specifico di un dato calcolatore, non essendo altro, in ultima analisi, che una forma simbolica del suo linguaggio macchina. Le espressioni booleane furono introdotte anche nel FORTAN IV, insieme alla nuova istruzione condizionale IF logico in grado di eseguire un test sulla veridicità di un'espressione booleana, che si aggiungeva alla precedente istruzione condizionale IF aritmetico presente nel FORTRAN II (che a sua volta l'aveva ereditata dal FORTRAN I, come si può vedere nel programma d'esempio, riportato sotto, che calcola il massimo di N numeri). Questa valutava invece un'espressione numerica e prevedeva tre diversi salti a seconda che il suo valore fosse negativo, nullo o positivo.

I primi programmi in FORTRAN venivano perforati per lo più su schede a 80 colonne, con regole molto stringenti sul formato della singola istruzione. In particolare: una riga di codice non poteva superare i 72 caratteri, che venivano perforati nelle colonne da 1 a 72, se la colonna 1 conteneva una C i caratteri successivi costituivano un commento, le colonne da 2 a 5 erano riservate ad un'etichetta numerica che identificava l'istruzione e che poteva essere usata per saltare all'istruzione stessa da un altro punto del programma, le colonne da 7 a 72 contenevano l'istruzione vera e propria, la colonna 6 (normalmente vuota) se conteneva un carattere qualsiasi (spesso un *) indicava che l'istruzione era il seguito dell'istruzione perforata nella scheda precedente. D'altra parte, le colonne da 73 a 80 venivano spesso usate per numerare le schede e permettere così di riordinarle nel caso fossero state accidentalmente mescolate.

Con l'avvento del Fortran 90, una revisione "principale" del linguaggio, queste regole stringenti sono state abbandonate in favore del codice in formato libero. Altre notevoli innovazioni introdotte dal Fortran 90 sono l'allocazione dinamica della memoria, le operazioni sugli array, i tipi di dati astratti, l'overloading (o sovraccarico) degli operatori, i puntatori e i moduli (questi ultimi consentono di raggruppare sottoprogrammi e dati correlati).

Il Fortran 95, una revisione "minore" del linguaggio, ha introdotto essenzialmente la possibilità delle programmazione parallela.

Lo standard formale più recente del linguaggio è il Fortran 2003 (anche se il documento che lo definisce è stato pubblicato nel 2004). Si tratta di un'estensione propria del Fortran 95, che include l'aritmetica in virgola mobile IEEE 754, la gestione delle eccezioni, costrutti per la programmazione orientata agli oggetti e una migliorata interoperabilità col linguaggio C.

Descrizione 
Grazie sia agli innumerevoli programmi applicativi sviluppati nel corso degli anni, sia alle immense librerie di funzioni (richiamabili anche da programmi scritti con altri linguaggi di programmazione), il Fortran è tuttora un linguaggio molto usato. Di esso esistono varianti per il calcolo parallelo (usate nel calcolo scientifico: simulazione di fluidi, interazioni fra particelle, previsioni meteorologiche, ecc.); inoltre, anche se progettato originariamente come linguaggio procedurale, alcune sue versioni più recenti consentono di usare anche costrutti propri della programmazione orientata agli oggetti.

Caratteristiche 
Il Fortran è un linguaggio quasi sempre compilato, imperativo, con tipizzazione statica delle variabili, progettato principalmente per il calcolo scientifico e numerico; vi sono state però anche implementazioni con codice interpretato. Un tipo particolare di Fortran compilato è il Fortran FLAG (Fortran Load And Go), sviluppato da Bob Richardson, programmatore presso la Rice University, molto usato negli anni settanta per l'esecuzione di programmi non troppo complessi.

I primi programmi in Fortran, come già detto, dovevano essere scritti con regole molto stringenti (imposte dall'uso delle schede perforate). Inoltre facevano un uso piuttosto pesante di etichette numeriche e dell'istruzione di salto GOTO. Queste "necessità" sono state eliminate dalle versioni più recenti del linguaggio. Sono stati inoltre introdotti concetti "moderni" di programmazione (ad esempio il costrutto IF-THEN-ELSE, a partire dal FORTRAN 77), sempre tuttavia non perdendo di vista gli obiettivi della sinteticità del codice sorgente e dell'efficienza del codice eseguibile. In Fortran sono anche stati scritti molti linguaggi specializzati, fra cui il SAS, per la generazione di report statistici e il SIMSCRIPT, per la simulazione di sistemi a code.

I fabbricanti di calcolatori scientifici ad alte prestazioni (come ad esempio Burroughs, CDC, Cray, Honeywell, IBM, Texas Instruments, UNIVAC) hanno aggiunto al linguaggio estensioni allo scopo di sfruttare particolari caratteristiche delle proprie macchine (come esempio si possono ricordare il FORTRAN VI G, il FORTRAN IV H e il FORTRAN IV H Extended dell'IBM, o il FORTRAN V dell'UNIVAC). Il destino delle estensioni è di essere abbandonate o di essere incorporate in versioni successive del linguaggio. Per finire si può ricordare che si sta sviluppando un nuovo linguaggio, il Fortress, che dovrebbe, nelle intenzioni dei progettisti, sostituire il Fortran.

Standard 
I documenti elencati nel seguito si riferiscono alle più recenti standardizzazioni del Fortran.
 ANSI X3.198-1992 (R1997). Titolo: Programming Language "Fortran" Extended. Noto informalmente come Fortran 90. Pubblicato dall'ANSI.
 ISO/IEC 1539-1:1997. Titolo: Information technology – Programming languages – Fortran – Part 1: Base language. Noto informalmente come Fortran 95. Esistono altre due parti di questo standard. La parte 1 è stata formalmente adottata dall'ANSI.
 ISO/IEC 1539-1:2004. Titolo: Information technology – Programming languages – Fortran – Part 1: Base language. Noto informalmente come Fortran 2003.
 ISO/IEC 1539-1:2010. Titolo: Information technology – Programming languages – Fortran – Part 1: Base language. Noto informalmente come Fortran 2008.

Varianti e estensioni 
ALTRAN era un'estensione al linguaggio che aggiungeva a quest'ultimo l'algebra razionale, sviluppata da W.S. Brown ai Laboratori Bell intorno al 1968.

Sintassi 
Trattandosi del primo linguaggio di programmazione ad alto livello, il Fortran ha una sintassi che può apparire oscura ai programmatori che hanno familiarità solo con linguaggi molto più recenti, come ad esempio il C. Tuttavia le più recenti versioni del linguaggio tengono conto dei progressi compiuti nel campo dei linguaggi di programmazione e cercano di scoraggiare tale sintassi in favore di una più trasparente e robusta. La "vecchia" sintassi infatti rende molto difficile progettare un analizzatore lessicale, e può bastare anche un solo carattere sbagliato a generare errori rilevabili solo in esecuzione, anziché in compilazione. I costrutti introdotti nelle versioni più recenti, così come la possibilità di scrivere codice in formato libero (cioè non più vincolato al rigido formalismo originale imposto dalle schede perforate) hanno molto ridotto i problemi, anche se una buona programmazione rimane sempre il miglior modo di procedere.

Si dovrebbe anche considerare il fatto che le caratteristiche del Fortran sono state ritagliate essenzialmente sul calcolo scientifico e numerico, piuttosto che sullo sviluppo del software. Così nel Fortran 95, ad esempio, esistono comandi molto brevi che consentono di effettuare operazioni matematiche sugli array, che non solo rendono i programmi molto più leggibili, ma sono di ausilio al compilatore, nel caso quest'ultimo sia in grado di generare codice che esegue operazioni matematiche in parallelo. Per i motivi accennati il Fortran, anche se è poco usato per applicazioni estranee al calcolo scientifico e numerico, rimane tuttora il linguaggio d'elezione in tali campi, oltretutto perché anche persone digiune di programmazione possono imparare facilmente a scrivere un codice efficiente.

Dato che il Fortran esiste ormai da mezzo secolo, i programmi scritti in questo linguaggio (specialmente in FORTRAN 77, il suo dialetto più importante) tuttora usati sono innumerevoli. Il Fortran rimane inoltre il linguaggio di prima scelta per i programmi destinati a girare sui supercomputer, come ad esempio quelli usati per le previsioni meteorologiche, basati sui modelli matematici della fisica dell'atmosfera.

Esempi di programmi

Hello, world! 
Il seguente esempio stampa il testo "Hello, world!".
PROGRAM HELLO
 PRINT *, 'Hello, world!'
END

Uno dei primi programmi in Fortran 
Il programma seguente, scritto da Backus, è riportato nel manuale per il programmatore del FORTRAN I citato sopra. Il programma legge N numeri e ne calcola il massimo.
   DIMENSION A(999) 
   FREQUENCY 30 (2,1,10), 5(100) 
   READ 1, N, (A(I), I = 1,N) 
 1 FORMAT (I3/(12F6.2)) 
   BIGA = A(1) 
 5 DO 20 I = 2,N 
30 IF (BIGA-A(I)) 10,20,20
10 BIGA = A(I)
20 CONTINUE
   PRINT 2, N, BIGA 
 2 FORMAT (22H1THE LARGEST OF THESE NUMBERS IS F7.2) 
   STOP 77777

Minimo e massimo di un array 
Il seguente programma FORTRAN 90 calcola il valore massimo e il valore minimo di un array con estensione 5
PROGRAM minimo_massimo_array

IMPLICIT NONE
INTEGER, PARAMETER :: estensione=5
INTEGER, DIMENSION(estensione) :: array
INTEGER :: i
INTEGER :: Min
INTEGER :: Max

WRITE(*,*) 'Inserisci i',estensione,'valori dell''array:'
 DO i=1,estensione
  READ(*,*) array(i)
 END DO
 
min=array(1)
max=array(1)
DO i=2,estensione
 IF (array(i)<min) min=array(i)
 IF (array(i)>max) max=array(i)
END DO

WRITE(*,*) "Il valore minimo dell'array e':",Min
WRITE(*,*) "Il valore massimo dell'array e':",Max

STOP
END PROGRAM minimo_massimo_array

! Versione moderna che sfrutta le funzioni sugli array
! e che mostra l'uso del modulo intrinseco iso_fortran_env
program minimo_massimo_array
	use, intrinsic :: iso_fortran_env, only: ip=>int32, input_unit, output_unit
	implicit none
	
	integer(kind=ip), parameter :: estensione = 5_ip
	integer(kind=ip), dimension(estensione) :: array
	integer(kind=ip) :: j
	
	print "(a,i4,a)", "Inserisci ", estensione, "  valori interi"
	
	do j = 1_ip, estensione
		write(output_unit, "(i4,a)", advance = 'no') j, " : "
		read(input_unit,*) array(j)
	end do
	
	print "(a,i4)", "Valore minimo array: ", minval(array)
	print "(a,i4)", "Valore massimo array: ", maxval(array)
	
end program minimo_massimo_array

Note

Bibliografia

Altri progetti

Collegamenti esterni 
 
 
 
 

Linguaggi di programmazione orientati agli oggetti