Fortran
Fortran | |
Paradigma | többelvű: strukturált, imperatív (procedurális, objektumorientált), generikus |
Jellemző kiterjesztés | .f , .for , .f90 , .f95 |
Megjelent | 1957 |
Tervező | John Backus |
Fejlesztő | John Backus & IBM |
Utolsó kiadás | Fortran 2008 (ISO/IEC 1539-1:2010) (2010) |
Típusosság | erősen típusos, statikus típus, manifest |
Megvalósítások | Absoft, Cray, GFortran, G95, IBM, Intel, Lahey/Fujitsu, Open Watcom, Pathscale, PGI, Silverfrost, Oracle, XL Fortran, Visual Fortran és mások |
Hatással volt rá | Speedcoding |
Befolyásolt nyelvek | ALGOL 58, BASIC, C, PL/I, PACT I, MUMPS, Ratfor |
Licenc | MIT-licenc |
Weboldal |
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 |
1957 | FORTRAN |
1958 | FORTRAN II |
1958 | FORTRAN III |
1961 | FORTRAN IV |
1966 | FORTRAN 66 |
1978 | FORTRAN 77 |
1991 | Fortran 90 |
1997 | Fortran 95 |
2004 | Fortran 2003 |
2010 | Fortran 2008 |
2018 | Fortran 2018 |
2023 | Fortran 2023 |
A jelenleg is használatban lévő verziók
[szerkesztés]- 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.[forrás?] 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
[szerkesztés]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.[1] 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
[szerkesztés]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ó
[szerkesztés]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
[szerkesztés]A Fortran alaptípusai:
INTEGER
egész számokREAL
lebegőpontos számDOUBLE PRECISION
dupla pontosságú lebegőpontos számCOMPLEX komplex szám
, kétREAL
-t tartalmazLOGICAL
, 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
[szerkesztés]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
[szerkesztés]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
[szerkesztés]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
[szerkesztés]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
[szerkesztés]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.
Az egydimenziós tömbök kezelhetők vektorként, a kétdimenziósak mátrixként. Teljesen kitöltött mátrixok kezelhetők vektorként is, vagyis lehet őket skálázni, skaláris szorzatukat venni. Függvényekben és szubrutinokban a tömbök méreteinek meghatározása a főprogramra hagyható. Résztömbök indextartományokkal hivatkozhatók. Paraméterként a tömbök helyettesíthetők annyi megfelelő típusú változóval, ahány eleme a tömbnek van. A típusokat a fordítók nem ellenőrzik. A Fortran90 óta lépésköz is használható, tehát lehet például minden második sorra vagy oszlopra hivatkozni.
A Fortran90 óta különféle függvények léteznek a tömbök különböző méreteinek lekérdezésére. A Fortran90 előtt a tömbelemek egymás után oszlopfolytonosan tárolódtak a memóriában, a Fortran90 óta ez nincs meghatározva, akár különböző memóriákba is kerülhetnek az elemek. A tömböket a Fortran nem inicializálja, a frissen létrehozott tömb elemei határozatlanok. Teljes tömbök ciklusokkal tölthetők fel. Régebben szokás volt nagy méretű tömböket deklarálni, és csak részben feltölteni, mivel nem volt dinamikus allokáció. Ez a lehetőség a Fortran90-ben jelent meg először, a deklarációban ALLOCATABLE kulcsszóval, a tulajdonképpeni programban ALLOCATE
, illetve DEALLOCATE utasításokkal. Dinamikus tömb csak allokált állapotban használható argumentumként. A tömbelemek feltételes megválasztásához a Fortran90-től kezdve maszkok is készíthetők WHERE feltétel END WHERE blokkal. A blokk egy másik formájában a maszk feltételének nem megfelelő elemekkel is lehet csinálni valamit a blokkban kiadott ELSEWHERE utasítással.
Stringek
[szerkesztés]A stringek a CHARACTER kulcsszóval és hosszukkal deklarálhatók. Ez tulajdonképpen a maximális hosszuk. A stringek nem tömbök, ezért nem allokálhatók, de lehet részstringjeikre indexekkel hivatkozni. A stringek indexelése is 1-től kezdődik. Az üres string és az üres részstring nem megengedett; az egykarakteres részstringre úgy lehet hivatkozni, hogy kezdetét és végét ugyanaz a szám jelöli. A stringekben a Fortran megkülönbözteti a kis- és nagybetűket.
Globális változók
[szerkesztés]A Fortran hagyományosan nem ismeri a globális változókat. Ehelyett közös blokkokat kell létrehozni a COMMON kulcsszóval, két / közé tett névvel és magukkal a blokkba tartozó, előzetesen deklarált változókkal. A közös tömböket minden olyan részprogramba be kell tenni, ahol hivatkoznak rájuk. A névegyezés nem kötelező, a részprogramok csak a sorrendből tudják, hogy melyik változó melyik. Típusellenőrzés nincs, ezért a közös blokkokat hibaforrásnak tekintik, és lehetőleg mellőzik. Ha mégis használni kell, akkor külön fájlba teszik és INCLUDE-olják mindenhová. A névtelen közös blokk speciális.
Előre ismert adatok
[szerkesztés]Az előre ismert értékű változók a DATA
kulcsszóval, névvel és két / jel közé tett értékükkel deklarálhatók. Tömbök is deklarálhatók így. A DATA
-ban megadott változók nem kerülhetnek be úgy közös blokkokba, mint a közönséges változók; ezen a BLOCK DATA
és egy END
közé zárt programrészlet segít. Csak itt lehet őket deklarálni és közös blokkba tenni.
I/O
[szerkesztés]Változók beolvasására a READ
, kiíratásra a WRITE
utasítás szolgál. A standard be- és kimenet használatához egy csillagot kell utánuk írni, vagy egy zárójelbe két, vesszővel elválasztott csillagot. Az első csillagot helyettesítheti egy I/O egység száma, a másodikat egy FORMAT
utasítás kóddal. Ha a FORMAT utasítás helyett csak egy csillag van, akkor az listavezérelt kiíratás, amit fájlba íráskor kerülni kell. Az egységszámok 1 és 99, egyes rendszereken 1 és 255 közé eshetnek. Az előre megnyitott standard bemenet egységszáma az 5, a standard kimeneté a 6. Egy egységen egy időben legfeljebb egy fájl lehet megnyitva, és a Fortran programban összesen legfeljebb 32 fájl lehet egyszerre megnyitva.
A FORMAT
utasítás a kiírandó szöveg formázására szolgál. A formátumban használt leggyakoribb kódok:
- A – szöveg
- D – pontosabb valós szám, exponenciális alak (normálalak)
- E – valós szám, exponenciális alak (normálalak)
- F – valós szám, fixpontos formátum
- I – egész
- X – horizontális ugrás olvasáskor, szóköz íráskor
- / – vertikális ugrás (új sor)
Az E, a D és az F általános formája w.d alakú, ahol w a szám egészrésze, és d a törtrésze. Az egészet jelentő kód után is meg kell adni, hogy milyen hosszú lesz a szám. A szöveget jelentő kódnál is megadható hossz, de nem kötelező. A FORMAT
utasítás paramétereként egy ilyen elemekből építkező kódot kell megadni, vagy egy címkét, amivel a kódot tartalmazó sorra mutatunk.
Ha a kiírandó adat túl rövid, akkor a fordítók szóközökkel pótolják ki. Ha az adat törtrésze túl hosszú, akkor kerekíti. Ha az adat egészrésze vagy a szöveges adat túl hosszú, akkor figyelmeztetésként csillagokat ír ki.
Csak megnyitott fájlba lehet írni, vagy onnan olvasni. Egyes egységekre megnyitás nélkül írni, illetve a leírtakat kiolvasni nem fordítási hiba, de nem oda kerülnek az információk, ahova akartuk; ilyen például a 39-es egység, ami a szalagos tárhoz volt rendelve. Ma egy új fájlt hoz létre TAPE39 vagy FTN039.DAT névvel. Ez a szalagos egységek használatának idejéből maradt fenn, és elavultnak tekintik. Az OPEN()
utasításban nagyon sok opció adható meg. A FILE = fájlnévben a fájl elérési útját kell megadni. Az UNIT = egységszám megadása is kötelező. A fájl elérése lehet SEQUENTIAL (=szekvenciális, közvetett) vagy DIRECT (=direkt, közvetlen); alapértelmezésben SEQUENTIAL. A fájl formátuma lehet FORMATTED (=formázott) vagy UNFORMATTED (=formázatlan); alapértelmezésben UNFORMATTED. Formázott esetben meg kell adni a rekordhosszt is, erre a RECL = rekordhossz szolgál. A rekordhossz többnyire megfeleltethető a fájl sorainak hosszával. Használat után a fájlt be kell zárni a CLOSE (egységszám) utasítással.
További opciók az ERR=címke az I/O hiba kezelésének címkéje, STA= a fájl állapota: NEW, ha új, OLD, ha régi, és SCRATCH, ha átmeneti. Bezáráskor a fájl törölhető a CLOSE utasítás a STATUS='DELETE' paraméterrel.
A szekvenciális fájlok rekordonként olvashatók a fájl elejétől a fájl végéig. A Fortran77 nem specifikálta a mutató helyét, ezért megnyitás után az olvasáshoz ki kellett adni a REWIND utasítást, amivel a fájl elejére lehet ugrani. A Fortran90 óta az írásra vagy csak olvasásra megnyitott fájl elejére, a hozzáfűzésre megnyitott fájl végére mozog.
Minden olvasás alapértelmezetten új rekordot olvas be, egészen addig, amíg el nem ér a fájl végéig. Visszafelé a BACKSPACE
utasítással lehet mozogni. Új rekordokat csak a fájl végére lehet fűzni; REWIND után írni a fájl tartalmának megsemmisülésével jár. A direkt hozzáférésű fájlokban lehet sorszámmal hivatkozni a rekordokra, de ehhez meg kell adni a rekordhosszt, ami a fájl egész életében állandó marad. A formázott fájlok szövegként írhatók-olvashatók, míg a nem formázottak bináris gépi kódot tartalmaztak és nem hordozhatók, gyakran még azonos típusú gépek és operációs rendszerek között sem.
A szövegfájlok rendszerint formázott szekvenciális fájlok. A nem formázott szekvenciális fájlok az egyes programegységek közötti kommunikációra valók. Egy rekord akár több ezer mezőt is tartalmazhat; ennek csak az operációs rendszer szab határt. A nem formázott direkt elérésű fájlok használata hatékonyabbá teheti a programot, de használatához tudni kell, hogy az adott rendszer milyen mértékegységben méri a rekordhosszt, és hogy egy számot hány bájton tárol. A formázott direkt elérésű fájlok rekordhosszát mindenütt karakterben mérik.
A Fortran90 újabb utasításokkal és paraméterekkel bővítette a fájlkezelés képességeit. Így például APPEND
-re megnyitva a mutató eleve a fájl végére van pozicionálva, és különféle tulajdonságok kérdezhetők le a fájl megnyitása után.
Felhasználói típusok
[szerkesztés]Felhasználói típusok a Fortran90 óta TYPE kulcsszóval hozhatók létre:
TYPE PONT
REAL x, y, z
END TYPE PONT
Ez az adatszerkezet inkább a Pascal rekordjaira és a C nyelv struct-jaira hasonlít, mint osztályokra. Az objektumorientált programozást a Fortran2003 vezette be.
A típusba a % jellel lehet lefúrni:
P%x=4.0
P%y=4.0
P%z=5.0
Az egyes felhasználói típusok egymásba ágyazhatók. Mélyebbre is le lehet fúrni:
golyo%kozeppont%x
Az összetett típusok lehetnek tömbelemek, paraméterek vagy visszatérési értékek. Az egyes adatmezők értékei tömbök is lehetnek, kivéve a dinamikus tömböket.
Pointerek
[szerkesztés]A pointereket a Fortran90 vezette be. A pointerek POINTER kulcsszóval és céljuk típusával deklarálandók. A pointerek lehetséges célját TARGET jelöli a deklarációban. Az így megjelölt célra => jellel állítható pointer; ezután a cél hivatkozható a pointer nevével is, de tényleges másolás nem történik. A pointerek hivatkozásait a fordítók automatikusan feloldják. A pointer átállítható egy másik célra, vagy a Null értékre a NULLIFY utasítással.
A pointerek is allokálhatók; ekkor a NULLIFY utasítás memóriaszemetet hagy maga után; helyette deallokálni kell. A pointerek mutathatnak dinamikus tömbökre is. A dinamikus tömbök hatékonyabbak, de a dinamikus pointerek flexibilisebbek.
A pointerek lehetnek argumentumok, de csak INTENT deklaráció nélkül. Használatuk interfészt igényel. Lehetnek visszatérési értékek is. Lehetnek tömbök elemei, mezőértékek is.
Újabb változatok
[szerkesztés]A Fortrannak több átdolgozott kiadása is megjelent a Fortran90 óta, de ezek nem terjedtek még el széles körben.
Fortran95
[szerkesztés]A Fortran95 újdonságai:
FORALL
és beágyazottWHERE
szerkezetek a vektorizáció megkönnyítésérePURE
ésELEMENTAL
eljárások- A származtatott típusok és a pointerek inicializálása
- A
DATA
-ban foglaltak inicializálási lehetőségeinek bővítése - Az allokált tömbök automatikus deallokálásása a hatókör elhagyásával
Több belső függvény használatának körét bővítették, például a MAXLOC kaphat egy dim paramétert.
Eltávolítottak néhány, a régi programozási gyakorlatban használt eszközt, amik azonban számos hibalehetőséget hordoztak magukban:
REAL
ésDOUBLE PRECISION
ciklusváltozók- Ugrás blokkon kívüli
END IF
-re - H formátumleíró
- Számított címkéjű GO TO utasítások
A Fortran95 kibővítette az allokálható tömbök használati körét. Így lehetnek típusmezők, paraméterek és visszatérési értékek. Az automatikus deallokáció miatt ezzel elmúlik a memóriaszivárgás veszélye, ami pointerek esetén fennáll. Egy másik hasznos lehetőség a lebegőpontos kivételkezelés.
A Fortran95 két opcionális modult is tartalmaz, amik lehetővé teszik a változó hosszúságú stringek kezelését és a feltételes fordítást. Ezek azonban nem érhetők el mindenütt, így hordozható program nem használhatja őket.
Fortran2003
[szerkesztés]A Fortran2003 sok új, objektumelvű eszközt vezetett be. A Fortran Munkacsoport honlapján összefoglaló érhető el róluk.[2]
- A felhasználói típusok lehetőségeinek kibővítése: parametrizálhatóság, a hozzáférés ellenőrzése, konstruktorok és finalizátorok
- Öröklődés, polimorfizmus, dinamikus típusallokáció, és típushoz kapcsolódó eljárások
- Az adatkezelés lehetőségeinek bővítése: allokálható komponensek, VOLATILE attributum, explicit típusspecifikáció tömbkonstruktorokban, allokáló utasítások, a pointerkezelés képességének bővítése, a belső eljárások képességeinek bővítése, kiterjesztett inicializáló kifejezések
- Input-output: aszinkron adatátvitel, adatáram hozzáférés, saját típusokhoz készíthető író-olvasó műveletek, a formátum konverziókban történő kerekítések ellenőrzése, az automatikusan megnyitott egységek nevei, kulcsszavak regularizációja, FLUSH utasítás, és hozzáférés a hibaüzenetekhez
- Eljáráspointerek
- Lebegőpontos hibakezelés és IEEE szerinti lebegőpontos aritmetika
- A C nyelvvel való együttműködés javítása, a képességek megfeleltetése
- Nemzetköziség: ISO 10646 négy bájtos karakterek kezelése, tizedespont helyett tizedesvessző választása az I/O utasításokban
- Az operációs rendszerrel való együttműködés: hozzáférés parancssori argumentumokhoz, környezeti változókhoz, és a processzor hibaüzeneteihez
- Almodulok, a modulok specifikációjának és implementációjának szétbontása különböző alprogramokba. Ez javítja a nagy könyvtárak áttekinthetőségét, támogatja az üzleti titkok megőrzését, és segít elkerülni a fordítási kaszkádokat.
Fortran2008
[szerkesztés]A Fortran2008 nevével ellentétben 2010-ben jelent meg. Az új képességek a párhuzamos programozást támogatják.[3]
- Almodulok, a modulok további strukturálása
- CO-tömbök, párhuzamos végrehajtási modell[4]
- DO CONCURRENT, függetlenül végrehajtható iterációk
- CONTIGUOUS attributum, tárolási szabályok specifikálása
- BLOCK szerkezet, lokális hatókörű objektumok deklarálását tartalmazhatják
- Rekurzív allokálható komponensek, a felhasználói típusok rekurzív pointereinek alternatívája
Fortran 2015
[szerkesztés]A nyelv tervezett következő továbbfejlesztése a Fortran 2015 csak kisebb változtatásokat fog tartalmazni. A tervek közt szerepel további átjárhatóság a Fortran és a C között, további párhuzamossági funkciók, és az "egyszerű hiányosságok, és létező funkciók közötti különbségek eltávolítása".[5]
Fordítók
[szerkesztés]Fortran-fordítók minden számítógépre léteznek, a munkaállomásoktól a szuperszámítógépekig.
Kereskedelmi szoftverek
[szerkesztés]A kereskedelmi fordítók fő szállítói a számítógépgyártók, mint az IBM, a Sun Microsystems, a HP, az Intel, vagy szoftvergyártók, mint az Absoft, a PGI, a NAG, a Lahey, vagy a Salford. Tisztán Fortran77-fordítókat ma már nem készítenek, mert a Fortran95 majdnem a teljes Fortran77-et tartalmazza, csak néhány hibaforrást távolítottak el belőle.
Egyes termékek magánfelhasználóknak és nem kereskedelmi célokra ingyenes próbaverzióban is elérhetők, mint Linuxra az Intel-Fortran-Compiler, a Sun Studio Express, Windowsra a Salford fordítója, és a DEC Fortran az OpenVMS számára.
Szabad szoftverek
[szerkesztés]A majdnem minden platformra elérhető GNU Compiler Collection (GCC) a 4.0-s verzió óta tartalmaz Fortran95 fordítót (GNU Fortran). A GCC korábbi verziói még a Fortran77-hez tartalmaznak fordítót. Emellett a G95 egy másik fordító a Fortran95-höz.[6] Ezen alapul a 2003 gfortran. Az OpenWatcom fejlesztői is megalkották saját FORTRAN-77-fordítójukat.[7]
Keresztfordítók
[szerkesztés]Vannak keresztfordítók, amik a Fortran77-ben készült programokat automatikusan C nyelvre fordítják. Ilyen fordító például az f2c. Az így készült C kód azonban nehezen olvasható.[8] A NAG-fordító a C-t köztes nyelvként használja.
Nyelvi támogatás
[szerkesztés]Míg a legtöbb fordító a teljes Fortran95 szabványt támogatja, addig a Fortran2003 és a Fortran2008 képességeinek csak egy része érhető el. A Cray és az IBM fordítója azonban a Fortran2003 összes képességét használja.[9]
Humor
[szerkesztés]A Fortran77-hez volt egy javaslat, ami betiltotta volna az O betű használatát a változónevekben, hogy ne lehessen összetéveszteni a 0 számjeggyel. Mivel a javaslat A kártékonynak tekinthető O betű nevet viselte, ezért sokan arra gondoltak, hogy az O betűt teljesen ki fogják törölni az ábécéből. Ennek előnyei közé tartozott volna a GO TO utasítás kiküszöbölése, és a nehézkes FORMAT utasítások kivezetése; a GO TO törlése kikényszerítette volna a strukturált programozást. Megjegyezték, hogy ezután egyes régebbi programok nem futnának, de ezek legtöbbje nem lenne konform.[10][11]
Amikor a bizottság azt kezdte el vitatni, hogy a DO ciklus minimális végrehajtási száma 0 (elöltesztelő) vagy 1 (hátultesztelő) legyen, Loren Meissner azzal az ötlettel állt elő, hogy a minimális végrehajtási szám 2 legyen. Ezt azzal indokolta, hogy ha valamit egyszer akarunk megcsinálni, akkor oda nem kell ciklus.
Jegyzetek
[szerkesztés]- ↑ Megjegyzés Cleve Molertől a MATLAB készítőjétől MATLAB Incorporates LAPACK, 2000. [2009. október 15-i dátummal az eredetiből archiválva]. (Hozzáférés: 2020. december 8.)
- ↑ Fortran Working Group (WG5) Archiválva 2011. április 23-i dátummal a Wayback Machine-ben. Letölthető, mint PDF file[halott link] or
gzip
-peltömörített PostScript fájl[halott link], FTP.nag.co.uk - ↑ N1836, Summary of Voting/Table of Replies on ISO/IEC FDIS 1539-1, Information technology - Programming languages - Fortran - Part 1: Base language ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1836.pdfPDF( 101 KiB)
- ↑ N1830, Information technology – Programming languages – Fortran – Part 1: Base language ftp://ftp.nag.co.uk/sc22wg5/N1801-N1850/N1830.pdfPDF( 7.9 MiB)
- ↑ Doctor Fortran Goes Dutch: Fortran 2015
- ↑ G95
- ↑ OpenWatcom. [2018. július 15-i dátummal az eredetiből archiválva]. (Hozzáférés: 2019. november 9.)
- ↑ f2c. [2011. október 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2011. október 8.)
- ↑ Ian D. Chivers, Jane Sleightholme, Compiler support for the Fortran 2003 standard, ACM SIGPLAN Fortran Forum 29, 2 (2009).
- ↑ X3J3 post-meeting distribution for meeting held at Brookhaven National Laboratory in November 1976.
- ↑ "The obliteration of O", Computer Weekly, March 3, 1977
Források
[szerkesztés]- Professional Programmers Guide to Fortran77
- nimbus.elte.hu
- Adrian Sandu: Introduction to Fortran 95 and Numerical Computing. A Jump-Start for Sciencist and Engineers Archiválva 2010. június 23-i dátummal a Wayback Machine-ben