Fortranin pitkä historia lyhyesti

Laatinut: Rodion Efremov
Viimeksi muutettu: 31.03.2011 - 15:44

Sisältö

  1. Kielen taustaa
  2. Alkiorakenne
  3. Ohjausrakenteet
  4. Lähteet

1. Kielen taustaa

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:

Esimerkki 1.1
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.


2. Alkiorakenne

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ä:

Totuusarvot esitetään literaalivakioilla '.FALSE.' ja '.TRUE.'. Merkkijonot esitetään yksinkertaisten tai kaksinkertaisten lainausmerkkien välissä. [2]. Esimerkiksi lauseet
WRITE (*,*) 'Olipa kerran...'
WRITE (*,*) "Olipa kerran..."

kummatkin tulostavat saman merkkijonon.

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:

Esimerkki 2.1
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.
Esimerkki 2.2
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:
Esimerkki 2.3
PROGRAM paaohjelma
  USE moduuli
  IMPLICIT NONE
  
  WRITE (*,*) 'Phii: ', phii
END PROGRAM paaohjelma
missä moduulitiedosto voi olla seuraavanlainen:
Esimerkki 2.4
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.


3. Ohjausrakenteet

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

IF (ehto1) THEN
  lohko
ELSE IF (ehto2) THEN
  ...
ELSE IF (ehtoN) THEN
  lohkoN
ELSE
  lohkoN+1
END IF
. Seuraavassa pitkähkö esimerkki:
Esimerkki 3.1
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:

Esimerkki 3.2
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:
Esimerkki 3.3
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:

Esimerkki 3.4
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].


Lähteet

  1. Fortran; URL: http://en.wikipedia.org/wiki/Fortran; viimeksi muutettu: 15.03.2011 klo 18:57.
  2. Fortran 95/2003; Juha Haataja, Jussi Rahola ja Juha Ruokolainen; Tieteen tietotekniikan keskus CSC, neljäs uudistettu painos; ISBN 978-952-5520-24-8 .
  3. FORTRAN 90/95 explained; Michael Metcalf and John Reid; Oxford University Press; 2nd edition; ISBN 0 19 850558 2