Introduzione a Fortran

Transcript

Introduzione a Fortran
Fortran
Introduzione
http://www.dia.uniroma3.it/~roselli/
[email protected]
Credits
• Materiale a cura del Prof. Franco Milicchio
Introduzione
• Esistono molti linguaggi di programmazione usati in vari ambiti • Tra i più impiegati in ambito scientifico, oltre al C ed al C++, è il Fortran
• Negli anni 1930-40 furono creati i primi computer
• Erano tutti incompatibili tra di loro: un programma scritto per UNIVAC, doveva
essere completamente riscritto per essere eseguito su un altro computer
• Il linguaggio di programmazione (quando non era cablato) era l’assembly: un
linguaggio di basso livello, ovvero dipendente dalla piattaforma
• Negli anni ’50 cambiò l’approccio con i computer
Introduzione
• Nel 1953 John W. Backus1 inventò un linguaggio più astratto dell’assembly
• Backus inventò il linguaggio Formula Translator, o FORTRAN
• Fu sviluppato un compilatore, il cui compito è produrre un programma
eseguibile dal computer, a partire da un linguaggio specifico (e.g., C++)
• Nel 1957 fu rilasciato il primo compilatore, ed in seguito vari standard: F66,
F77, F90, F95, F2003, F2008, F2015 (in fase di sviluppo)
1
W.W. McDowell Award, National Medal of Science, ACM Turing Award
Introduzione
• Le prime versioni di Fortran
rispecchiavano l’hardware
dell’epoca
• In modo differente dal C++ o
Python (e dal F90) si
programmava a colonne
• L’input verso la macchina,
infatti, era effettuato
solitamente tramite schede
perforate
C
C
C
C
C
C
C
C
C
C
34567890123456789012345678901234567890123456789012345678901234567
AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
INPUT - CARD READER UNIT 5, INTEGER INPUT
OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
READ INPUT TAPE 5, 501, IA, IB, IC
501 FORMAT (3I5)
IA, IB, AND IC MAY NOT BE NEGATIVE
FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
IS GREATER THAN THE THIRD SIDE, SO WE CHECK FOR THAT, TOO
IF (IA) 777, 777, 701
701 IF (IB) 777, 777, 702
702 IF (IC) 777, 777, 703
703 IF (IA+IB-IC) 777,777,704
704 IF (IA+IC-IB) 777,777,705
705 IF (IB+IC-IA) 777,777,799
777 STOP 1
USING HERON'S FORMULA WE CALCULATE THE
AREA OF THE TRIANGLE
799 S = FLOATF (IA + IB + IC) / 2.0
AREA = SQRT( S * (S - FLOATF(IA)) * (S - FLOATF(IB)) *
+
(S - FLOATF(IC)))
WRITE OUTPUT TAPE 6, 601, IA, IB, IC, AREA
601 FORMAT (4H A= ,I5,5H B= ,I5,5H C= ,I5,8H AREA= ,F10.2,
+
13H SQUARE UNITS)
STOP
END
Introduzione
• Con l’evoluzione dell’hardware, le colonne furono abbandonate per una forma
libera, ovvero uno stile di scrittura più simile ai linguaggi moderni
• Noi introdurremo per completezza il Fortran 90
• Le differenze tra F77 e precedenti, e F90 sono quasi esclusivamente
sintattiche
• Essendo il linguaggio più anziano, esistono molte librerie di calcolo numerico
scritte in F77 e successivi (e.g., BLAS, LAPACK)
• Molti programmi hanno una base Fortran (e.g., Nastran, Matlab)
Struttura dei Programmi
• Un programma Fortran deve iniziare con la parola chiave program, seguita da
un identificatore nomeProgramma
• Un programma Fortran deve terminare con la parola chiave end, seguita
dall’intestazione di inizio programma program nomeProgramma
• È consigliabile far seguire all’intestazione la direttiva implicit none
• Questa dichiarazione fa si che ogni variabile debba essere dichiarata prima
dell’uso; la motivazione sarà data in seguito
• Attenzione: in Fortran maiuscole e minuscole sono indifferenti, ovvero ABC
equivale a Abc, abC, abc etc.
Esempio di codice
Intestazione: nome e
nessuna variabile implicita
program primoProgramma
implicit none
real :: p
write (*,*) 'Inserire un numero:'
read (*,*) p
write (*,*) ‘p = ‘, p
end program primoProgramma
Dichiarazione di
una variabile
Nessun punto
e virgola: a capo
Variabili
• Il Fortran ha vari tipi di dato disponibili per la programmazione, in particolare:
• integer dichiara una variabile intera
• real dichiara una variabile reale
• logical dichiara una variabile booleana, .true. oppure .false.
• Una variabile viene dichiarata con la seguente sintassi:
• tipo :: nome
• Una variabile può essere inizializzata con un valore tramite una assegnazione
Costanti
• Una costante è una variabile il cui valore non può variare
• Una costante è dichiarata tramite la parola parameter come segue:
• tipo, parameter :: nome = valore
• Una costante deve essere inizializzata
Implicit
• Abbiamo accennato all’uso di implicit none
• In Fortran è possibile usare variabili anche senza dichiararle, ma questo
comporta una maggiore possibilità d’errore: è molto facile infatti sbagliare i
nomi di funzioni e variabili
• Non solo, ma il tipo della variabile dipende dal nome
• Se il nome comincia con una lettera compresa tra I ed N è integer
• Se il nome comincia con una lettera non compresa tra I ed N è real
• È fortemente consigliato disabilitare le variabili implicite
Operatori
• Per assegnare un valore ad una variabile si utilizza il segno di eguaglianza
• Gli operatori di comparazione in F90 sono, ad esempio, <, <=, >, >=, ==
• Gli operatori logici sono .eq., .ne., .gt., .lt., .ge., .le., .and., .or.,
.not., .eqv., .neqv. (gli ultimi due sono applicabili solo ai boolean)
• Esempio: ((anno .eq. 1) .and. (matricola .gt. 5000))
Lettura e Stampa
• La lettura e la scrittura a console avviene tramite le direttive read e write
• La sintassi è la seguente:
read (*,*) nomeVariabile, nomeVariabile, ...
write (*,*) ‘Testo ’, nomeVariabile, ...
• L’output a console differisce dall’output che ci si può aspettare
• Attenzione: in Fortran si utilizzano gli apici singoli per stampare del testo
Esempio in Fortran
program doppio
implicit none
real :: num
write (*,*) 'Inserire un numero reale:'
read (*,*) num
write (*,*) 'Il doppio di
end program doppio
', num, ' = ', (num * 2.0)
Inserire un numero reale:
43
Il doppio di
43.0000000
=
86.0000000
Lettura e Stampa
• La sintassi Fortran per leggere (o scrivere) a console è read (*,*) oppure
write (*,*)
• Tra parentesi tonde vi sono due parametri che modificano l’output o l’input:
• Il primo parametro indica quale device utilizzare (e.g., console, file)
• Il secondo parametro indica il formato dell’input (od output)
write (*, '(A, E8.3)') 'Stampo 0.025: ', 0.025
write (*, '(A, E18.3)') 'Stampo 0.025: ', 0.025
Stampo 0.025: .250E-01
Stampo 0.025:
0.250E-01
Notazione Esponenziale:
8 caratteri, di cui 3 per la mantissa
Uso dei File
• Per aprire e chiudere file si devono utilizzare le direttive open e close
• La sintassi parziale è la seguente, ed utilizza identificatori numerici:
open (unit = N, file = ‘nomefile.txt’)
close (N)
• A differenza del C++, in Fortran è necessario chiudere i file prima di uscire da
un programma.
open(unit = 9, file = 'miofile.txt')
write (9, *) 'Scrivo su file il numero 0.025: ', 0.025
close(9)