Fortran sai alkunsa kun vuonna 1953 John Backus ehdotti johdolleen uuden käytännöllisen kielen joka korvaisi symbolisen konekielen ja jolla oli tarkoitus ohjelmoida IBM:n 704 mainframe - tietokoneen. Nimekseen uusi kieli saikin FORTRAN (FORmula TRANslator). Vuoden 1954 puolivälissä kieli sai ensimmäisen luonnosspesifikaation ja lokakuussa 1956 ensimmäisen manuaalin. Huhtikuussa vuonna 1957 kieli sai ensimmäisen kääntäjänsä ja näin ollen Fortranista tuli ensimmäinen korkean tason ohjelmointikieli. Vuoteen 1960 mennessä Fortran oli saatavana neljälle IBM:n tietokoneelle. Fortranin kasvava suosio pakotti laitevalmistajat tuottamaan Fortran - kääntäjät niiden koneille ja vuoteen 1963 mennessä oli olemassa 40 eri Fortran kääntäjää. Siihen aikaan Fortran - ohjelmat sisälsivät 20 kertaa vähemmän lauseita kuin vastaavat konekieliset ohjelmat. Aiemmat Fortran - kääntäjät eivät tukeneet rekursiivisia aliohjelmia kun aktivointitietuepino ei ollut käytössä. Rekursio sisältyi standardiin vasta Fortran 90:n myötä, mutta oli saatavana lisäoptiona Fortran 77:ssä. Tarve kääntää Fortran - koodia tehokkaaseen konekieleen on motivoinut mm. monia edistyksiä kääntäjien teoriassa ja suunnittelussa [1].
Fortran on proseduraalinen, imperatiivinen, vahvan ja staattisen tyyppijärjestelmän omaava, käännettävä kieli, jonka ohjelmakirjastot tukevat laajasti numeerista laskentaa, minkä takia Fortran oli ja on suosittu kieli mm. fyysikoiden ja meteorologien piireissa. Seuraavassa on pieni esimerkki Fortran - ohjelmasta, joka laskee syötettyä lukua suuremman pienimmän Fibonaccin luvun:
PROGRAM fib
IMPLICIT NONE
INTEGER :: luku
WRITE (*,*) "Anna luku: "
READ (*,*) luku
WRITE (*,*) "Luku on ", fibonacci(luku)
CONTAINS
FUNCTION fibonacci(i) RESULT(f2)
IMPLICIT NONE
INTEGER :: i, f1, f2, tmp
f1 = 0
f2 = 1
DO WHILE ( f2 <= i )
tmp = f1
f1 = f2
f2 = f2 + tmp
END DO
END FUNCTION fibonacci
END PROGRAM fib
Vanhoissa Fortranin versioissa oli käytössä nk. alkukirjainsääntö, jonka mukaan ne muuttujat, jotka alkoivat kirjaimella I, J, ..., N, olivat kokonaislukuja ja kaikki muut olivat reaalilukuja. Näin aikoinaan vältettiin muuttujien määrittelyt, mikä johti vaikeasti ylläpidettävään koodiin. Ratkaisuna tähän Fortranin uusimmissa versioissa otetiin käyttöön lause IMPLICIT NONE
, joka kytki alkukirjainsäännön pois ja pakotti ohjelmoijaa esittelemään käyttämänsä muuttujat.
Tuloste tulostetaan WRITE
- lauseella ja syöte luetaan READ
- lauseella. CONTAINS
aloittaa pääohjelmaa seuraavaa proseduuri-/funktio-osiota, jossa on tarkoitus määritellä proseduureja ja/tai funktioita. Funktio-otsikon yhteydessä oleva RESULT
- määre spesifioi muuttujan, jonka arvo palautetaan kun funktion suoritus päättyy.
Fortranissa merkkijoukko (character set) sisältää 26 englannin aakkosta, arabinumeraalit 0, 1, ..., 9, alaviivan ja joukon erikoismerkkejä kuten esimerkiksi ampersandin ja yhtäsuuruusmerkin. Tosiaan Fortranin syntaksin mukaisesti suuret ja pienet kirjaimet samaistetaan paitsi silloin kun niitä käytetään merkkijonoissa. Kukin rivi voi sisältää Fortran 95 - kielessä 132 merkkiä. Yhden rivin kommentit aloitetaan huutomerkillä (!). Mikäli lause ei mahdu 132 merkkiin, rivin voi jatkaa laittamalla keskeneräisen rivin loppuun ampersandin ja jatkamalla se seuraavalla rivillä [3].
Muuttujat ja vakiot esitellään C:n tapaan aina ennen suoritettavia lauseita, muuttuja voi olla perustietotyyppiä tai rakenteista tyyppiä. Fortran tukee 5 perustietotyyppiä:
WRITE (*,*) 'Olipa kerran...'
WRITE (*,*) "Olipa kerran..."
Muuttujien ja vakioiden tunnusten pituuden on oltava maksimissaan 31 merkkiä ja ne alkavat kirjaimella eli ensimmäinen tunnuksen kirjain ei voi olla numero tai alaviiva. Fortranin avainsanat voi käyttää muuttujien ja vakioiden tunnuksena vaikka tuollainen käytäntö ei ole suositeltava. Seuraavassa validi esimerkki:
PROGRAM valid
IMPLICIT NONE
REAL :: real, sin
INTEGER :: integer
sin = 0.78
real = 5.67
integer = 10
WRITE (*,*) sin, real, integer
END PROGRAM valid
Lisäksi, koska ylläolevassa esimerkissä on käytetty tunnusta sin
reaalilukuna, ei Fortranin sisäänrakennettu funktio sin
ole käytettävissä. Ohjelmaan voi sisällyttää määrittelyjä toisesta tiedostosta avainsanalla INCLUDE
.
PROGRAM ohjelma
IMPLICIT NONE
INCLUDE 'maarittelyt.inc'
WRITE (*,*) phii
END PROGRAM ohjelma
jossa tiedosto maarittelyt.inc
olisi voinut olla seuraavanlainen:
REAL, PARAMETER :: phii = 1.61803
Parempi, käännösaikaista virheiden tarkistusta suorittava tapa tuoda muuttujien, vakioiden ja proseduurien määrittelyt on kuitenkin USE
-lause:
PROGRAM paaohjelma
USE moduuli
IMPLICIT NONE
WRITE (*,*) 'Phii: ', phii
END PROGRAM paaohjelma
missä moduulitiedosto voi olla seuraavanlainen:
MODULE moduuli
IMPLICIT NONE
REAL, PARAMETER :: phii = 1.61803
END MODULE moduuli
Fortran - ohjelmassa samalla rivillä olevia lauseita voi erottaa toisistaan puolipisteellä. Muuttujasta saa nimetyn vakion avainsanalla PARAMETER
.
Fortranissa on käytössä strukturoitujen kielten tavoin peräkkäisyys, valinta, toisto ja hyppylause. Peräkkäisyydellä tarkoitetaan sitä, että valinnan ja toiston ulkopuolisia lauseita suoritetaan kirjoitusjärjestyksessä [2]. Valinta toteutetaan rakenteella
. Seuraavassa pitkähkö esimerkki:
IF (ehto1) THEN
lohko
ELSE IF (ehto2) THEN
...
ELSE IF (ehtoN) THEN
lohkoN
ELSE
lohkoN+1
END IF
PROGRAM IFRAKENNE
IMPLICIT NONE
INTEGER :: luku
IF( .TRUE. ) WRITE (*,*) 'Hei, maailma!'
WRITE (*,*) 'Anna arvosana (1-5): '
READ (*,*) luku
IF( luku == 1 ) THEN
WRITE (*,*) 'Huono'
ELSE IF( luku == 2 ) THEN
WRITE (*,*) 'Välttävä'
ELSE IF( luku == 3 ) THEN
WRITE (*,*) 'Kohtalainen'
ELSE IF( luku == 4 ) THEN
WRITE (*,*) 'Hyvä'
ELSE IF( luku == 5 ) THEN
WRITE (*,*) 'Erinomainen'
ELSE
WRITE (*,*) luku, ': ei ole arvosana.'
END IF
END PROGRAM IFRAKENNE
Huomaa, että rivillä 5 on käytetty IF
- lauseen lyhyttä muotoa, joka soveltuu tilanteisiin, joissa suoritettavan lohkon sijasta on vain yksi lause.
IF
- rakenteen lisäksi Fortran tukee SELECT CASE
- rakennetta:
PROGRAM SELECTCASERAKENNE
IMPLICIT NONE
INTEGER :: luku, merkki
READ (*,*) luku
SELECT CASE(luku)
CASE (:-1)
merkki = -1
CASE (1:)
merkki = 1
CASE DEFAULT
merkki = 0
END SELECT
WRITE (*,*) merkki
END PROGRAM SELECTCASERAKENNE
Ylläolevassa esimerkissä muuttuja merkki
saa arvon -1 kun luku
on -1, -2, -3, ..., arvon 1 kun luku
on 1, 2, 3, ... ja arvon 0 kun luku
on 0. SELECT CASE
voi haarautua myös merkkijonon perusteella:
PROGRAM SELECTCASERAKENNE
IMPLICIT NONE
INTEGER, PARAMETER :: saksalainen = 1, &
ranskalainen = 2, &
tuntematon = -1
CHARACTER(LEN=25) :: autonmerkki
INTEGER :: merkki
READ (*,*) autonmerkki
SELECT CASE(autonmerkki)
CASE ('BMW', 'Volkswagen')
merkki = saksalainen
CASE ('Citroën')
merkki = ranskalainen
CASE DEFAULT
merkki = tuntematon
END SELECT
WRITE (*,*) merkki
END PROGRAM SELECTCASERAKENNE
Myös merkkijonojen kohdalla voi käyttää kaksoispistettä välin ilmoittamiseen: CASE('x':'z')
. Reaalilukumuuttujia ei voi käyttää SELECT CASE
- rakenteen yhteydessä [2].
Fortran tukee tietysti myös toistorakenteita. Yksi niistä DO
- rakenne:
PROGRAM DORAKENNE
IMPLICIT NONE
INTEGER :: i
DO i = 1, 5
WRITE (*,*) i
END DO
DO i = 6, 0, -1
IF( i == 6 ) CYCLE
WRITE (*,*) i
IF( i == 1 ) EXIT
END DO
END PROGRAM DORAKENNE
Kuten esimerkistä käy ilmi, toiston voi keskeyttää EXIT
- lauseella ja iteroimaan pystyy suurimmista numeroista alaspäin määrittämällä askeleen negatiiviseksi arvoksi. Monissa lohkorakenteisissa ohjelmointikielissä on continue
- avainsana, joka keskeyttää meneillä olevan iteraation ja aloittaa seuraavan. Vastaava avainsana Fortranissa on CYCLE
. Yllä mainitujen laskurimuuttujapohjaisten silmukoiden lisäksi on olemassa DO WHILE(ehto) ... END DO
- rakenne, jossa ehto on totuusarvoinen lauseke [2].