A Fortran általános célú programozási nyelv, melyet elsősorban matematikai számítások (például mérnöki alkalmazások) megkönnyítésére fejlesztettek ki. Maga a Fortran szó a The IBM Mathematical Formula Translating System névből jön (=matematikai képletet fordító rendszer). Eredetileg csupa nagybetűvel írták (FORTRAN-nak), csak később tértek a ma is elfogadott nagy kezdőbetűs (Fortran) írásmódra. A Fortran volt az első ún. magas szintű programozási nyelv. A nyelvet az IBM cég fejlesztette ki az 1950-es években, azóta több újabb verziója is megjelent. A különféle Fortran-verziókat eleinte egy-egy római számmal különböztették meg, később pedig évük feltüntetésével a Fortran szó után. A Fortran-verzióik: év név 1957FORTRAN1958FORTRAN II1958FORTRAN III1961FORTRAN IV1966FORTRAN 661978FORTRAN 771991Fortran 901997Fortran 952004Fortran 20032010Fortran 20082018Fortran 20182023Fortran 2023 A jelenleg is használatban lévő verziók Fortran 66 Fortran 77 Fortran 90 Fortran 95 Új generációs verziók: Fortran 2003 Fortran 2008 Fortran 2015 Fortran 2018 Fortran 2023
Manapság a leginkább elterjedt a 77-es verzió, de egyre népszerűbb a 90-es is. A Fortran 95 a 90-es verzió módosítása, mely 1996-ban jelent meg. Ezeken kívül vannak speciális verziók is, jó példa erre a HPF (High Performance Fortran = nagy teljesítményű Fortran), az F és a Ratfor.
Fontos, hogy a legtöbb Fortran 77-es szerkesztő speciális kiegészítéseket is támogat, pl. nem alapértelmezett kiterjesztéseket is elfogad. E szócikk azonban az alapértelmezett Fortran 77-et, Fortran90-et és Fortan95-öt ismerteti.
Mind a mai napig a Fortran a legelterjedtebb programozási nyelv a mérnöki (és egyéb magas szintű matematikai) számítások elvégzéséhez. Jelenleg a Fortran a legrégebb óta használatban lévő programozási nyelv. Többi oka is van annak, hogy a Fortran ilyen régóta alkalmazott és előreláthatólag az is marad, ilyen ok például a "szoftver-inercia". Tehát egy cég, amely hosszú évek során több millió dollárt költött egy megbízható szoftverre, nehezen fog átállni egy újabb nyelvre, főleg annak ismeretében, hogy egy pontos és hiteles szoftver-fordítás és átállás eléggé nehezen kivitelezhető.
Tulajdonságai Habár általános célú nyelvként tartják számon, a Fortrant numerikus számításokra optimalizálták. Jellegzetes a hatványozás jele: , és a komplex számok adattípusa (COMPLEX). Szembeszökő, hogy az utasításokat csupa nagybetűvel szokás megadni, bár a legtöbb fordító már kisbetűvel írva is képes megérteni őket. Az már csak kevésbé látható, hogy a szóközök csak a program olvashatóságát, tagoltságát javítják; a szóközök nélkül írt Fortran program ugyanúgy lefordul, és ugyanazt csinálja, mint szóközöket tartalmazó példánya. Így lehet a GO TO GOTO, az ELSE IF ELSEIF, az END DO ENDDO.
A Fortran 90-ben standardizálták a vektor- és a mátrixműveleteket. Ezt segítik a MATLAB segítségével készült BLAS és LAPACK csomagok. Emellett léteznek még más csomagok is, mint például a LINPACK és EISPACK.Megjegyzés Cleve Molertől a MATLAB készítőjétől Számos csomag áll rendelkezésre a különféle tudományos és numerikus számításokhoz. A csomagokat nem kell importálni a programba, csak fordításkor kell kapcsolókat megadni.
A Fortran90 lehetőségei többek között a mutatók kezelésében, a saját típusok és a modulok használatának lehetővé tételében nyilvánulnak meg. A Fortran2003 már lehetővé teszi az objektumorientált, a Fortran2008 a párhuzamos programozást.
Formátum A régebbi Fortran programokat kötött formátumban írták, ahol is: az első oszlopot a megjegyzés jelének tartották fenn (c, C) a második-ötödik oszlopokba kerültek a címkék a hatodik oszlop a folytatás jelzésére szolgált a hetedik-hetvenkettedik oszlopba kerültek az utasítások
A lyukkártya-korszakból fennmaradt kötött formátumot a Fortran 90 tette opcionálissá. Egy hasonló megkötés volt, hogy a nevek legfeljebb hat betűsek lehettek. A Fortran 90-ben és 95-ben ez a határ 31; a Fortran 2003-as kiadása 63-ra növelte ezt a hosszt, és azt is lehetővé tette, hogy egy utasítást akár 255 sorba is tördelhessenek. Szabad formátumban a sorvégi & jel jelzi a folytatást. Eredetileg mindent nagybetűkkel írtak; ma a nyelv nagybetűérzéketlen.
Deklaráció Ugyanebből a korszakból maradt fenn az implicit deklaráció is, ahol az I-N betűvel kezdődő változók egészeket jelölnek a matematikában szokásos módon (INTEGER). A többi betűvel kezdődő név lebegőpontos számot jelent (REAL). Ez a viselkedés azonban felülbírálható:
! Minden nem deklarált változó komplex, aminek c-vel vagy z-vel kezdődik a neve IMPLICIT COMPLEX (c, z)
vagy letiltható:
IMPLICIT NONE
Ezután a nem deklarált változók fordításidejű hibát adnak, ami megkönnyíti a hibakeresést.
Típusok A Fortran alaptípusai: INTEGER egész számok REAL lebegőpontos szám DOUBLE PRECISION dupla pontosságú lebegőpontos szám COMPLEX komplex szám, két REAL-t tartalmaz LOGICAL, logikai érték (.TRUE. vagy .FALSE.) CHARACTER, szöveg típus, alapértelmezetten egy hosszúságú
Konstansok deklarálására a PARAMETER kulcsszó szolgál. A szöveges típus hosszát meg kell adni:
Fortran77-ben: CHARACTER*12 :: USERNAME C USERNAME legfeljebb 12 karakter hosszú lehet Fortran90-ben: CHARACTER(LEN=12) :: USERNAME !USERNAME legfeljebb 12 karakter hosszú lehet
A szöveg értékét aposztrófok között kell megadni. A konkatenáció jele a //.
Szükség lehet arra, hogy egy program mindenütt azonos pontosságú számokat használjon. Ehhez vezették be a KIND-eket. A Fortran77 egyes változataiban, ha egy típus nevét egy csillag és egy szám követte, akkor az a tároláshoz használt bájtok számát jelezte. A Fortran90-be már szabványosítva került be:
INTEGER(KIND=2) !Ez -32768 és 32767 közötti értékek tárolására alkalmas.
ahol is a KIND a 2 hatványa kell, hogy legyen.
A kevésbé pontos KIND-ek a műveletek közben automatikusan konvertálódnak pontosabb KIND-ekké. Ez azonban csalóka lehet, mert ez pontosabb értéket sejtet a megadottnál, ezért az ilyen műveletek kerülendők.
Szöveges értékekre a KIND a karakterkészlet megválasztását jelenti:
CHARACTER(KIND=character_set, LEN=10) :: greek
A logikai változókhoz is definiálható KIND, de ez azt jelenti, hogy a két logikai érték egyike tárolódik a megadott számú bájton.
Alprogramok Egy Fortran program lehet főprogram, függvény vagy szubrutin. Főprogram a PROGRAM, függvény a FUNCTION, szubrutin a SUBROUTINE kulcsszóval írható. Mindegyik futása leállítható a STOP utasítással. Végüket END jelzi.
A függvénynek egy, a szubrutinnak több visszatérési értéke lehet. A visszatérési értékek megadásához kötelező a RETURN. Érdemes megadni a függvények és a szubrutinok típusát, mert a kikövetkeztetett típus hibaforrás lehet. A paraméterek típusát a deklarációban kell jelezni. Opcionális paraméterek a Fortran90 óta az OPTIONAL kulcsszóval deklarálhatók. Ha az opcionális argumentumokat nem adjuk meg, akkor létre sem jönnek; ez egy újabb hibaforrás. Paraméter-átadáskor a fordítók nem ellenőrzik a paraméterek típusát, ezért ez szintén hibákhoz vezethet. Szubrutin a neve előtti CALL utasítással hívható. A Fortran hagyományosan cím szerint adja át a paramétereket, vagyis nem másolatokat, hanem címeket ad át.
A Fortran90-től kezdve lehetővé vált a név szerinti paraméter-átadás, a rekurzió és a modulok használata. A modulok MODULE kulcsszóval deklarálhatók, és deklarációkat, függvényeket, szubrutinokat, vagy interfészeket tartalmazhatnak. Egy modul használatát USE vezeti be. A név szerinti paraméter-átadást interfészek teszik lehetővé, ahol azt is jelezni kell, hogy a változó bemenő (INTENT IN), kimenő (INTENT OUT), vagy mindkettő (INTENT INOUT). Rekurzív függvények a RECURSIVE kulcsszóval és segédfüggvénnyel (RESULT) írhatók. A rekurzív szubrutinokat elég RECURSIVE-nak deklarálni.
Beágyazott eljárások Beágyazott eljárások a Fortran90 óta készíthetők. A gazdaprogramtól CONTAINS kulcsszó választja el, és csak a gazda programból hívhatók. Hozzáférnek a gazda összes változójához; felülírhatják, sőt felüldeklarálhatják őket. A modulokon kívül nem ágyazhatók egymásba; a modulokban a Fortran90-ben egyszintű, a Fortran95-ben és az újabb változatokban tetszőleges szintű beágyazás lehetséges. A beágyazott eljárások az implicit deklaráció megváltoztatását, illetve tiltását is öröklik.
Beágyazott eljárásokkal típuskonstruktorok és generikus eljárások: függvények, szubrutinok is készíthetők.
Logikai kifejezések és feltételes utasítások A két logikai értéket .TRUE. és .FALSE. jelöli. A két pont is a név része, ami segíti a szabadabb névválasztást. Logikai változók a LOGICAL megjelöléssel deklarálhatók. A logikai műveleteket a .NOT. (nem), az .AND. (és) és az .OR. (vagy) valósítja meg. Precedenciájuk szerint a .NOT. a legerősebb, ezt követi az .AND., és végül az .OR. Az összehasonlító operátorok: .EQ. egyenlő .NE. nem egyenlő .LT. kisebb .LE. kisebb-egyenlő .GT. nagyobb .GE. nagyobb-egyenlő
A Fortran90 óta használhatók a más programnyelvekben megszokott összehasonlító szimbólumok is.
A feltételes utasításokat IF kezdi és END IF zárja. Lehet egy ELSE és több ELSE IF ága. Ha az utasítások nem a feltétel sorában kezdődnek, akkor kötelező a THEN az IF és az ELSE IF ágakban. A feltétel kiválasztása fentről lefelé halad, így a speciálisabb feltételeket előre kell venni. A feltételes szerkezetek egymásba ágyazhatók, de ha túl mély lenne a beágyazás, vagy túl bonyolultak a feltételek, akkor inkább szubrutint kell használni.
Ciklusok A Fortran 77-es verzió szabványában csak egyféle ciklus, a DO ciklus érhető el, ami megfelel a más programnyelvek által használt for ciklusnak. A while és az until ciklusok szervezéséhez a GO TO utasítás megkerülhetetlen. Sok implementáció azonban már tartalmazta ezeket a ciklusokat is. Ezen úgy segítettek, hogy betették a 90-es szabványba az EXIT utasítást, amivel már nem lehet bárhova elugrani. Ez az utasítás arra szolgál, hogy a vezérlés elhagyja a ciklust, és az az utáni első sorra lépjen.
A ciklus belsejében a C-től eltérően nem lehet megváltoztatni a ciklusváltozót, ezért a futtatások száma ránézésre megállapítható.
Fortran77-ben: c Legyen iFunc() egész értékkel visszatérő függvény . c A fordítónak csak egyszer kell iFunc-ra hivatkoznia. DO 100 i = 1, iFunc(4711) c.. valami értelmes művelet c Nem lehet megváltoztatni i értékét 100 CONTINUE
Ugyanez Fortran90-ben: ! Legyen iFunc() egész értékkel visszatérő függvény . ! A fordítónak csak egyszer kell iFunc-ra hivatkoznia. DO i = 1, iFunc(4711) !.. valami értelmes művelet ! Nem lehet megváltoztatni i értékét ENDDO
Ugyanez az iteráció C-ben: for (i = 1; i <= iFunc(4711); i++) { /* valami értelmes művelet */ /* i megváltoztatható */
C-ben a ciklust egy logikai kifejezés határozza meg. Az iteráció addig megy, amíg ez a kifejezés igaz. A ciklus törzsében hívott függvények mellékhatásai megváltoztathatják az i változót, ezért nem biztos, hogy annyiszor fut le a ciklus, ahányszor akarjuk. A Fortran 95 óta lehet egy függvényt vagy szubrutint PURE-nak deklarálni, ami megköveteli a mellékhatásoktól való mentességet. Eszerint a bemenő argumentumok nem módosíthatók. Emellett a PURE-nak deklarált függvény vagy szubrutin nem tartalmazhat I/O utasításokat, és a globális változókart sem módosíthatja. Ha ez mégis megtörténne, akkor fordítási hibát kapunk.
Tömbök A Fortranban a tömbök indexelése alapértelmezésben 1-től kezdődik. Egy tömb megadható elemeinek típusával, a nevével és kerek zárójelbe tett hosszával vagy indexhatáraival. A túlindexelést a fordítók nem figyelik, így ez gyakori hiba. Magasabb dimenziós tömbök is megadhatók, a lehetséges legnagyobb dimenziószám a 7.