2.29        FORTRAN

Il Fortran (FORmula TRANslating) è un linguaggio adatto per qualsiasi tipo di problema (general purpose), ma nato e principalmente usato per calcoli tecnico scientifici. Il Fortran ha origine nel 1950 alla IBM, il primo compilatore è prodotto negli anni 1954-1957 ad opera di un gruppo guidato da John Backus , ed è stato il primo compilatore per un linguaggio di alto livello. In esso compaiono i tipi di dato interi reali, numeri in doppia precisione e le costanti logiche TRUE e FALSE.

La grande diffusione del FORTRAN negli ambienti scientifici ha stimolato la ricerca sulla teoria dei compilatori, con lo scopo di ottenere programmi con un codice più efficiente.

Nel tempo il linguaggio ha avuto diverse revisioni: FORTRAN IV, FORTRAN 77, FORTRAN 90 ed il più recente FORTRAN 95 che rispecchia lo standard pubblicato nel 1997.

A vent’anni dalla su introduzione il giudizio di Dijkstra era "FORTRAN, the infantile disorder, by now nearly 20 years old, is hopelessly inadequate for whatever computer application you have in mind today: it is now too clumsy, too risky, and too expensive to use." (FORTRAN, il disordine infantile, adesso, vecchio di circa 20 anni, è irrimediabilmente inadeguato per qualsiasi applicazione informatica che si abbia in mente oggi:  è troppo sgraziato, troppo rischioso e troppo costoso da usare).

Le versioni di FORTRAN per i calcolatori scientifici ad alte prestazioni (Burroughs, CDC, CRAY, IBM, Texas Instruments, ...) generavano un codice per sfruttare al meglio le caratteristiche dell'hardware; la maggior parte di queste versioni è scomparsa con le macchine per cui era stata preparata. Rimangono ancora la OpenMP, un FORTRAN cross–platform per programmi che utilizzano memoria condivisa e CoArray Fortran, per la programmazione parallela.

Un programma Fortran è una sequenza di linee di testo con una sintassi fissa[1]:

Col. 1               Blank, o "c" o "*" per commenti

Col. 2-5            Etichetta opzionale

Col. 6               Se diverso da blank indica continuazione della linea precedente

Col. 7-72          Istruzioni

Col. 73-80        Numerazione

Un semplice esempio:

      program circle

      real r, area

c Questo programma legge un numero reale e stampa

c l’area del circolo di raggio r.

      write (*,*) 'Immettere il raggio:'

      read  (*,*) r

      area = 3.14159*r*r

      write (*,*) 'Area = ', area

      stop

      end

Un programma  Fortran generalmente consiste di una parte principale ed eventuali sottoprogrammi. La struttura del programma principale è:

      Nome del programma      es. program circle

      Dichiarazioni           es. real r, area

      Istruzioni              es. write (*,*) 'Give radius r:'

      stop

      end

I nomi di variabile sono da 1 a 6 caratteri scelti fra {ab...z01...9}. Il primo carattere deve essere una  lettera. Ogni variable deve essere dichiarata esplicitamente e se ne deve indicare il tipo; i tipi più comuni sono:  integer, real, double precision, complex, logical, character.

L'istruzione condizionale può assumere diverse forme, la piu' generale è:

      if (espressione logica) then

         istruzioni

      elseif (espressione logica) then

                  istruzioni

      else

                 istruzioni

      endif

Nelle forme più semplici possono mancare i costrutti elseif ed else. La forma più semplice, che deve essere scritta su una sola linea, è:

      if (espressione logica) istruzione

Esempio (valore assoluto di x):

      if (x .LT. 0) x = -x

Nell'esempio che segue sono generati dei numeri pseudocasuali[2], essi sono confrontati con quelli generati dall’istruzione del linguaggio RAND, tramite il test del chi quadro (v. par. 4.2.1 ) con simulazione di lanci di un dado:

c GNU G77     

      subroutine VISDATA(VALUES)

      integer VALUES(8)

      character(8) DATE

      character(9) TIME

      character(5) ZONE

      CALL Date_and_Time(DATE, TIME, ZONE, VALUES)

      return

      end

c

      program random

      integer i,j,k,l

c     simulazione lancio di un dado con generatore di numeri casuali del

c     compilatore, e generatore di numeri casuali col metodo del quadrato

      integer dado(6),dado2(6)

      real chiquad, chiquad2

      integer TmArray(8)

      CALL VISDATA(TmArray)

c     I seme formato da millisecondi e secondi

c     II seme formato da 10000 - millisecondi e secondi

      i = TmArray(8) * 10 + MOD(TmArray(7),10)

      ii = 10000 - i

c     azzero contatore lanci dado

      do 10 k = 1,6

        dado2(k) = 0

        dado(k) = 0

  10  continue

      z = RAND(TmArray(8))

      do k = 1,60

   j = i*i

        i = MOD((j/100), 10000)

   jj = ii*ii

        ii = MOD((jj/100), 10000)

        f = 1+MOD((i+ii),10000)*6/10000

        dado(f) = dado(f) + 1

        z = RAND(0)

        f = 1+6*z

        dado2(f) = dado2(f) + 1

      end do

      chiquad = 0

      chiquad2 = 0

      write(*,*) '--- generazione numeri casuali ---'

      write(*,*) 'faccia gen. progr.  gen. interno'

      do 20 k = 1,6

        chiquad = chiquad + (dado(k)-10)**2

        chiquad2 = chiquad2 + (dado2(k)-10)**2

  20  write (*,FMT=100) k,dado(k),dado2(k) 

      write (*,*) '\nAccettabile se il test e\' inferiore a 11,1 (5 grad

     Ci di liberta\')'

      write (*,FMT=200) chiquad/10,chiquad2/10

      stop

 100  FORMAT(I5,2(I9))

 200  FORMAT('Chiquadro',2(F9.3))

      end

Il numero 10 è una etichetta label. Le istruzioni comprese fra do 10 ... e 10  continue sono ripetute fino a quando i, che è incrementato di 1 ad ogni ciclo, diventa uguale a k; in alternativa all'etichetta numerica il Fortran ora accetta il delimitatore end do.

Il risultato è:

D:\fsf\FORTRAN> random

 --- generazione numeri casuali ---

 faccia gen. progr.  gen. interno

    1        7        8

    2       11       11

    3       15        9

    4       11        9

    5       10        8

    6        6       15

 

Accettabile se il test e' inferiore a 11,1 (5 gradi di liberta')

Chiquadro    5.200    3.600

 

2.29.1            Linguaggi estensione del FORTRAN

Molti linguaggi hanno utilizzato il FORTRAN come base a cui sono state a aggiunte funzioni o comandi che un precompliatore traduceva in istruzioni FORTRAN o in chiamate a librerie.

CSL (Control and Simulation Language) 1963 IBM e Esso Petroleum Company. Linguaggio per simulazione.

FORMAC (FORmula Manipulation Compiler)  1962 Jean Sammet e Robert Tobey Advanced Programming Department IBM a Boston. FORMAC, basato FORTRAN IV, è un linguaggio per trattare espressioni simboliche.

2.29.2            QUIKTRAN

QUIKTRAN è un sistema prodotto dall’IBM disponibile del 1963, per la messa a punto interattiva di programmi FORTRAN. QUIKTRAN è un sottoinsieme di FORTRAN con comandi per trattare immettere e modificare codice sorgente, eseguire comandi immediati o parte del programma, per esaminare il contenuto delle variabili.



[1] Dal FORTRAN 90 è ammessa una sintassi meno vincolante.

[2] Il metodo non è particolarmente efficente.