Questo sito contribuisce alla audience di

Innovazioni

Le innovazioni principali introdotte con il Fortran 90

Le innovazioni
principali introdotte con il Fortran 90 riguardano i seguenti argomenti:

•formato
libero, svincolato dal vecchio formato fisso, orientato alle colonne, che risentiva
ancora dell’impostazione tipica delle schede perforate;

•costrutti per la definizione di procedure e strutture dati modulari, tesi
a fornire una forma semplice e sicura per incapsulare dati e procedure;

•tipi di dati definiti da utente, derivati da uno o più dei 6 tipi
di dati intrinseci del Fortran;

•operazioni globali su array e definizione di un set di funzioni intrinseche
che operano su array;

•introduzione dei pointers, che consentono la creazione e la manipolazione
di strutture dati dinamiche;

•miglioramento dei costrutti per la computazione numerica, inclusa la disponibilità
di tipi numerici intrinseci parametrizzati;

•tipi di dati intrinseci non numerici parametrizzati, che consentono di
supportare più di un set di caratteri contemporanemente.

Con il Fortran
90 è possibile definire nuovi tipi di dati, nuovi operatori e assegnare
nuovi significati agli operatori esistenti. Tali possibilità consentono
di creare tipi di dati astratti definendo nuovi tipi di dati e le operazioni
che si possono eseguire su di essi. Ad esempio:

type studente

integer età

real altezza

character(len=300) nickname

end type giuseppe

è un tipo
di dato definito da utente a tre componenti. Per definire oggetti del tipo studente
è sufficiente fare una dichiarazione quale:

type(studente) Giuseppe, Marco

Nel Fortran 90
sono stati introdotti i moduli, essi rappresentano un metodo comodo per impacchettare
questi nuovi tipi di dati e le operazioni su di essi. I moduli si possono utilizzare
all’interno di una stessa applicazione oppure richiamare da applicazioni differenti,
come si può vedere dalla figura qui sopra. Il costrutto dei moduli fornisce
un supporto pratico ed efficace per la programmazione object-oriented e, al
tempo stesso, consente una programmazione più efficiente ed elegante.

Un modulo può contenere dichiarazioni dati e procedure che possono essere
utilizzate in parti diverse di un programma come mostra l’esempio che segue:

module total_stuff

contains

function total(n)

integer total, n, i

total = 0

do i = 1, n

total = total + i

end do

end function total

end module total_stuff

program do_total

use total_stuff

print*, total(100)

end program do_total

Il modulo e il
programma possono risiedere anche su files diversi; I moduli possono essere
compilati in modo del tutto analogo alle routine ma, a differenza di queste
ultime, devono essere accessibili al compilatore quando compila il programma
che li richiama.

Il modulo total_stuff è globale e qualsiasi programma può utilizzare
il modulo, così il tipo e la definizione della function total diventa
utilizzabile all’interno di quel programma (use association).

Il Fortran 90
ammette tre categorie di dati dinamici: pointers, allocatable arrays e array
automatici.

Un oggetto con
attributo pointer va associato con un target prima del suo utilizzo. Ciò
può avvenire allocando spazio per il target oppure assegnando il pointer
ad un target esistente. L’associazione del pointer con un target può
cambiare dinamicamente durante l’esecuzione del programma. Se il pointer è
un array la sua forma e la dimensione può cambiare dinamicamente, ma
il suo rank è fissato dalla dichiarazione. L’esempio che segue riporta
una dichiarazione di pointer array e della sua allocazione:

real, pointer::lengths(:)

allocate (lengths(200))

Con l’esecuzione
di un’istruzione allocate, lengths punta ad un array di 200 elementi (gli elementi
non hanno ancora valore).

I puntatori possono essere usati per creare strutture dati dinamiche quali liste
linked ed alberi.

Un array può
essere dichiarato allocatable. Lo spazio deve essere allocato per l’array prima
che esso possa essere usato in qualche calcolo. L’array può essere deallocato
e, successivamente, riallocato con una diversa dimensione durante l’esecuzione
del programma. La dimensione e la forma può cambiare ad ogni allocazione,
ma il rango è fissato dalla dichiarazione.

L’esempio che
segue mostra la dichiarazione di un allocatable array e la sua conseguente allocazione:

real, allocatable::lengths(:)

allocate (lengths(200))

Mentre il target
di un pointer può essere cambiato tramite riallocazione o assegnamento
di pointer, l’estensione di un allocatable array può essere cambiato
solo tramite deallocazione e riallocazione dell’array.

Se i valori degli elementi di un array allocatable devono essere preservati,
deve essere allocato un nuovo array e i valori devono essere spostati sul nuovo
array prima che venga deallocato il vecchio.

Un array automatico
è un array locale ad un sottoprogramma; questa struttura viene creata
quando si richiama la routine e rimossa quando termina l’esecuzione del sottoprogramma.
Questi oggetti sono utili nei sottoprogrammi per gestire array temporanei o
stringhe di caratteri le cui dimensioni variano nei diversi riferimenti al sottoprogramma,
come mostra il codice che segue per l’array temp.

subroutine swap_arrays(a,b)

real,dimension(:)::a,b

real,dimension(size(a))::temp

temp = a

a = b

b = temp

end subroutine swap_arrays

Si noti che size
è una funzione intrinseca, il cui significato è ovvio dal nome,
richiamabile da uno statement dichiarativo.

Infine, in chiusura, ricordiamo che il Fortran 90 introduce tre nuovi tipi di
comportamento dinamico: ricorsione, allocazione e deallocazione, assegnazione
di pointer.