Fortran
Fortran (akronymická zkratka z anglického FORmula a TRANslator – překladač vzorců) je v informatice imperativní programovací jazyk, který v 50. letech 20. století navrhla firma IBM pro vědecké výpočty a numerické aplikace. Zpočátku byl označován jako FORTRAN (verzálami), ale od verze Fortran 90 se přešlo na označení Fortran. Kolem roku 1960 firma IBM doporučovala Fortran zapisovat jako FØRTRAN. V současné době se především používá pro: výpočty drah raket, turbulencí ve 3D, Fourierův rozvoj, Fourierovu transformaci, vývoj počasí, elektroinženýrství, fyzikální chemii a částicovou fyziku.
Paradigma | multiparadigmatický: strukturovaný, imperativní (procedurální, objektově orientovaný), generický |
---|---|
Vznik | roce 1957 |
Autor | John Backus |
Vývojář | John Backus a IBM |
Poslední verze | Fortran 2008 (ISO/IEC 1539-1:2010) (2010) |
Hlavní implementace | Absoft, Cray, GFortran, G95, IBM XL Fortran, Intel, Hitachi, Lahey/Fujitsu, Numerical Algorithms Group, Open Watcom, PathScale, PGI, Silverfrost, Oracle Developer Studio, Visual Fortran a další |
Ovlivněn jazyky | Speedcoding |
Ovlivnil jazyky | ALGOL 58, BASIC, PL/I, C |
Fortran se brzy stal jedničkou mezi programovacími jazyky a více než půl století se využíval například pro výpočty předpovědi počasí, analýzu pevných částic a další fyzikální a chemické výpočty. V novějších verzích Fortranu se postupně objevovaly různé nové vlastnosti, jako například podpora pro datová pole (Fortran 90/95), objektově orientované programování a generické programování (Fortran 2003). Je to jeden z nejpopulárnějších jazyků v oblasti vysoce výkonných počítačů a je to jazyk, který se využívá v programech na nejrychlejších superpočítačích světa[zdroj?].
Fortran zahrnuje několik různých verzí a každá z nich obsahuje několik vylepšení v jazyce. Obvykle jsou kompatibilní s předchozími verzemi. Po sobě jdoucí verze mají podporu pro strukturované programování a zpracovávání znakových dat (FORTRAN 77), programování polí, modulární programování a také generické programování (FORTRAN 90). Dále pak vysoce výkonný Fortran (FORTRAN 95), objektově-orientované programování (FORTRAN 2003) a souběžné programování (FORTRAN 2008).
Historie
editovatVývoj FORTRANu započal v roce 1953, kdy se John W. Backus zavázal u IBM k vytvoření efektivnější alternativy k jazyku symbolických adres pro programování jejich sálového počítače IBM 704 a také pro přiblížení programování širší laické veřejnosti. Backusův původní tým, který pracoval na FORTRANu se skládal z programátorů: Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, Irving Ziller, Lois Haibt a David Sayre.
Prvotním plánem bylo vytvořit nový jazyk za méně než šest měsíců. Vývoj se ovšem protáhl na několik let. Tento tým vytvořil první použitelnou verzi kompilátoru FORTRAN v polovině roku 1954. První příručka k programovacímu jazyku FORTRAN se objevila v říjnu 1956 a jazyk samotný byl ve finální verzi představen na Western Joint Computer Conference v Los Angeles v dubnu 1957. Veřejnost tehdy fungovala jako pokusní králíci, dostala za úkol vyřešit příklad v assembleru a poté s pomocí FORTRANu. Komunita byla zpočátku velmi skeptická, že by Fortran mohl překonat ruční kódování. Veřejnost nebyla ochotna používat vysokoúrovňový programovací jazyk, ledaže jeho kompilátor by vygeneroval takový kód, který by byl srovnatelný s ručně psaným kódem v assembleru. Bylo prokázáno, že kód byl rychlejší a elegantnější než v assembleru.
V roce 1979 J. Backus poskytl časopisu Think interview, kde prohlásil: „Většina mé práce vzešla z toho, že jsem líný. Neměl jsem rád psaní programů a tak, když jsem pracoval na IBM 701 a psaní programů pro výpočet dráhy raketové střely, začal jsem pracovat na programovacím systému, který mi usnadnil psát programy.“
Jazyk byl široce používán vědci pro psaní numericky náročných programů. Zároveň se objevovaly kompilátory, které generují rychlejší kód. Postupně se objevilo několik standardů jazyka, jako například FORTRAN IV a FORTRAN 66, FORTRAN 77, Fortran 90, Fortran 95 který v sobě přinášel především větší možnosti na programování souběžného zpracování úloh a práci s poli, Fortran 2000, Fortran 2003 a Fortran 2008.
IBM vydala verze Fortran II (zavedení podprogramů a oddělených překladů), III (kombinace assembleru a zdrojového kódu Fortranu, nikdy se nedostal veřejnosti) a IV. Velkým mezníkem v pokroku byl vznik ANSI standardu Fortranu v roce 1966, pojmenovaný Fortran 66. Kolem roku 1960 byly dostupné verze FORTRANu pro počítače IBM 709, 650, 1620 a 7090. Jeho narůstající popularita způsobila, že do roku 1963 již existovalo 40 kompilátorů jazyka FORTRAN pro různé počítače. Proto je Fortran považován za první široce používání programovací jazyk podporovaný napříč mnoha počítačovými architekturami. Kompilátorů Fortranu je velké množství. Například Absoft nebo Lahey/Fujitsu Fortran. Z volně šiřitelných třeba Open Watcom. Některé vznikaly speciálně jen pro potřeby Fortranu.
Prvním kompilátorem Fortranu byl ten na mainframu IBM 704; všechny programy se tehdy psaly na děrné štítky. S příchodem magnetických médií se délka řádku výrazně rozšiřovala, tudíž Fortran 77 byl poslední verzí, která děrné štítky obsahovala.
Z tohoto důvodu je Fortran považován za první kompilátor, který byl použitelný na několika počítačových architekturách. V roce 1977 se zrodil Fortran 77 ANSI. Tato verze se stále ještě využívá. Verze Fortran 66 a 77 se staly předlohou pro vývoj dalších programů a kódů.
První verze neměly struktury jako je THEN, ELSE a IF. Používal se hlavně příkaz skoku – GOTO, jednoduchý cyklus a RETURN. Pracovat s jednoduchým textem bylo obtížné, protože zápisu byl odvozen od formátu děrných štítků. Verze obsahovala ovšem i další funkce. Čtyři základní příkazy pro I/O ve Fortranu jsou: open, close, write a read – čtení, zápis, zavírání, otevírání.
Další verzí je Fortran 90, který vznikl v roce 1992. V těchto letech vznikaly i další konkurenční programovací jazyky, např. Pascal a C. Dlouhá pauza mezi verzemi a vývoj ostatních jazyků zapříčinil, že Fortran se převážně využívá jen na numericky složité výpočty a ovládají ho konstruktéři, matematici a inženýři.
Programovací jednotky se tady rozdělily na: modul, funkční proceduru, hlavní program, vnější proceduru a datový typ. Změnil se i typ psaní zdrojového kódu – příkazy mohou začít kdekoliv, délka řádku až 132 znaků, až 39 pokračovacích řádků, více příkazů na jeden řádek, ale oddělené středníkem. Symboly užívané ve zdrojovém programu: velká písmena anglické abecedy, malá písmena anglické abecedy (od velkých písmen se odlišují jen ve znakových řetězcích), znaky, speciální symboly (! " % & ; < > ?) a číslice. Typy dat jsou vnitřní a definované uživatelem.
Počáteční vydání FORTRAN pro IBM 704 obsahoval 32 příkazů, a to včetně:
- příkazy DIMENSION a EQUIVALENCE
- Příkaz přiřazení
- Trojcestný aritmetický IF, který předal řízení na jedno ze tří míst v programu v závislosti na tom, zda výsledek aritmetického výrazu byl negativní, nula, nebo kladné
- příkazy IF pro kontrolu výjimek (ACCUMULATOR OVERFLOW, QUOTIENT OVERFLOW a DIVIDE CHECK) a pro manipulaci s přepínači a kontrolkami na ovládacím panelu počítače
- GOTO, vypočítané GOTO, ASSIGN a přiřazené GOTO
- DO
- Formátovaný vstup a výstup: FORMAT, READ, READ INPUT TAPE, WRITE, WRITE OUTPUT TAPE, PRINT a PUNCH
- Neformátovaný vstup a výstup: READ TAPE, READ DRUM, WRITE TAPE a WRITE DRUM
- Ostatní příkazy pro vstup a výstup: END FILE, REWIND a BACKSPACE
- PAUSE, STOP a CONTINUE
- příkaz FREQUENCY (poskytuje kompilátoru údaje pro optimalizaci)
Jednoduchý program ve FORTRAN II
editovatTento program pro Heronův vzorec čte jednu datovou kartu, která obsahuje tři pětimístná celá čísla A, B a C jako vstup. Pokud A, B a C nemůže reprezentovat strany trojúhelníku v rovinné geometrii, pak program skončí s chybovým kódem STOP 1
. V opačném případě se výstup řádku vytiskne zobrazující vstupní hodnoty pro A, B a C, následně pro vypočítaný obsah trojúhelníku jako číslo s plovoucí čárkou (datový typ float
).
C AREA OF A TRIANGLE WITH A STANDARD SQUARE ROOT FUNCTION
C INPUT - CARD READER UNIT 5, INTEGER INPUT
C OUTPUT - LINE PRINTER UNIT 6, REAL OUTPUT
C INPUT ERROR DISPLAY ERROR OUTPUT CODE 1 IN JOB CONTROL LISTING
READ INPUT TAPE 5, 501, IA, IB, IC
501 FORMAT (3I5)
C IA, IB, AND IC MAY NOT BE NEGATIVE
C FURTHERMORE, THE SUM OF TWO SIDES OF A TRIANGLE
C 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
C USING HERON'S FORMULA WE CALCULATE THE
C 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
Ukázky kódu
editovatProgram Average (průměr)
editovat ! Read in some numbers and take the average
! As written, if there are no data points, an average of zero is returned
! While this may not be desired behavior, it keeps this example simple
implicit none
real, dimension(:), allocatable :: points
integer :: number_of_points
real :: average_points=0., positive_average=0., negative_average=0.
write (*,*) "Input number of points to average:"
read (*,*) number_of_points
allocate (points(number_of_points))
write (*,*) "Enter the points to average:"
read (*,*) points
! Take the average by summing points and dividing by number_of_points
if (number_of_points > 0) average_points = sum(points) / number_of_points
! Now form average over positive and negative points only
if (count(points > 0.) > 0) then
positive_average = sum(points, points > 0.) / count(points > 0.)
end if
if (count(points < 0.) > 0) then
negative_average = sum(points, points < 0.) / count(points < 0.)
end if
deallocate (points)
! Print result to terminal
write (*,'(a,g12.4)') 'Average = ', average_points
write (*,'(a,g12.4)') 'Average of positive points = ', positive_average
write (*,'(a,g12.4)') 'Average of negative points = ', negative_average
end program average
Intel Fortran QuickWin API
editovatC
C S T A R T A P P L I C A T I O N
C
PROGRAM DMP
USE IFQWIN
USE IFPOSIX
TYPE (windowconfig) wc
LOGICAL status /.FALSE./
CHARACTER STR(128),PATH*128
EQUIVALENCE (STR,PATH)
C
C W O R K I N G D I R E C T O R Y I N I T I A L I Z A T I O N
C
OPEN(1,FILE='PRJ.INI',STATUS='OLD',ERR=100)
READ(1,*,ERR=100)IPR
CLOSE(1)
IF(IPR.LE.0)GOTO 100
IF(IPR.GT.9)GOTO 100
CALL PXFGETCWD (PATH,ILN,IER)
IF(IER.NE.0)GOTO 100
WRITE(PATH,'(<ILN>A1,A4,I1)')(STR(i),i=1,ILN),'\PRJ',IPR
ILN=ILN+5
CALL PXFCHDIR (PATH,ILN,IER)
IF(IER.NE.0)GOTO 100
C
C F R A M E W I N D O W I N I T I A L I Z A T I O N
C
100 IER= INITIALSETTINGS
IF(IER.NE.0)GOTO 900
CALL SETMESSAGEQQ('Action waiting in ',QWIN$MSG_INPUTPEND)
IER= SETEXITQQ (QWIN$EXITNOPERSIST)
IF(IER.NE.0)GOTO 900
IER= ABOUTBOXQQ('ArtInt Data Mining Provider\rIntelligent Software © 2020'C)
IF(IER.NE.0)GOTO 900
C
C V I R T U A L W I N D O W I N I T I A L I Z A T I O N
C
wc.numtextcols = 30
wc.numtextrows = 2
wc.fontsize = #00080010 ! 8x16
wc.title = "Data Mining Provider"C
status = SETWINDOWCONFIG(wc)
IF (.NOT.status) status = SETWINDOWCONFIG(wc)
PAUSE 'Select action type ...'
C
C E N D A P P L I C A T I O N
C
900 IER = MESSAGEBOXQQ(' Program terminated ...'C, 'Data Mining Provider'C, MB$OK)
STOP
END
!
! I N I T I A L S E T T I N G S F U N C T I O N
!
LOGICAL FUNCTION INITIALSETTINGS
USE IFQWIN
EXTERNAL IODAT,IOCFG,IORDC
EXTERNAL MLPADMAINFRAME,SOMADMAINFRAME,RAMADMAINFRAME
EXTERNAL MLPACMAINFRAME,SOMACMAINFRAME,RAMACMAINFRAME
LOGICAL res
TYPE (qwinfo) qw
! Set window frame size
qw.TYPE = QWIN$SET
qw.x = 185
qw.y = 85
qw.w = 1000
qw.h = 600
IER=SETWSIZEQQ(QWIN$FRAMEWINDOW,qw)
! Create first menu
res = APPENDMENUQQ(1,$MENUENABLED, '&File'C,NUL)
! Add items
res = APPENDMENUQQ(1,$MENUENABLED, '&Data'C, IODAT)
res = APPENDMENUQQ(1,$MENUENABLED, '&Config'C,IOCFG)
res = APPENDMENUQQ(1,$MENUENABLED, '&Reduct'C,IORDC)
! Draw a separator bar
res = APPENDMENUQQ(1,$MENUSEPARATOR,''C,NUL)
! Add item Exit
res = APPENDMENUQQ(1,$MENUENABLED, '&Exit'C,WINEXIT)
! Create second menu
res = APPENDMENUQQ(2,$MENUENABLED, '&Adaptation'C,NUL)
! Add items
res = APPENDMENUQQ(2,$MENUENABLED, '&MLP'C,MLPADMAINFRAME)
res = APPENDMENUQQ(2,$MENUENABLED, '&SOM'C,SOMADMAINFRAME)
res = APPENDMENUQQ(2,$MENUENABLED, '&RAM'C,RAMADMAINFRAME)
! Create third menu
res = APPENDMENUQQ(3,$MENUENABLED, '&Activation'C,NUL)
! Add items
res = APPENDMENUQQ(3,$MENUENABLED, '&MLP'C,MLPACMAINFRAME)
res = APPENDMENUQQ(3,$MENUENABLED, '&SOM'C,SOMACMAINFRAME)
res = APPENDMENUQQ(3,$MENUENABLED, '&RAM'C,RAMACMAINFRAME)
! Add last menu
res = APPENDMENUQQ(4,$MENUENABLED, '&Help'C,NUL)
res = APPENDMENUQQ(4,$MENUENABLED, '&About'C,WINABOUT)
INITIALSETTINGS=.TRUE.
RETURN
END
Vlastnosti
editovatNa počátku jazyk vyžadoval precizní formátování zdrojového kódu a bylo nutné používat čísla řádků a výraz goto
. Tyto nevýhody byly postupně odstraněny novějšími verzemi jazyka.
Aktuální verze
editovatFortran 2008
editovatZatím poslední verzí je Fortran 2008, jež nahradila verzi Fortran 2003. Od verze Fortran 95 zde došlo jen k drobným úpravám a jedná se spíše o zjednodušení kódu a odladění verze Fortran 2003. V této verzi také přibyly některé módy kompatibility:
- Co-array Fortran – model paralelního výpočtu
- datový typ
BIT
Přenositelnost
editovatPřenositelnost byla pro Fortran problémem hlavně v jeho počátcích, kdy nebyl ještě stanoven žádný standard a dokonce se objevovaly chyby při běhu na strojích postavených dle referenční příručky IBM, neboť někteří výrobci se snažili do svých počítačů přidávat nové funkce, které pak způsobovaly chyby při migraci na nové procesory. Tyto problémy byly odstraněny standardy, které se ustanovily v pozdější době. V roce 1966 byl vydán standard pro syntax a sémantiku, ale i přesto někteří výrobci přidávali do svých programů rozšíření, která nebyla podporována. Ačkoliv si pečlivější programátoři uvědomovali, že nekompatibilní rozšíření přinášejí problémy v podobě špatné přenositelnosti, problémy s přenositelností pokračovaly až do roku 1977, kdy byl vydán standard organizací National Bureau of Standards (nyní NIST).
Při dodržení standardu je ještě i v dnešní době možné (a relativně jednoduché) napsat kompletně přenositený program v jazyce Fortran bez nutnosti použití preprocesoru.
Externí odkazy
editovat- Obrázky, zvuky či videa k tématu Fortran na Wikimedia Commons
- Seriál Fortran pro všechny na Root.cz
- Zdrojové texty řešení vybraných numerických úloh