Fortran: Quo vadis?

27. 8. 2007
Doba čtení: 13 minut

Sdílet

V posledním díle seriálu o jazyce Fortran si v rychlosti povíme něco o I/O ve Fortranu, a pak už se podíváme blíže na vývoj Fortranu od jeho počátků přes problémy s revizí Fortran 90 až do dnešního Fortranu 2003. Také se zamyslíme nad rolí moderního Fortranu v současnosti, po boku C a C++.

I/O aneb co se nestihlo

Čtyři základní příkazy pro I/O ve Fortranu jsou open, close, read a write, kterými se, jak zřejmě tušíte, soubory otevírají, zavírají, čtou a zapisují. Například takto:

open(10,file='scitance.txt')
read(10,*) pocet
allocate(scitance(pocet))
read(10,*) scitance
open(11,file='soucet.txt')
write(10,*) 'soucet: ',sum(scitance)
close(11)
close(10)
deallocate(scitance)

První, čeho si na tomto příkladě všimnete, je zřejmě použití čísel pro identifikaci souborů (říká se jim jednotky), oproti většině ostatních jazyků, kde je soubor obyčejně speciální typ, např. FILE v C. Pokud vám ten druhý způsob připadá lepší a čistší, souhlasím s vámi. Mějte na paměti, že I/O bylo ve Fortranu před strukturami. Zpětná kompatibilita je mocné zaklínadlo, a fortraní způsob nemá zase tak závažné nedostatky (dokonce má určité drobné výhody), aby se ospravedlnilo prolomení tohoto zaklínadla. Hlavní problém budete mít zřejmě v tom, že jednotky jsou globální, a tudíž potřebujete umět najít „volnou“ jednotku. To se dělá obvykle nějak podobně jako:

! find an empty IO unit
subroutine find_unit(iunit,istart)
integer,intent(out):: iunit
logical:: op
iunit = 7 ! nizsi cisla byvaji rezervovana
do
  inquire(unit=iunit,opened=op)
  if (.not.op) exit
  iunit = iunit + 1
  if (iunit > 1e5) then
    iunit = 0
    exit
  end if
end do
end subroutine

Pak si prostě definujete proměnnou, přiřadíte jí volnou jednotku, a tu dále v I/O příkazech používáte.

Příkazy read a write mohou být formátované nebo neformátované (binární). Na místě formátu se často (zejména při čtení) specifikuje hvězdička, označující tzv. volný (list-directed) formát, což znamená „překladači, poraď si jak umíš“. Při čtení tak překladač rozezná čísla ve všech jemu známých formátech, oddělená mezerami nebo čárkami, a při zapisování čísla formátuje, jak uzná za vhodné (obvykle tak, aby se neztratila žádná informace), řetězce se samozřejmě zpracují normálně. Další možnost je použít (převážně při zápisu) uživatelský formátovací řetězec, podobně jako v C (ale samozřejmě s jinou syntaxí). Příjemnou vlastností Fortraního I/O je, že do seznamu proměnných můžeme zapsat i pole nebo strukturu, a dokonce i seznam proměnných vyjádřený pomocí cyklu (tzv.implied-do list), a tak načítat či zapisovat jedním příkazem celá pole. Fortran 2003 už umožňuje I/O pro struktury i „přetížit“, tedy použít pro ně uživatelské procedury.

Pro další informace o I/O ve Fortranu opět odkazuji na informační zdroje zmíněné v prvním díle. Teď už se podíváme blíže na historii a vývoj Fortranu.

Před svítáním

Programování počítačů v podstatě existovalo už od dob „difference machine“ Charlese Babbage (byť spíše teoreticky). Když byl v USA postaven ENIAC, (r. 1942), mechanické signály byly nahrazeny elektrickými, ale programování pořád stálo na podobných principech, a spočívalo v ručním přepojování drátů. Posléze (zejména zásluhou J. von Neumanna) se přešlo na instrukce, uložené elektronicky ve strojovém kódu, což umožnilo mnohem rychlejší přeprogramovávání počítačů, a také (později) ukládání programů a jejich přenášení mezi stejnými nebo podobnými počítači. Později vznikaly assemblery (podstatně primitivnější než ty dnešní) jako tenká vrstva nad strojovým kódem (zejména místo čísel mnemonické zkratky instrukcí). Programování bylo ale stále velmi jemným a specializovaným uměním. Programátor byl zároveň odborník na hardware (typicky jednoho, dvou počítačů). To činilo lidské zdroje v oblasti počítačů velmi drahými. Programovací jazyky vyšší úrovně tak vznikly, podobně jako mnoho jiných vynálezů, z nutnosti.

Úsvit

Počátkem padesátých let totiž přišla doba, kdy počítače už byly natolik rychlé, že existující výpočetní programy, jejichž tvorba trvala týdny, vypočetly odpověď za několik minut, nebo i sekund. Sálové počítače (například ten od firmy IBM s číslem 704) začínaly být většinu času nevytížené. Příslovečným úzkým hrdlem láhve se stalo programování, ne běh programů. Přirozeně tedy experti hledali cesty, jak programování zjednodušit a přiblížit ho těm, kteří nebyli experty na počítače.

FORTAN nebyl prvním programovacím jazykem. Už před ním existoval například jazyk Short Code. Jazyk, který vznikl ve firmě IBM v letech 1954–57 pod názvem FORTRAN (později FORTRAN I) ale zaznamenal velký úspěch. Nebylo divu. Napsat program na výpočet parametrů jaderného reaktoru najednou trvalo jen hodiny místo týdnů. Programy navíc byly podstatně přenositelnější než assembler nebo strojový kód, pro spuštění na jiném počítači (s překladačem FORTRANU I) byly obvykle potřeba jen malé nebo žádné úpravy. Programy se tak abstrahovaly od počítačů, hardwaroví experti se mohli soustředit na překladače a programátoři a inženýři psali programy.

Velkou předností prvního překladače, bez kterého by asi Fortran I neprorazil, byl velmi efektivní generovaný strojový kód. IBM dokonce uspořádala několik soutěží mezi profesionálními programátory (ve strojovém kódu nebo assembleru) a svým překladačem. Kódy vygenerované překladačem byly vždy srovnatelně efektivní jako ty vytvořené přímo, a v mnoha případech i efektivnější. Investice do koupě překladače a programování ve FORTRANu se tudíž docela všestranně vyplácela, a tak není divu, že se překladač prodával jako horké lívance. Nemalou zásluhu je potřeba přiznat i odpovědným manažerům z IBM, kteří správně cítili úspěch a stále projekt podporovali, ačkoliv (jak už to tak bývá) spotřeboval mnohem více času a peněz, než se původně plánovalo.

Rozvoj

FORTRAN II přinesl podstatné novinky. Vycházeje z prací J. von Neumanna, zavedl především podprogramy a jejich oddělený překlad. To bylo velmi důležité i z toho důvodu, že tehdejší hardware byl dosti nespolehlivý a při překladu stořádkových kódů už byla slušná pravděpodobnost chyby. Hlavní ale byla možnost a stavění programu ze stavebních „bloků“. Podprogramy se daly psát i v assembleru. Začaly vznikat rozsáhlé knihovny podprogramů pro nejrůznější účely. FORTRAN II tak zásadně přispěl k rozvoji procedurálního programování.

FORTRAN III nebyl nikdy uvolněn pro veřejnost, používal se jen dočasně uvnitř IBM. Umožňoval kombinovat přímo zdrojový kód Fortranu s assemblerem. Tento potenciálně velmi efektivní přístup byl ale zavržen, protože šel proti přenositelnosti programů.

FORTRAN IV stavěl na velmi rozšířeném FORTRANu II, vylepšoval některé vlastnosti, zaváděl novinky, např. logické výrazy a logický IF, a odstraňoval některé nepravidelnosti bránící přenositelnosti kódu. IBM vydala také převaděč z verze II na IV, aby chránila investice svých zákazníků. Fortran se začal brát jako standardní prostředek pro tvorbu výpočetních programů. Začaly také vznikat překladače jiných firem a různá rozšíření, odpovídající na rozvoj hardware.

Chaos a řád

Fortran začínal „mutovat“ a přenositelnost programů byla opět ohrožena. Proto začala v roce 1962 komise ASA (nyní ANSI) pracovat na standardizaci jazyka, a v roce 66 vznikl standard, nyní označovaný jako FORTRAN 66. Byl docela krátký, jen 40 stránek. Obsahoval „to dobré“ z Fortranu IV a různých jeho rozšíření, a několik vylepšení, například formátovaný výstup. FORTRAN 66 se stal prvním průmyslovým standardem Fortranu. Byl dobře přenositelný, a tak standardním vybavením počítačů určených pro technické výpočty byl také optimalizující překladač FORTRANu. FORTRAN 66 nejenže byl prvním standardem programovacího jazyka, byl v podstatě i prvním „oficiálním“ standardem okolo software vůbec.

Po vzniku FORTRANu 66 pokračoval bouřlivý vývoj nejen hardware, ale i software a dalších programovacích jazyků (COBOL, ALGOL, LISP, BASIC, Pascal, C), což přinášelo nové trendy v oblasti programování (např. strukturované programování, složené typy atd.), na které bylo potřeba reagovat, ačkoliv pevnou vedoucí pozici FORTRANu 66 v oblasti vědeckotechnických výpočtů nic neohrožovalo. Vznikala různá rozšíření a bylo potřeba je sjednotit. Tak se zrodil další standard, který vstoupil do dějin jako FORTRAN 77 (ačkoliv byl vydán až v roce 1978). Měl být v podstatě odrazovým můstkem. Celá komunita se shodovala na tom, že nový standard je potřeba, ale už ne na tom, co by měl obsahovat. Tak se nakonec stalo, že byl schválen v poměrně chudé podobě, obsahující to, o čem panovala obecná shoda, a práce na další revizi začaly prakticky ihned po jeho vydání.

Válka o Fortran

Hlavními bojišti, a tak trochu i bojovníky, v bitvě o nový standard byla americká standardizační komise X3J3 a mezinárodní (ISO) komise WG5. Na X3J3 spočívalo samotné technické vydání standardu, amerického i mezinárodního, zatímco WG5 koordinovala mezinárodní komentáře a poskytovala technické rady. Mějme na paměti, že Fortran byl původně americký výtvor a americká strana si nad ním chtěla udržet určitý větší vliv. Později se ale role tak trochu obrátily.

Zpočátku vše vypadalo nadějně. Vydání dalšího standardu se plánovalo na rok 1982. Bylo jasné, že nelze do jazyka pořád přidávat a nic z něj neubírat. Proto se plánovalo dát jazyku nový design, sestávající z „jádra“ a „modulů“. Ukázalo se ale, že demokraticky hlasující komise zkrátka není schopná navrhnout něco malého a elegantního. Co je pro jednoho zbytečné, je pro jiného zásadní, a nakonec se vždycky spíš přidávalo než ubíralo.

Když už minul rok 1982 a vydání nového Fortranu ještě nebylo v dohledu, vložila se do procesu podstatněji i WG5, především požadavkem na publikování draftu a získáním názorů široké veřejnosti. To bylo přijato poměrem hlasů čtyřicet ku dvěma – protestovali IBM a DEC. Jejich vliv byl zřejmě ale natolik velký, že dosáhli zamítnutí návrhu komisí X3 (nadřízená X3J3). X3J3 draft publikovala stejně, ale musela hledat jiné prostředky a tím se proces zdržel.

Ani po obdržení názorů veřejnosti ale nebylo vyhráno. Bojovala se mnohem vleklejší bitva, boj mezi tradicionalisty, a do toho vstoupily konflikty mezi WG5 a X3J3. Fortran doplácel na to, že na něm mělo zájem příliš mnoho lidí. Podrobné povídání o těchto událostech (v angličtině) lze nalézt v článku Briana Meeka The Fortran Saga Teprve v roce 1991 bylo dobojováno – byl publikován standard informativně známý jako Fortran 90 (FORTRAN 77 se ještě psával velkými písmeny. ISO ale obecně doporučila psát zkratková slova normálně a velkými písmeny jen zkratky jako ASCII, které nejsou slova). Tradicionalisté v určitém smyslu prosadili svou – celý Fortran 77 byl ve Fortranu 90 obsažen. Na druhou stranu si na své docela přišli i revizionisté – Fortran získal spoustu moderních nových vlastností, díky kterým mohl opět chytit dech. Navíc se ukázalo, že je potřeba Fortran pravidelně modernizovat.

Překladače – od teorie k praxi

Odstup třinácti let byl opravdu velký, zvláště v období tak bouřlivého rozvoje programování a s přihlédnutím k tomu, že už Fortran 77 trochu zaostával „za světem“ (vzpomeňme si, že měl být přechodný – namísto toho se stal nejtrvalejším), není divu, že se při dlouhém čekání na nový Fortran mnozí uživatelé odklonili k dynamičtěji se rozvíjejícím jazykům – C, C++, Pascalu. I proto bylo potřeba, aby zpětná kompatibilita byla zachována, jinak by Fortran ztratil ještě další uživatele. Na druhou stranu to samozřejmě znamenalo větší práci pro tvůrce překladačů.

Že však nejde o úkol nikterak nezvladatelný, dokázala firma NAG, která vydala první překladač Fortranu 90 ještě v roce 1991. Práce na něm samozřejmě začaly zřejmě ještě před oficiálním vydáním, podle draftů. Další komerční překladače brzy následovaly. Firmám tak byla cesta k modernímu Fortranu otevřena.

U dynamicky se rozvíjející open source komunity nikdy nebyl Fortran na výsluní popularity. Open source překladač Fortranu 77 pro Unix sice existoval již krátce po jeho vzniku (jako příkaz f77), ale pozdější překladače Fortranu 77 – f2c (překládající do C) a g77 (založený na GNU gcc) vznikly až krátce před Fortranem 90. Zejména akademická komunita open source na dlouhou dobu ztratila o Fortran zájem, zřejmě očekávající jeho brzký zánik. To se nakonec nenaplnilo, a tak po deseti letech z obnoveného zájmu vznikl projekt g95, plánující vytvořit otevřený překladač Fortranu 95. Ani to nešlo tak hladce. Tvůrce projektu, Andy Vaught, nechtěl g95 rovnou zapojit do klasického vývojového schématu GCC a potažmo Open Source. Chtěl, aby bylo g95 oddělené a on měl nad jeho zdrojovým kódem větší kontrolu, což mělo vést k rychlejšímu vývoji překladače. Ostatní s ním ale nesouhlasili, a proto se od projektu g95 oddělil gfortran, který se stal přímo součástí GCC. V jistém smyslu měly obě strany pravdu – samostatný g95 Andyho Vaughta, který jen používá GCC backend, byl v „použitelné“ kvalitě již v roce 2004. gfortran až o dva roky později, ale lépe optimalizující díky lepší vazbě frontendu na gcc backend.

Fortran ve společnosti

Ani na poli technických výpočtů už Fortran není dominantním jazykem. Pomineme-li jazyky velmi vysoké úrovně (např. Octave), tedy spíše výpočtová prostředí, a soustředíme-li se na klasické kompilované jazyky, jsou „svatou trojicí“ na poli výpočtů Fortran, C a C++. Nejvíce kódu je zřejmě stále ve Fortranu, ale velká část z toho jsou „legacy“ kódy ve Fortranu 77, většinou již jen ve stádiu udržování. (Výjimku tvoří např. knihovna LAPACK). S novými kódy je to jiné. V oblasti čistě komerčního software již Fortran téměř vymizel, dominují C a C++. Jsou přeci jen mnohem rozšířenější (bráno ve všech oblastech software), tudíž pro ně existuje více překladačů a pomocných nástrojů, ovládá je více programátorů a manažeři se o nich spíše dozvědí. Moderní Fortran tak navzdory své komerční minulosti „žije“ spíše v akademických a poloakademických prostředích, kde je větší svoboda volby jazyka a nástrojů. Oblíbený je zejména v oblasti meteorologie, fyzikální chemie, částicové fyziky a dalších.

Pokud jde o jazyk C, je moderní Fortran bezpochyby pohodlnějším nástrojem v oblasti numeriky, neboť umí téměř vše, co umí C, a přináší leccos navíc (jsou zde určité zádrhely – viz předchozí díly). I přesto vzniká mnoho numerických knihoven v C. Důvody lze najít přinejmenším tři:

  1. C je standardem pro binární rozhraní a binární rozšíření. Vyrobím-li knihovnu v C, lze k ní dopsat rozhraní pro C++, Python, Octave, Matlab, a navíc i ten Fortran.
  2. C lze lépe „ladit“ než Fortran. Je bližší hardware a jeho sémantika je o něco silnější. Také jej lze snáze kombinovat s assemblerem, což jej činí jazykem volby pro výpočetní „jádra“, například BLAS nebo FFT.
  3. C je známější. Na mnoha univerzitách chybí lidé, kteří by učili moderní Fortran, zatímco C je dostupné téměř všude.

a to v pořadí podle závažnosti.

Je dobře, že si první problém tvůrci Fortranu uvědomují, a řeší jej již ve Fortranu 2003 pomocí „interoperability with C“. Míchat Fortran a C bylo sice možné odjakživa, ale detaily se lišily a možnosti byly dosti omezené. Ve Fortranu 2003 se tyto možnosti sjednotily, standardizovaly a rozšířily, takže je v zásadě možné většinu deklarací v C (a potažmo tedy hlavičkových souborů) „přeložit“ do Fortranu (výjimkou jsou např. uniony, které se ale používají zřídka), a mnohdy je ještě zjednodušit využitím generických rozhraní. Druhý výše uvedený problém tak přestává v podstatě být problémem. Osobně je mi jedno, že všechny klíčové numerické knihovny budou v C, budu-li je moci pohodlně používat z Fortranu. Můžu také vyrobit ve Fortranu knihovnu s C-kompatibilním rozhraním a zajistit tak její širokou použitelnost.

bitcoin_skoleni

Srovnání Fortranu a C++ je trochu jiné, neboť C++ je bezpochyby jazyk nezanedbatelně „mocnější“ než Fortran, zejména Fortran 95. Je také vystavěn na lepších základech, neboť není pochyb, že jazyk C byl důmyslnější a kompaktnější než třeba Fortran 77. Na druhou stranu, C++ není jazyk zaměřený na oblast numeriky a numerické programování podporuje hlavně pomocí knihoven, v jejichž tvorbě je velmi flexibilní. C++ je již nyní jazyk dosti obsáhlý a je velmi nepravděpodobné, že by se do něj dostala nějaká rozšíření použitelná převážně v numerických aplikacích, které tvoří jen malou menšinu všech aplikací C++. Programátoři používající C++ tak budou zřejmě i v budoucnu odkázáni pouze na knihovny. V současnosti nelze najít mnoho důvodů proč přejít z C++ na Fortran (ale ani obráceně). Nejviditelnější výhodu Fortranu, komfortní práci s poli ve stylu Matlabu, lze v C++ do značné míry „nasimulovat“ pomocí knihoven. Některé z nich díky tajemným trikům se šablonami dokonce ani většinou neztrácejí na rychlosti oproti nativní syntaxi Fortranu (uBLAS, Blitz++). Fortranu chybí zejména OOP (dědičnost a polymorfismu), kterýžto nedostatek ale řeší Fortran 2003. Potrvá zřejmě déle, než se Fortran zbaví některých břemen zpětné kompatibility, ale je možné, že C++ podobně jako Fortran doplatí na zainteresovanost příliš mnoha lidí.

Quo vadis?

Myslím si, že jednoznačná volba neexistuje a Fortran v dohledné době oblast numerického programování ani neovládne, ani z ní nevymizí. Fortran je efektivní, pohodlný, dobře dostupný jazyk zaměřený na numerické výpočty a bude se bezpochyby snažit i v budoucnu vycházet trendům a zájmům komunity vstříc. Přestože není vyloučeno, že bude zcela nahrazen nějakým jiným jazykem vytvořeným „z vody“, zřejmě se tak nestane v blízké budoucnosti, a tak bude mít Fortran i po několik následujících budoucností své místo mezi ostatními jazyky. Věřím, že se vám seriál líbil a ukázal vám staronový jazyk v zajímavém světle.

Autor článku