Hlavní navigace

Fortran: chroustání čísel pro všechny

30. 7. 2007
Doba čtení: 8 minut

Sdílet

Pro většinu současných programátorů je Fortran něco podobného jako staročeština. Na mysli vytanou počítače velikostí parních lokomotiv, krabice plné děrných štítků a zdrojové kódy plné skoků a návěští. Jen pár lidí ze sta vám poví, že Fortran je docela slušný, standardizovaný a stále se rozvíjející kompilovaný jazyk.

Trocha historie úvodem

Fortran vznikl v roce 1953 jako dílo Johna Backuse z firmy IBM, a po vydání prvního překladače zaznamenal obrovský úspěch. IBM postupně vydala specifikace Fortran II, III a IV. Milníkem ve vývoji byl vznik ANSI standardu Fortranu v roce 1966, typicky nazývaný Fortran 66. O dvanáct let později vznikl ANSI Fortran 77, který se v nemalé míře používá dodnes. Normy ANSI Fortran 66 a 77 se staly standardem pro tvorbu výpočetních programů a vzniklo v nich obrovské množství velmi kvalitního (i nekvalitního, pochopitelně) kódu, rozšiřovaného zejména jako knihovny podprogramů, z nichž leckteré se používají dodnes (např. BLAS, LAPACK, MINPACK, ARPACK, ODEPACK).

Dlouhá odmlka mezi Fortranem 77 a následujícím Fortranem 90 (r. 1992), spolu s rozmachem konkurenčních jazyků (C, Basic, Pascal) způsobila značný odklon od Fortranu k alternativám, zejména v oblastech které nebyly tak výpočetně intenzivní. Navzdory mnohým předpovědím (např. E.W. Dijkstra) Fortran nezanikl, jen se jeho uživatelská základna výrazně zmenšila a omezila téměř výhradně na oblast numerických výpočtů. Menší revizí Fortranu 90 byl Fortran 95, současným standardem je ISO Fortran 2003, který byl opět velkou revizí. Připravuje se Fortran 2008, který má být opět menší revizí (ačkoliv podle draftů to tak úplně nevypadá).

Historie Fortranu si zaslouží více než toto krátké shrnutí, a ještě se k ní později vrátíme. Prozatím se ale nebudeme zdržovat a přejdeme k modernímu Fortranu a programování v něm.

Co je moderní Fortran

Přestože norma Fortran 2003 existuje již více než dva a půl roku (byla vydána koncem listopadu 2004), neexistuje ještě žádný překladač, který by ji plně podporoval. Důvodem je zřejmě to, že Fortran je používán převážně inženýry a vědci, kteří jsou ke změnám ve vývojových nástrojích konzervativnější než ostatní vývojáři. Mnozí stále používají Fortran 77, protože jim docela vyhovuje a na jeho omezení si již zvykli, a do konce života už zřejmě „neupgradují“.

V podstatě všechny aktivně vyvíjené překladače naproti tomu podporují Fortran 95, a v současné době velká většina z nich i důležitý dodatek s označením TR 15581 známý také jako „Allocatable TR“, rozšiřující použití alokovatelných polí. Pod označením „moderní Fortran“, „současný Fortran“, nebo jenom „Fortran“ budu tedy mít na mysli Fortran 95 + Allocatable TR. Většina překladačů podporuje však i nějaké další vybrané části z Fortranu 2003 – ty oblíbenější (např. spolupráce s C) se tak stávají de facto standardem už dnes. Vydání překladače plně podporujícího Fortran 2003 se očekává tento rok (ano, očekávalo se už minulý rok, a nejpozději to bude příští rok, ale to už na beton, že…)

Dejte mi nástroje…

V duchu Root.cz uvedeme na prvním místě open-source překladače: jsou jimi gfortran a g95. Oba jsou založeny na gcc, první je přímo součástí gcc, druhý je samostatný a jen používá gcc backend. Oba lze používat na mnoha platformách: Linux, Windows, OS X, Solaris aj. Výhodou g95 je větší stabilita (i starších verzí) a větší podpora Fortranu 2003, gfortran naopak typicky lépe optimalizuje (používá aktuální GCC backend a i kód front-endu je více zaměřený na optimalizace), takže výsledné spustitelné soubory bývají rychlejší. Výhodou g95 může být i český manuál. g95 lze stáhnout na stránkách www.g95.org, gfortran na gcc.gnu.org/for­tran. Používáte-li novější linuxovou distribuci, pravděpodobně máte gfortran k dispozici jako volitelný balíček. Pozor, doporučuji gfortran verzi aspoň 4.1.x (4.0.x jsou dost chybové), nejlépe však nedávno vyšlou verzi 4.2.0, která se stabilitou již téměř vyrovná g95 a podporuje i Allocatable TR.

Dalšími open source překladači jsou výborný Open64 a ORC, ale pouze pro 64bitové platformy. Na místě je zmínit také překladače Fortranu 77, a to známý g77, nebo původně komerční OpenWatcom.

Ke komerčním překladačům patří Sun Studio, Intel Fortran, EkoPath a QLogic od PathScale, Portland PGI, Salford (pro Windows), IBM XL Fortran, NAG Fortran a další. Sun Studio lze stáhnout zdarma (po registraci), Intel Fortran pod Linux pro osobní použití rovněž.

Programátory, kterým k životu stačí editor a překladač, potěší, že Vim i Emacs modernímu Fortranu rozumějí, stejně jako mnohé další oblíbené programátorské editory. Pro ty, kteří mají radši IDEčka, je tu především Photran coby modul k Eclipse. Komerční překladače pro Windows mají obvykle vlastní IDE, nebo se integrují do MS Visual Studio.

Jako příručku k modernímu Fortranu bych doporučil zejména „Fortran 90/95 explained“ (M. Metcalf a J.K. Reid), případně novější „Fortran 95/2003 eplained“ od stejných autorů, ale existují i mnohé další. Česká kniha o moderním Fortranu, pokud vím, neexistuje; pokud někdy natrefím na vydavatele, který by měl o ni zájem, nějakou napíšu. Z elektronických zdrojů informací lze uvést například:

Autoritativním zdrojem pro jazyk je samozřejmě současný standard ISO Fortran 2003, stažitelný ve verzi „draft“ z oficiálních stránek. Plná verze je chráněná copyrightem, takže pokud byste ji chtěli, tak mi napište na e-mail a já vám ji nepošlu. I v draftu je ovšem už téměř všechno.

…a já stvořím program

Namísto klasického „hello, world“ uvedeme jako první program něco zajímavějšího. Řekněme, že máme klasickou šestistěnnou kostku, kterou házíme pořád dokola, a posunujeme přitom po hracím plánu „člověče, nezlob se“ figurku (je vlastně jedno, zda na šestku házíme znovu, protože prostě házíme pořád dokola). A chceme spočítat pravděpodobnost, že se nám podaří vyhodit figurku stojící na N-tém políčku (vyjíždíme z prvního políčka). Jednoduché řešení ve Fortranu by vypadalo třeba takhle:

program kostka
implicit none
! pravdepodobnost slapnuti na policka k-5,k-4,...,k
real:: p(-5:0)
integer:: k,n

write(*,*) 'cislo policka na nemz stoji nepritel (N):'
read(*,*) n
if (n <= 0) then
  stop 'chci kladne cele cislo.'
end if
p(-5:-1) = 0 ! fiktivni policka
p(0) = 1
do k=2,n
  ! update pravdepodobnosti
  p = eoshift(p,1,sum(p) / 6.)
end do
write(*,'("Pravdepodobnost je ",F5.1,"%")') 1e2*p(0)
end program 

Prosím česky

Výše uvedený program pěkně ilustruje některé základní rysy Fortranu, takže si jej zkusíme rozebrat. Každý asi pochopil, že řádky program a end program uvozují celý program. Následující řádek je komentář: ! funguje ve Fortranu stejně jako // v C++ – označuje komentář do konce řádku.

Řádek implicit none znamená nepoužívat implicitní deklarace proměnných. Fortran totiž umožňuje specifikovat, že při použití neznámé proměnné se má automaticky deklarovat skalární proměnná s tímto jménem, jejíž typ se odvodí z prvního písmene názvu. Výchozí nastavení bohužel není implicit none, ale implicit real (a-h),integer (i-n),real (o-z). Důvod je zpětná kompatibilita s Fortranem 77. Dnes je už celkem zbytečné šetřit řádky kódu, a proto se doporučuje implicitní typování nepoužívat – je to sice pohodlné, ale vede to k různým obskurním chybám. Pokud vám „znečišťování“ kódu řádky implicit none opravdu vadí, pak vězte, že většina překladačů má volbu, která jej nastavuje na default.

Následující řádek real:: p(-5:0) deklaruje pole reálných čísel o šesti prvcích indexované čísly –5 až 0. Fortran umožňuje (už od verze 77) deklarovat pole indexovatelná libovolným souvislým rozsahem celých čísel. To je pro numerické aplikace občas užitečné. Default, tedy deklarace real:: p(6) znamená rozsah 1 až 6, nikoli 0 až 5, jak jsou mnozí programátoři zvyklí. Důvodem je zpětná kompatibilita, a také to, že je to pro vědce a inženýry obvykle příjemnější. V našem případě je volba rozsahu celkem logická (viz komentář nahoře).

Jak možná správně usuzujete, následující dva řádky jsou I/O (tedy první je O, druhý I). Fortraní I/O je poměrně mocné, ale pro veterány jiných jazyků (např. C++) dost zvláštní a nějakou dobu trvá, než si na něj člověk zvykne. Na tomto místě pouze řeknu, že první write a read jsou volně formátované (tzv. list-directed format), zatímco finální write má uživatelský formát.

Další konstrukce je podmínkový if-blok, jak jej známe z ostatních jazyků. Poznamenám, že uvedený blok lze zapsat i jednořádkově:

if (n <= 0) stop 'chci kladne cele cislo.' 

Příkaz stop znamená okamžité ukončení programu. Zavřou se otevřené soubory, ale nic víc, což znamená, že v robustních programech je potřeba jej používat velmi opatrně. Lze mu předat buď chybový řetězec, nebo číselný kód, nebo nic.

Následující příkaz p(-5:-1) = 0 (zřejmě povědomý Octavistům či Matlabistům) přiřadí nulu do prvků pole p s indexy –5 až –1. Operátor dvojtečka umožňuje extrahovat z polí libovolné sekce s indexy danými aritmetickou posloupností. Pozor, oproti Octave a Matlabu se krok (stride) uvádí jako třetí. p(0) = 1 je samozřejmě přiřazení poslednímu prvku pole.

Konstrukce doend do označuje fortranský cyklus. Těch je více druhů, toto je indexovaný cyklus. Specifikovat se musí počáteční a koncová hodnota, a volitelně i krok (podobně jako u sekcí pole). Tělo cyklu

CS24_early

p = eoshift(p,1,sum(p) / 6.) 

je ukázkou vestavěných funkcí Fortranu pro práci s číselnými poli. Ve Fortranu (opět podobně jako v Octave) lze s poli zacházet do značné míry jako se skalárními proměnnými: provádět s nimi aritmetické operace, kopírovat je jedním příkazem nebo je vracet jako hodnoty funkcí. Vestavěná funkce sum spočítá součet prvků pole, funkce eoshift posune prvky doleva nebo doprava a vzniklou mezeru vyplní zadanou hodnotou (a výsledek vrátí).

Do příště

Výše uvedený program není vyčerpávající ukázkou Fortranu, jde spíš o ochutnávku. Pokud vás Fortran zaujal, přečtěte si i příští díl. V něm si už systematicky shrneme základní konstrukce jazyka, ukážeme si jak se vytvářejí moduly, podprogramy, funkce a složené typy. Ve třetím díle si posvítíme na pole, jejich deklarace, předávání a operace s nimi. Ve čtvrtém díle si povíme něco více o minulosti i budoucnosti jazyka, a spolupráci Fortranu s jinými jazyky.

Byl pro vás článek přínosný?

Autor článku