Fortran | |
---|---|
Sémantika | imperativ , paralelní |
Jazyková třída | procedurální , modulární , s prvky objektově orientovaného programování |
Typ provedení | sestaven |
Objevil se v | 1957 |
Autor | John Backus , IBM |
Vývojář | IBM [1] a John Backus [1] |
Přípona souboru | .for .f .f90 .f95 |
Uvolnění | Fortran 2018 (ISO/IEC 1539-1: 2018) (28. listopadu 2018) |
Typový systém | přísný , statický |
Hlavní implementace | GFortran , Open Watcom , Sun Studio , XL Fortran , Intel Fortran |
Dialekty | Vysoce výkonný Fortran |
Byl ovlivněn | Kódování rychlosti [d] |
ovlivnil | ALGOL 68 , BASIC , PL/I |
webová stránka | fortran-lang.org _ |
Mediální soubory na Wikimedia Commons |
Fortran ( angl. Fortran ) je první vysokoúrovňový programovací jazyk , který se dočkal praktického uplatnění, má překladač a prošel dalším vývojem [2] . Vytvořený v letech 1954 až 1957 skupinou programátorů vedených Johnem Backusem v IBM Corporation [3] . Název Fortran je zkratkou FOR mula TRAN slator (překladač vzorců) [4] . Fortran je široce používán především pro vědecké a inženýrské výpočty. Jednou z výhod moderního Fortranu je velké množství programů a knihoven na něm napsaných podprogramů [5] .
Existuje velké množství různých matematických knihoven napsaných ve Fortranu (převážně ve starších verzích jazyka) pro maticovou algebru a řešení soustav lineárních rovnic , knihovny pro řešení diferenciálních rovnic , integrální rovnice a jejich soustavy, aproximaci funkcí , speciální funkce , rychlé Fourierovy transformace , matematická statistika a další matematické disciplíny. Tyto knihovny jsou obvykle dodávány s kompilátorem. Řada takových balíčků byla vytvořena v průběhu desetiletí a jsou stále populární ve vědecké komunitě dodnes, například International Mathematical Subroutine Library (IMSL) [6] [7] .
Většina z těchto knihoven je ve skutečnosti majetkem lidstva: jsou dostupné ve zdrojovém kódu, dobře zdokumentované, odladěné a velmi efektivní.
Moderní Fortran (Fortran 95 a Fortran 2003) získal vlastnosti nezbytné pro efektivní programování pro nové výpočetní architektury; umožňuje aplikovat moderní programovací technologie, zejména generické a modulární programování , OOP , při zachování kontinuity s dřívějšími verzemi. Jedním z hlavních konceptů pro vývoj moderního Fortranu je podpora paralelismu a vektorové operace [8] .
Fortran je vysoce standardizovaný jazyk, takže jej lze snadno přenést na různé platformy. Nové jazykové standardy do značné míry zachovávají kontinuitu se staršími, což umožňuje využívat kódy dříve napsaných programů a upravovat je [8] . Zároveň s tím, jak se jazyk vyvíjí, jsou předem ohlašovány zastaralé konstrukce, které mohou být v budoucnu odstraněny [9] .
Fortran má velkou sadu vestavěných matematických funkcí, podporuje práci s celými, reálnými a komplexními čísly s dvojnásobnou a vysokou přesností (používá se pro binární operace real(10)), má bohatou sadu nástrojů pro práci s poli a externími soubory. Modern Fortran (2003 a novější) má kompletní sadu nástrojů pro práci s daty postav.
Zpočátku nebyly výrazové prostředky jazyka příliš velké, protože Fortran byl prvním jazykem na vysoké úrovni, který byl implementován. Později bylo do Fortranu přidáno mnoho lexikálních konstrukcí, které jsou charakteristické pro strukturální, modulární, zobecněné a objektově orientované programování.
Struktura programů byla původně zaměřena na vstup z děrných štítků a měla řadu vlastností, které byly vhodné pro tento konkrétní případ. Takže od 1. do 5. sloupce byla oblast štítku, 6. sloužil k označení textu jako pokračování předchozího řádku (libovolný znak kromě mezery a "0") a od 7. do 72. skutečný text byl umístěn operátorem nebo komentářem. Sloupce 73 až 80 mohly sloužit pro číslování karet (k obnovení náhodně rozházeného balíčku) nebo pro krátký komentář, překladatel je ignoroval. Pokud se text operátora nevešel do vyhrazeného prostoru (od 7. do 72. sloupce), byl do 6. sloupce dalšího řádku umístěn znak pokračování a poté operátor na něm pokračoval. Nebylo možné umístit dva nebo více operátorů do jednoho řádku (mapy). Když se děrné štítky staly historií, tyto výhody se změnily ve vážné nepříjemnosti.
Proto ke standardu Fortran, počínaje Fortranem 90, při zachování pevného formátu zdrojového textu přibyl volný formát , který nereguluje polohu řádku a umožňuje napsat více než jeden příkaz na řádek. Zavedení volného formátu a moderních metod strukturovaného programování [8] umožnilo vytvořit kód, jehož čitelnost a přehlednost není horší než kód vytvořený pomocí jiných moderních programovacích jazyků, jako je Pascal , C nebo Java . Moderní vývojová prostředí umožňují kombinovat formáty: například rozšířit délku řetězce na volný formát (obvykle 132 znaků), umožňují napsat několik příkazů na řádek, ale zároveň také umožňují zachovat levé odsazení (udělejte levý okraj), což je charakteristické pro starý pevný formát, přičemž ponechává nejvíce vyhrazený sloupec pro chybové značky a formáty, stejně jako sloupec pro pokračování řádku.
Jakousi „vizitkou“ starého Fortranu je obrovské množství štítků, které se používaly v operátorech nepodmíněných skoků GOTO, operátorech smyček, podmíněných operátorech a operátorech popisu vstupu a výstupu formátu FORMAT. Velké množství štítků a prohlášení GOTOčasto ztěžovalo pochopení programů Fortran.
Právě tato negativní zkušenost se stala důvodem, proč v řadě moderních programovacích jazyků (například v jazyce Java ) byly štítky a s nimi spojené operátory nepodmíněných skoků značně upraveny.
Moderní Fortran (zejména počínaje verzí Fortran'90) je však oproštěn od přemíry štítků díky zavedení operátorů jako DO… END DO, DO WHILE, SELECT CASE, konstrukcí IF THEN- ELSEIF THEN- ELSE- END IF, atd. Navíc v moderních jazykových standardech se používají pouze klasické operátor GOTOpoužívaný v mnoha jazycích dodnes. Computed operator GOTO, stejně jako konstrukce ENTRY multiple-entry-to-procedures, byly ze standardu vypuštěny, ačkoli jsou obecně stále podporovány kompilátory.
Ahoj světe!Pevný formát (mezery na řádcích 1 až 6 jsou označeny znaky „␣“):
␣␣␣␣␣␣ TISKNOUT * , 'Ahoj, světe!' ␣␣␣␣␣␣ KONECVolný formát:
tisk * , "Ahoj, světe!" konec Poznámky.Fortran podporuje 5 základních základních vestavěných datových typů: skutečný ( REAL) , komplexní ( COMPLEX) , celé číslo ( INTEGER) se znaménkem nebo bez, booleovský ( LOGICAL) a znak ( CHARACTER) . Je také možné vytvořit odvozené datové typy pomocí TYPE. Od samého počátku vzniku jazyka existovaly 4 datové typy: real, complex, integer a boolean.
Existuje pojem druhu datového typu nebo parametrů typu. To vám umožňuje parametrizovat skutečná a komplexní data (to znamená určit přesnost a rozsah desetinného řádu) a další data, což zvyšuje přenositelnost aplikací.
Pro všechna číselná data jsou definovány obvyklé aritmetické operace a přiřazení a jsou zde vestavěné funkce. Vestavěná funkce může mít jako argument pouze reálné nebo komplexní číslo ( nikoli celé číslo ) .Log(x)x
Pro „jednoduchá“ přesná reálná čísla jsou zpravidla přiděleny 4 bajty ( REAL(4), nebo parametr variace typu KIND=4), „double“ - 8 bajtů. U komplexních čísel se počet bajtů zdvojnásobí.
Celá čísla mohou mít od 1 do 4 bajtů. Moderní kompilátory umožňují programátorovi pracovat s čísly a „čtyřnásobnou“ přesností.
V aritmetických operacích se typ standardně mění z celého čísla na reálné a poté na komplexní číslo nebo pomocí speciální vestavěné numerické funkce. Následující výrazy jsou tedy ekvivalentní ( i je celé číslo): a . Log(i*1.)Log(real(i))
Řetězcová (znaková) data jsou uvedena s délkou v závorkách, buď za atributem type, nebo za názvem řetězce. K určení řetězce v těle programu se používají jednoduché nebo dvojité uvozovky. Položky jsou tedy ekvivalentní: A='It is hot' nebo A="It is hot" . To je užitečné v případech, kdy jsou v samotném řetězci uvozovky: B="It is't hot" .
Pro řetězce existuje vestavěná operace zřetězení (sčítání) řetězců: //. Existuje 17 specializovaných vestavěných funkcí pro znaková data (kromě těch obecných, které zpracovávají všechny typy dat).
Štítky jsou celá čísla, která nemají více než 5 číslic; znaky nejsou povoleny. Štítky se používají v příkazech GO TO, příkazech pro čtení, zápis a formátování, stejně jako při zpracování chyb a výjimek. Kromě štítků má Fortran možnost pojmenovat řídicí struktury (smyčky, logické podmínky, struktury FORALL... END FORALL, WHERE... END WHERE, SELECT CASE... END SELECT, TYPE... END TYPEatd.) a název struktury může obsahovat libovolné znaky povoleno v názvech proměnných.
Vestavěné funkce pro znaková dataPro převod číslo-znak : CHAR(i)a ACHAR(i). Převeďte celé číslo na odpovídající znak operačního systému nebo znak tabulky ASCII .
Pro převod čísel znaků : ICHAR(i)a IACHAR(i). Proveďte zpětné transformace.
Funkce porovnávání řetězců : LGE(A,B), LGT(A,B)a LLE(A,B). LLT(A,B)Výsledek funkcí je "true", pokud délky řetězců ( L(A) a L(B) ), vyjádřené ve znacích ASCII, splňují následující nerovnosti: L(A) L(B), L(A) L(B), L(A) L(B) a L(A) L(B) .
Délkové funkce : LEN(A)a LEN_TRIM(A). První vrátí délku řetězce A (počet znaků), druhý vrátí délku řetězce bez mezer na konci, pokud existují.
Konverzní funkce : TRIM(A), ADJUSTL(A)a ADJUSTR(A), REPEAT(A,N). Funkce TRIM(A)vrátí řetězec A bez koncových mezer. Funkce ADJUSTL(A)a ADJUSTR(A)zarovnávají řetězec (odstraňují mezery) doleva a doprava. Funkce REPEAT(A,N)vrátí N kopií řetězce A.
Funkce vyhledávání řádků: , , . Volitelný parametr back určuje směr hledání: standardně vlevo (for ) vpravo (for ). SCAN(A,B,[back])INDEX(A,B,[back])VERIFY(A,B,[back])back=.false.back=.true.
Funkce SCANurčuje číslo pozice v řetězci A (vlevo nebo vpravo) prvního nalezeného znaku ze seznamu řetězců B . Je-li výsledek záporný, funkce vrátí celé číslo 0. Funkce INDEXurčuje číslo pozice, od které poprvé začíná úplný výskyt řetězce B v řetězci A . Kromě toho lze vyhledávání provádět jak vlevo, tak vpravo, ale číslo pozice se vždy počítá vlevo od začátku řádku. Pokud se vyhledávání nezdaří, funkce vrátí 0. Funkce je VERIFY inverzní k funkci INDEX. Vrací tedy VERIFYčíslo pozice takového znaku v řetězci A , který není v řetězci masky B . Pokud jsou všechny (různé) znaky řetězce A přítomny v řetězci masky B, pak funkce vrátí 0.
Všechny tyto funkce jsou elementární a jejich argumentem může být pole znaků nebo celých čísel. Výsledkem bude odpovídající číselné, znakové nebo logické pole.
Standardy Fortran, počínaje verzí 2003, poskytují schopnost pracovat se znaky Unicode .
Kromě těchto funkcí vám Fortran umožňuje zpracovávat symbolická data pomocí své vestavěné maticové (vektorové) analýzy , což výrazně zvyšuje flexibilitu zpracování symbolických dat.
Ve Fortranu existuje kvůli kompatibilitě s programy napsanými v jazyce C koncept C-string , který je specifikován přidáním znaku za uvozovku: A='This is a C-string'c . Nulový řetězec bude zadán takto: A='\0'c .
Podprogramy ve Fortranu existují již od prvního standardu a stále jsou jedním z hlavních programovacích nástrojů [8] .
Ve Fortranu se volání podprogramů, funkcí a předávání jejich parametrů děje výhradně odkazem (a nikoli hodnotou ). Podprogram tedy může změnit argument, který mu byl předán v hlavním programu, pokud tomu není výslovně zabráněno. Takový mechanismus umožňuje učinit zápis přirozeným při psaní matematických vzorců a zároveň zachovat vysoký výkon při práci s velkými datovými poli [24] .
Fortran podprogramy mohou obsahovat v seznamu parametrů (nazývané formální parametry) a volitelné (volitelné) parametry, nebo nemusí obsahovat žádné parametry.
Jazykový standard umožňuje přetížení procedur a operací prostřednictvím generického rozhraní, které kombinuje různé procedury (každá pracuje například s celými čísly, reálnými čísly, komplexními čísly a znakovými proměnnými) pod jedním (obecným) názvem. V tomto případě stačí odkázat na generický postup v hlavním programu a povaha prováděných operací bude záviset na typu dat nabízených postupu ke zpracování. Podle tohoto principu jsou vytvořeny všechny vestavěné funkce a podprogramy, například COS(x). Přetěžování procedur, funkcí a operátorů (navíc může programátor nabídnout kromě vestavěných i vlastní symboly přetížených operátorů) se týká nejen vestavěných datových typů, ale i typů definovaných programátorem [12] .
Typy podprogramůProcedury se dělí na podprogramy a funkce . Podprogramy jsou pohodlnější, když potřebujete vrátit velké množství heterogenních výsledků; funkce - při vrácení výsledku jednoho typu (včetně pole).
Podprogram je definován operátorem popis Subroutine název_programu (seznam formálních argumentů) , funkce je definována operátorem Function název_funkce (seznam formálních argumentů) .
Podprogram se volá příkazem Call název_podprogramu (seznam aktuálních argumentů) . Funkce se volá jménem, se seznamem skutečných argumentů a bez použití speciálního operátoru.
Počínaje standardem F'90 jsou podporovány rekurzivní procedury (v dřívějších verzích nejsou dostupné kvůli omezené paměti počítače), které vyžadují explicitní specifikátor pro deklaraci recursive. V tomto případě se výsledek funkce musí lišit od názvu samotné funkce.
Čisté procedury a funkce ( pure subroutine [function]) jsou procedury a funkce zavedené standardem F'95, které nemají vedlejší účinky. Čistá funkce musí vracet hodnotu a nesmí měnit žádný ze svých vstupních parametrů a/nebo globálních dat; čistá procedura by měla změnit pouze ty parametry, které jsou explicitně specifikovány jako výsledek (výstup) pomocí atributu intent(outnebo inout)). Možnost vedlejších efektů ve Fortranu (tedy případně možnost změny proměnných v hlavním programu přes podprogram) je vedlejším efektem rychlého způsobu předání na adresu.
Čisté programové jednotky nemohou obsahovat I/O příkazy ( WRITEa READ) k externím souborům a zařízením, včetně klávesnice a obrazovky, ani příkazy pozastavení a zastavení programu.
Všechny vestavěné funkce a podprogramy Fortranu, včetně matematických (kromě těch, které přistupují k operačnímu systému, funkcím data a času a generátorům náhodných čísel) jsou čisté, to znamená, že nevytvářejí vedlejší efekty. Čisté funkce byly zavedeny s cílem zlepšit kulturu programování a zvýšit efektivitu paralelizace algoritmů [25] [9] .
Argumenty podprogramuArgumenty podprogramu mohou být libovolné vestavěné datové typy, včetně polí a jejich sekcí, ukazatelů a typů definovaných programátorem. Argumenty podprogramu mohou být také funkce a další podprogramy, kromě interních podprogramů, operátorských funkcí, generických (generických) procedur (povolena jsou pouze konkrétní jména) a některých dalších vestavěných typů.
Argumenty se dělí na formální a věcné . Argumenty jsou uzavřeny v závorkách za názvem podprogramu a odděleny čárkami. Názvy skutečných a formálních argumentů mohou být stejné.
Formální argumenty jsou argumenty podprogramu (funkce) specifikované v jeho popisu. Pokud podprogram nemá žádné argumenty, závorky lze vynechat. Funkce má závorky, i když neexistují žádné formální argumenty. Formální parametrická procedura se nazývá formální procedura .
Skutečné argumenty jsou argumenty předané podprogramu nebo funkci, které mají být provedeny, když je volána. Funkce bez argumentů se volá s prázdným seznamem v závorkách, podprogram bez závorek.
Formální a skutečné argumenty musí být konzistentní . Typy argumentů a varianty jejich vzhledu musí být stejné, pole musí odpovídat poli (nebo části pole) stejné konfigurace.
Existují pole, která přijímají konfiguraci a velikost jako formální argumenty procedur. Pole přebírající konfiguraci je formální argument pole, který zdědí konfiguraci jeho odpovídajícího skutečného pole. Pro takové pole, když je deklarováno, je nastavena dimenze (shodující se s dimenzí skutečného argumentu pole) a horní hranice jsou vynechány. Ve výchozím nastavení jsou dolní hranice 1, ale lze je nastavit libovolně. Počet a hodnota prvků pole, které přebírá konfiguraci, jsou přesně zděděny ze skutečného argumentu pole. Pole, které nabývá velikosti , je dřívější způsob popisu dědičných polí v nativním jazyce Fortran'77, který je zachován kvůli kompatibilitě. U takových polí se dědí pouze poslední rozměr, jehož horní mez je popsána hvězdičkou ( *). V tomto případě mohou mít formální a skutečné argumenty pole různé rozměry. Pole, která nabývají konfiguraci a velikosti, nemohou být dynamická nebo být ukazateli. Procedury, které dědí pole, musí mít explicitní rozhraní.
Řetězce formálních argumentů mohou také zdědit (převzít) délku z odpovídajícího skutečného argumentu řetězce. Řetězce, které nabývají délky , jsou popsány symbolem *: Character (Len = *) název_řetězce . Při explicitním zadání délky řetězce nemůže být délka formálního argumentu řetězce větší než odpovídající skutečný argument řetězce.
Argumenty jsou poziční a klíčové . Poziční formální a skutečné argumenty jsou vzájemně spojeny v pořadí, v jakém se objevují v seznamu argumentů, který se musí shodovat. Klíčová slova - podle názvu klíče, který odpovídá názvu formálního argumentu. Klíčová slova umožňují rozdělit pořadí argumentů nebo některé z nich přeskočit. Takže pro podprogram s nadpisem SubroutineONE (A, B, C, D) může být volání: CallONE (D= Z , C= Y , B= X , A= W ), kde W, X, Y, Z jsou skutečné argumenty.
Klíčové argumenty vám umožňují mít volitelné argumenty , které lze vynechat. V tomto případě musí mít volitelné argumenty příponu Optional. Pokud je například zadáno Optional C, D , pak lze v tomto případě volat CallJEDNO (B= X , A= W ) .
Procedury s volitelnými parametry musí mít explicitní rozhraní.
Pole jsou ústředním bodem filozofie Fortranu. Všechny jazykové konstrukce, data, programové jednotky, operátory, vestavěné funkce, smyčky byly vytvořeny a jsou vytvořeny pro efektivní zpracování především polí. Fortran, jak se vyvíjí, se řídí principem vyhýbat se co nejvíce podrobnému (prvku po prvku) popisu a zpracování polí. To je zvláště účinné při zpracování vícerozměrných polí (maximální rozměr polí ve standardu F2008 je 15). Tento pohled na pole nebyl běžný u raných verzí jazyka; první prvky zobecněného přístupu k poli se objevily ve FORTRAN77; stále se vyvíjejí.
Pole jsou buď statická nebo dynamická . Dynamické se dělí na umístěné a automatické (vznikají při volání podprogramu). Prvky dvourozměrného pole ve Fortranu jsou uspořádány podle sloupců , nikoli podle řádků, jako například v C. První index pole se tedy mění nejrychleji. Chcete-li tedy efektivně pracovat s poli ve vnořených smyčkách, měli byste indexovat vnitřní smyčky levými indexy a vnější smyčky pravými indexy. Ve výchozím nastavení jsou pole přiřazována, vstup, výstup a inicializace po sloupcích.
do k = 1 , 10 do j = 1 , 20 do i = 1 , 100 arr ( i , j , k ) = 25 ! vpravo brr ( k , j , i ) = 0 ! funkční, ale několikrát pomalejší konec dělat ; konec dělat ; konec udělatPole mohou mít nulovou velikost (včetně případů, kdy spodní mez přesahuje horní). Indexy hranic pole mohou být libovolná celá čísla. Výchozí dolní hranice je 1.
Skutečné , alokovatelné :: ArR (:,:,:) ! deklarace alokovaného dynamického reálného pole Integer , alokovatelné :: ArI (:), ArSI ( 2 , 5 ) ! celočíselná dynamická a statická pole Znak ( 32 ), alokovatelné :: ArC (:), ArC2 ( 20 ) ! dynamické pole řetězců o délce 32 znaků a statické pole řetězců Přidělit ( ArR ( - 74 : 0 , 8 , 1 : 3 ), ArI ( 0 ), ArC ( 1 : - 1 )) ! umístění dynamických polí print * , velikost ( ArR ), velikost ( ArI ), velikost ( ArC ), velikost ( ArSI ) ! 1800 0 0 10 ArC2 ( 17 )( 5 : 27 ) = 'Toto je přiřazení řetězce' ! Číslo řádku 17 se zapíše ␣ ␣ ␣ ␣ Toto je␣ přiřazení␣ řetězce␣ ␣ ␣ ␣ ␣ ... Sekce polí, operátory FORALLa WHEREFortran umožňuje efektivní přiřazení polí bez smyček maskováním přiřazení pomocí operátorů WHEREa FORALL, stejně jako dělení polí a vektorových indexů . Ve všech případech se nejprve vyhodnotí pravá strana celého výrazu (pro všechny indexy pole) a teprve poté se provede přiřazení pro indexy, které vyhovují poli masky. Výpočty pomocí těchto nástrojů umožňují zvýšit výkon a usnadnit kompilátoru výběr částí programu, které lze spustit nezávisle, tedy paralelizovat.
Skutečné :: arr ( I1 : I2 , J1 : J2 , K1 : K2 ), arr1 ( I1 : I2 , J1 : J2 , K1 : K2 ), arr2 ( I1 : I2 , J1 : J2 , K1 : K2 ) Skutečné :: frr ( 100 ), frr1 ( 10 ) / 1 , 2 , 3 , 3 * 4 , 4 * 5 / ! nebo Real :: frr1 ( 10 ) = ( / 1 , 2 , 3 , 4 , 4 , 4 , 5 , 5 , 5 , 5 / ) ... arr = 1. ! přiřazení pole (vestavěné přetížení pro operátor přiřazení) arr1 = Sin ( arr ) + arr ! funkce elementární sin je aplikována na každý prvek pole arr2 ( I1 : I2 : 1 , J1 : J2 : 2 , K2 : K1 : - 4 ) = arr1 ( I1 : I2 : 1 , J1 : J2 : 2 , K2 : K1 : - 4 ) ! přiřazení prvků v krocích 1, 2 a -4 (zpětně) dané trojicí indexů frr = ( / ( J , J = 1 , 100 ) / ) ! přiřazení jednorozměrného pole prostřednictvím kruhového seznamu Forall ( i = I1 : I2 , j = J1 : J2 , k = K1 : K2 , arr ( i , j , k ) > 0. ) brr ( i , j , k ) = Log ( arr ( i , j , k ) )) ! nahrazení cyklů a podmíněných příkazů a konstrukcí. Maskování přiřazení (maska — arr(i,j,k)>0.) Forall ( i = 1 : N , j = 1 : N , k = 1 : N ) crr ( i , j , k ) = Sin ( 0,5 * ( i + j ) - k ) ! rozšíření průřezů Forall ( i = 1 : 100 ) ! Forall konstrukce pro více příkazů přiřazení drr ( i , i ) = 0. ! přístup k diagonále matice err ( i , i , i ) = 1. ! a diagonály trojrozměrného pole End ForallJsou možné méně zřejmé operace:
Celé číslo V ( - 2 : 2 , 1 : 5 ) V = přetvořit ( zdroj = ( / ( i , i = 1 , 25 ) / ), tvar = ( / 5 , 5 / )) ! inicializace pole se sériovými čísly pomocí konstruktoru pole a funkce přetváření print * , V ! Výstup do okna DOS bude proveden řádek po řádku ! 1 2 3 4 5 - 1. sloupec ! 6 7 8 9 10 - 2. ! 11 12 13 14 15 - 3. ! 16 17 18 19 20 - 4. ! 21 22 23 24 25 - 5 V ( 2 , 3 : 4 ) = V ( - 1 : 0 , 1 ) ! Otočte část pole tisk * , V ! Výstup do okna DOS bude proveden řádek po řádku ! 1 2 3 4 5 ! 6 7 8 9 10 ! 11 12 13 14 2 změna ve 3. sloupci 15 na 2 ! 16 17 18 19 3 změna ve 4. sloupci 20 na 3 ! 21 22 23 24 25Možnosti operátora a konstrukce FORALLzavedené standardem F'95 jsou širší než možnosti operátora a konstrukce WHERE, nicméně tato konstrukce vám v některých případech logického větvení umožňuje zjednodušit kód díky přítomnosti alternativy ELSEWHERE, vyhnout se vnořeným podmíněným operátorům a složitým polím masek.
Operátor a konstrukce FORALLumožňuje používat pouze čisté procedury a funkce . Při maskování přiřazení v operátorech WHERE, FORALL, stejně jako ve speciálních vestavěných funkcích pro pole (například SUM), je logická maska pole vypočítána před přiřazením a umožňuje vám nahradit smyčky logickými podmínkami uvnitř nich, čímž se zabrání další práce pro prediktor větve mikroprocesoru .
Vektorový index je celočíselné jednorozměrné pole, jehož hodnoty jsou indexy nějakého jiného pole. Vektorové indexy se používají k vytváření libovolných sekcí vícerozměrných polí a jsou jejich zobecněním. Při použití vektorových indexů byste si měli dávat pozor na opakované hodnoty indexu na levé straně operátoru přiřazení, protože v tomto případě dojde k pokusu o zápis možná různých hodnot do jedné paměťové buňky. Pořadí indexů je libovolné (ačkoli by to nemělo být nadměrně používáno, aby nedošlo ke snížení výkonu).
Celé číslo vi ( 5 ) / 7 , 7 , 7 , 3 , 8 / , vj ( 4 ) / 1 , 2 , 3 , 10 / ! inicializace polí - vektorové indexy Real arr ( 20 , 20 ), brr ( 10 , 10 ) brr = 0. ; arr = 1. ! vektorové indexy mohou být také specifikovány uvnitř pole, které je používá brr (( / 8 , 6 , 2 , 1 , 4 / ), vj ) = arr ( vi , vj ) ! rozměry vektorových indexů se musí shodovat vlevo a vpravo a jejich hodnoty nesmí přesahovat hranice polí, která je používají ! velikost vektorových indexů může být menší než velikost pracovních polí Vestavěné funkce pro poleModerní Fortran má velké množství specializovaných vestavěných funkcí pro práci s numerickými a znakovými poli (kromě obecných metod diskutovaných výše). Argumenty funkcí jsou numerické a/nebo znakové pole pole , maska logického pole (což je například podmínka pole>0 ) a dimenze dim pole pole , které tvoří (pokud je uveden argument dim ) část pole podél jednoho z rozměrů s číslem dim . Pole pole může, pokud není uvedeno jinak, být celé číslo, obsahovat reálná nebo komplexní čísla. Pokud pole masky není zadáno, je jeho hodnota považována za stejně pravdivou. Booleovská maska pole , je-li uvedena, musí mít stejný tvar jako pole nebo skalární hodnotu .TRUE..
Většina funkcí zavedených standardem F'90.
ALL(mask[, dim]) je logická funkce; vrátí "true", pokud jsou všechny prvky masky logického pole pravdivé (spolu s volitelnou dimenzí dim ) a v opačném případě naopak.
ANY(mask[, dim]) je logická funkce; je true, pokud je alespoň jeden prvek masky logického pole pravdivý (spolu s volitelnou dimenzí dim ).
COUNT(mask[, dim]) je celočíselná funkce; výsledek se rovná počtu skutečných prvků pole masky (podél volitelného rozměru dim ).
MAXLOC(array[, mask][, dim]), MINLOC(array[, mask][, dim]),
jsou celočíselné funkce vracející příslušně index maximálního a minimálního prvku (nebo indexy maximálního a minimálního prvku) podél volitelné dimenze dim pro prvky, které splňují pole masky. Funkce vrátí index prvního prvku v poli pole . Pokud není zadán argument funkce dim nebo pokud je pole jednorozměrné pole, pak se výsledek zapíše do jednorozměrného pole.
U vícerozměrných polí pole je výsledek zapsán do pole s hodnocením o jedna menším, než je hodnocení pole pole ( dim je vyloučeno ).
Hodnoty indexu se počítají v pořadí od spodních hranic pole. To znamená, že pokud se číslo dolní hranice pole pole liší od jedné, pak pro přístup k maximálnímu nebo minimálnímu prvku pole je třeba k výsledku funkcí přidat MAXLOCrozdíl MINLOCmezi indexem dolní hranice a jedním .
MAXVAL(array[, mask][, dim]), MINVAL(array[, mask][, dim]) — vyhledávací funkce pro maximální a minimální prvek v poli pole pro prvky, které splňují masku pole logické masky podél volitelné dimenze dim . Výsledkem funkce je stejný typ a rozmanitost jako pole . Pole pole může být pouze reálné nebo celé číslo.
V případě jednorozměrného pole nebo pokud neexistuje žádný argument dim , je výsledkem skalární; v opačném případě pole s hodností o jednu menší než hodností pole .
FINDLOC(array, value[, dim][, mask]) je celočíselná funkce, která vrací index prvku pole rovný hodnotě . Zavedeno standardem F2008. Hledané prvky pole splňují masku pole logické masky podél volitelné dimenze dim . Typ argumentu value musí odpovídat typu pole a může to být jakýkoli vestavěný typ (včetně komplexního, booleovského nebo znakového). Zbývající vlastnosti funkce jsou podobné vlastnostem funkcí a . MAXLOCMINLOC
Počínaje standardem F2003 fungují funkce MAXLOCa MINLOC, stejně jako funkce FINDLOC, také se znakovými daty.
SUM(array[, mask][, dim])a PRODUCT(array[, mask][, dim])provést, v tomto pořadí, sčítání a násobení prvků pole. Význam argumentů funkce je SUMstejný PRODUCTjako u výše uvedených funkcí.
Funkce PRODUCTpracuje s komplexními daty počínaje standardem F2003.
DOT_PRODUCT(vector_1, vector_2)provádí vnitřní součin podle pravidel lineární algebry vektorů vector_1 a vector_2 (jednorozměrná pole) stejné velikosti. Jednorozměrná pole vector_1 a vector_2 mohou obsahovat data libovolného numerického a booleovského typu. Vektory vector_1 a vector_2 mohou být buď číselné, nebo oba booleovské.
MATMUL(matrix_a, matrix_b) - vestavěná funkce násobení matic. Násobí dvě matice, matici vektorem, vektor maticí podle pravidel lineární algebry. Argumenty funkcí matrix_a a matrix_b jsou dvourozměrná nebo jednorozměrná numerická (jakýchkoli vestavěných numerických typů) nebo logická pole. Argumenty funkce nemohou být dva vektory současně: jeden z argumentů musí být matice (dvourozměrné pole). Počet prvků v prvním (nebo jediném) rozměru pole matice_b se musí rovnat počtu prvků v posledním rozměru pole matice_a . Zavedeno standardem F'90.
V některých případech při výpočtu součinu sloupcového vektoru řádkovým vektorem, který vyžaduje MATMULdodatečnou transformaci vektorů na matice tvaru (/m,1/)a při použití funkce (/1,n/), je účinnost MATMULpodle Bartenieva [12] znatelně nižší než konvenční vnořená smyčka.
Podle testů NASA [26] pro součin matic (dvourozměrná pole) výkon MATMULkompilátoru Intel při použití plné optimalizace -O3 výrazně (v některých případech až řádově) převyšuje výkon vnořených smyček. , ačkoli pro matice o velikosti ~1000 × 1000 a větší je poněkud horší než výkonové podprogramy DGEMM knihovny LAPAK . Zároveň pro matice ~100×100 a méně MATMULpřekonává DGEMM z hlediska rychlosti. Kompilátor IBM Fortran, počínaje verzí F'90, používá složitě algoritmus MATMUL Winograd-Strassen [27] . Všimněte si, že algoritmické implementace matematických funkcí nejsou obvykle specifikovány standardem a zůstávají na uvážení vývojáře kompilátoru.
MERGE(t_source, f_source, mask) — funkce, která vytvoří nové pole pod kontrolou masky pole masky z prvků polí t_source a f_source stejného tvaru a velikosti jako původní pole. Pole argumentů a pole výsledků mohou být libovolného vestavěného typu a mohou se shodovat v datovém typu, velikosti a tvaru.
Pokud má prvek masky hodnotu true ( .ТRUE.), pak se odpovídající prvek pole výsledků rovná odpovídajícímu prvku pole t_source ; if false ( .FALSE.) — pak na prvek pole f_source .
Argumenty funkce mohou být skaláry; v tomto případě například MERGE(a,0,c>=0)=a· Θ(с) , kde Θ(с) je celé číslo Heavisideova funkce .
MOVE_ALLOC(from, to) je vestavěný podprogram, který vám umožňuje dynamicky znovu alokovat dříve přidělené dynamické pole s novými hranicemi a velikostí, jako je dynamické pole z . Data z pole from se zkopírují do pole to . Datový typ a pořadí polí od a do se musí shodovat. Po opětovném přidělení pole to se pole from uvolní a stane se nepřiděleným. Může být užitečný v numerických metodách s různou diskretizací problému ( multigridové a adaptivní metody).
Zaveden standardem F2003.
TRANSPOSE(matrix) je funkce, která transponuje (zaměňuje řádky a sloupce) dvourozměrnou matici.
Moderní Fortran poskytuje vestavěné funkce pro sbalení a rozbalení vícerozměrného pole do jednorozměrného pole (a z jednorozměrného pole, v tomto pořadí) pod kontrolou logické podmínky pro zlepšení výkonu a úsporu paměti.
PACK(array, mask [, vector]) - funkce; sbalí vícerozměrné pole libovolného typu pole do jednorozměrného vektorového pole řízeného maskou logického pole . Volitelné jednorozměrné pole vector musí být stejného datového typu jako pole a počet prvků ve vektoru , pokud je zadán, musí být alespoň tolik, kolik je skutečných prvků v masce . Pokud je maska skalární s hodnotou , pak počet prvků ve vektorovém.TRUE. poli , pokud je zadán, musí být alespoň tak velký jako celkový počet prvků v poli .
Výsledkem funkce bude jednorozměrné pole stejného typu jako pole . Délka výsledku se bude rovnat délce vector , pokud je uvedena jedna; pokud ne, pak počet skutečných prvků v poli masky . Pokud vektor není zadán a maska je skalární s hodnotou true , pak se délka výsledného jednorozměrného vektoru rovná počtu prvků v poli .
Výsledné pole je postupně vyplněno prvky pole ( v pořadí, v jakém jsou umístěny v paměti počítače), které splňují skutečné hodnoty pole masky . V tomto případě, pokud je zadán vektor , chybějící (možná) prvky ve výsledném poli se vyberou z něj a počínaje indexem následujícím za posledním skutečným prvkem pole v pořadí .
Takže pro pole bude
výsledkem funkce jednorozměrné pole . Pokud je navíc zadán vektor , bude výsledkem .
PACK(A, mask=A.NE.0)PACK(A, mask=A.NE.0, V)
Fortran má bohaté vestavěné nástroje pro vstupně-výstupní operace, včetně velkých datových polí. Soubory ve Fortranu jsou interní a externí.
Interní soubor je jakékoli pole, znakový řetězec nebo podřetězec. Interní soubory jsou ve výchozím nastavení vždy otevřené. Externí soubor je jakýkoli soubor, který je externí vůči spouštěnému programu.
Oba typy souborů používají stejné operátory zápisu WRITEa čtení READ. Interní soubory se používají pro převod čísel-řetězců-čísel a pro vytváření smíšených číselných a znakových záznamů.
Řetězec znaků ( 15 ) Skutečné :: xyz =- 12 3,456 Integer intg Napište ( řetězec , * ) xyz ! Napište číslo -123,456 do řetězce Tisk * , 'string=' , řetězec ! řetězec=␣ -123,4560␣ ␣ Přečíst ( string , '(I6)' ) intg ! Čtení celého čísla z řetězce Print * , 'intg=' , intg ! intg=␣ -123 !...Externí soubory jsou dále rozděleny na formátované (textové, CR- a LF-streamy), binární (binární), přímo zobrazující RAM a neformátované (nebinární). Kromě toho to mohou být soubory s přímým a sekvenčním přístupem se záznamy s pevnou a proměnnou délkou (proměnné pouze pro sekvenční soubory), stejně jako segmentované záznamy (pro velmi velké neformátované sekvenční soubory). Fortran vám tedy umožňuje vytvářet a zpracovávat poměrně velké množství typů souborů - 15 způsobů uspořádání. Maximální velikost jednoho záznamu je 2,14 bajtů.
Soubory s přímým přístupem umožňují provádět I/O operace se záznamy s daným číslem (bez přepisování vyšších nebo nižších položek v souboru).
Při otevírání sekvenčního souboru jej lze umístit na začátek, na konec (před zápisem „konec souboru“), což umožňuje přidávat data tak, jak se hromadí, aniž by se přepisovala dříve zadaná, stejně jako buď na začátek, resp. na konci, v závislosti na dříve definovaném stavu souboru (byl předtím otevřen nebo ne).
V moderních jazykových standardech (počínaje Fortran'90 nebo Fortran'95) je možné pracovat se třemi typy dynamických polí (automatická, alokovaná a referenční pole), ukazatele , odkazy ; jsou zde zabudované procedury pro přímou práci s pamětí a procedury pro bitové operace.
Jazykové standardy předpokládají automatické uvolnění paměti RAM obsazené jakýmkoliv typem dynamického pole po dokončení programu nebo podprogramu (procedury, funkce), i když uvolnění nebylo provedeno explicitně programátorem. To vám umožňuje vyhnout se únikům paměti při práci s dynamickými poli pomocí Fortranu (při použití ukazatelů a v jiných případech jsou možné úniky) neopatrným programováním [12] .
Automatická pole (umístěná kompilátorem) se vytvářejí při volání podprogramu a jsou jeho lokálními objekty. Jejich hranice jsou definovány pokaždé, když je procedura vyvolána; zároveň, když ji opustíte, jsou zničeny a paměť je vymazána. Automatická pole jsou na zásobníku během provádění programu , alokována (pomocí operátoru ALLOCATE) - na haldě [25] .
Fortran pointery jsou podobné C pointerům [12] , nicméně při řešení výpočetních problémů a vývoji matematických algoritmů jsou ve většině případů úspěšně nahrazeny jinými Fortran nástroji.
Počínaje standardem F'90 se konstrukce podmíněné větve IF THEN - ELSEIF THEN - END IFneliší od podobných konstrukcí v jiných moderních jazycích a nahradila tzv. "aritmetický" IFs popisky, zastaralý [9] . Existuje také jednodušší forma podmíněného operátoru: , kde spustitelný operátor musí být jediný po operátoru , například . IF(логическое условие) операторIFGoto метка
Konstrukt volby SELECT CASE - CASE - CASE DEFAULT - END SELECT, se naopak liší od konstrukce SWITCH - CASEv jazycích podobných C [28] , jazyce Java [29] [30] a svými schopnostmi se poněkud podobá operátoru CASEv Pascalu [31] . .
Celé číslo N ( 74 ) ! select expression je celočíselný, logický, znakový výraz, popř ... ! celočíselné pole nebo pole znaků s libovolným nenulovým počtem prvků nameSC : Vyberte případ ( N ( i )) ! nameSC — název konstrukce, N(i) — prvek pole Případ (: - 5 ) ! se provádí pro všechny N(i) menší nebo rovné -5 s krokem +1 ! Blok 1 Případ ( - 3 , - 1 , 0 , 2 ) ! pro proměnnou N(i) rovnou -3, -1, 0, 2 ! Blok 2 Případ ( 50 : 100 ) ! pro N(i) v rozsahu od 50 do 100 včetně (krok +1) ! Blok 3 Případ ( 400 ) ! pro N(i)=400 ! Blok 4 Případ ( 1 , 20 : 30 , 35 ) ! pro N(i)=1, N(i) v rozsahu od 20 do 30 včetně a N(i)=35 ! Blok 5 Výchozí případ ! pro všechny ostatní situace. Case Default – volitelný, volitelný příkaz ! Výchozí blok Konec Vyberte jménoSCPokud se hodnota proměnné N, nazývaná výraz výběru, shoduje se seznamem selektorů (seznamem hodnot nebo rozsahem) v libovolném příkazu CASE, například ve třetím pro N=70 , pak po provedení odpovídajícího bloku příkazů Blok-3 se konstrukce ukončí SELECT CASE[12] [25] a příkazy přerušení (jako BREAK) nejsou vyžadovány . Operátor CASE DEFAULT, stejně jako název konstruktu, nejsou nutné. Rozsahy v seznamech selektorů různých operátorů CASEse nesmí překrývat nebo mít alespoň jeden společný prvek.
Výraz volby (N) může být prvkem celočíselného pole.
Rozsahy v seznamech voličů se vztahují pouze na celá čísla nebo znaky, ve vzestupném pořadí zdola nahoru; pro znaky - ve vzestupném pořadí jejich kódů .
V moderním Fortranu existují dvě formy smyček s iteračním čítačem: tradiční konstrukce DOa ENDDOznačená smyčka. Poslední jmenovaný byl uznán jako zastaralý design od standardu F'90, ale je stále součástí norem. Pro vnořené smyčky s větším počtem vnoření může být poslední formulář stručnější:
! Syntaxe zastaralé smyčkové konstrukce do 1 k = 1 , 10 ! 1 je konec smyčky do 1 j = 1 , 20 ! štítek může být stejný pro vnořené smyčky do 1 i = 1,100 _ _ arr ( i , j , k ) = 25 1 Pokračovat ! štítek se může objevit pouze před jakýmkoli operátorem L1 : do k = 1 , 10 ! moderní notace však umožňuje pojmenovat cykly, L2 : do j = 1 , 20 ! což více odpovídá konceptu strukturovaného programování L3 : do i = 1,100 ! _ _ a usnadňuje to vyhnout se chybám arr ( i , j , k ) = 25 konec do L3 konec do L2 konec do L1Záhlaví smyčky s počítadlem má následující úplný tvar:
jméno : DO I = N1 , N2 , dN ! jméno konstrukce je nepovinné ... ! N1 je počáteční hodnota čítače, N2 je konečná hodnota, dN je krok (parametry smyčky) END DO name ! Parametry smyčky jsou celá čísla libovolného znaménka. dN je nenulové.Počet provedení těla smyčky bez přerušení je N c = max( int((N 2 -N 1 + dN)/dN), 0 ) a může se rovnat nule.
Smyčka se například provede nulakrát, pokud N 2 <N 1 a krok je kladný: dN>0 . Pokud je krok záporný, dN<0, pak cyklus proběhne v opačném pořadí, přičemž pro dokončení cyklu je nutné, aby N 2 <N 1 . Pokud je krok dN vynechán, pak je standardně považován za rovný jedné: dN=1 .
Hodnota proměnné smyčky I po jejím opuštění je vždy rovna N s +1 , tj . o jednu větší než počet iterací smyčky a ne menší než o jednu: I≥1.
Je také možné mít podmíněnou smyčku - a nekonečnou smyčku - , které mají standardní tvar. DO WHILE(логическое условие)END DODOEND DO
Operátor CYCLE имя циклаpřeruší aktuální iteraci smyčky a pokračuje k další iteraci stejné smyčky. Pokud není zadán název smyčky, je iterace aktuální smyčky (ve které se operátor nachází CYCLE) přerušena.
Operátor EXIT имя циклаpřeruší provádění smyčky se zadaným názvem a předá řízení dále, a pokud není žádné jméno, přeruší aktuální smyčku (ve které je operátor vnořen EXIT).
Operátory CYCLEa jsou EXITlogicky totožné s operátorem GOTO(za vhodných okolností), ale programátorovi značně usnadňují pochopení a údržbu.
Od počátečního vývoje jazyka byly kompilátory Fortran vyráběny společností IBM. V současné době IBM dodává optimalizační kompilátor VS Fortran [32] pro sálové počítače IBM System z , jehož historie vývoje různých verzí sahá až do roku 1964, a také kompilátor XL Fortran [33] pro platformy založené na architektuře PowerPC - AIX , Linux a superpočítač Blue Gene (existovala i verze pro Mac OS X , kdy počítače Macintosh používaly procesory PowerPC). Oba tyto kompilátory obsahují velmi sofistikované optimalizátory, které jsou výsledkem půlstoletí nepřetržité vědecké práce specialistů IBM. Na základě kompilátoru IBM Fortran XL Absoft, obchodní partner IBM, vytvořil a dodává kompilátor Absoft Pro Fortran pro systémy založené na procesorech PowerPC (Linux, Mac OS X) a Intel (Linux, Mac OS X, Windows). [34] .
Až do roku 1997 byla společnost Microsoft Corporation hlavním výrobcem kompilátoru Fortran pro operační systém Windows . Následně od jejich vývoje upustila kvůli nízké ziskovosti. Překladač poté dodala společnost DEC , která se v roce 1998 stala součástí Compaq a spolu s ní se v roce 2002 sloučila s HP . Tato verze kompilátoru byla dále vyvinuta společností Intel a kompilátor se nazývá Intel Fortran Compiler , který umožňuje optimalizovat kód pro platformy Intel IA-32, x86_64 a IA-64.
DEC poskytuje kompilátor integrovaný do vývojového prostředí Digital Visual Fortran založeného na Microsoft Visual Studio . Nejznámějšími produkty této řady jsou FPS 4.0 (Microsoft Fortran Power Station), DVF 5.0 a 6.0. Každý kompilátor může podporovat více standardů Fortran. Fúze způsobily, že se na trhu objevily další produkty pod značkami Compaq a HP. HP aktuálně prodává vývojové prostředí verze 6.6 pro Intel/win32. Podpora Fortran je také implementována pro všechny vysoce výkonné platformy HP.
Dalším významným dodavatelem vývojových systémů Fortran je společnost Lahey , která nabízí integrovaná řešení pro Windows a Linux.
Dlouhou dobu byl za nejlepší kompilátor Fortranu pro PC považován kompilátor Watcom , který byl rozdělen do samostatného projektu Open Watcom , který kompilátor vyvíjí na otevřené bázi.
Mezi bezplatnými kompilátory Fortran je třeba vyzdvihnout kompilátor od bývalé Sun Microsystems (nyní Oracle), který je součástí Sun Studio , který generuje efektivní kód pod SPARC , x86 a x86-64 [35] a je dostupný pro Solaris , OpenSolaris a GNU/Linux .
GNU Free Software Foundation vydala kompilátor g77 Fortran 77, který je open source a je dostupný pro téměř jakoukoli platformu a je plně kompatibilní s GCC . Nyní jej nahradil kompilátor GFortran , který implementuje téměř všechny konstrukce standardu Fortran-95 a mnoho konstrukcí standardů Fortran-2003, Fortran-2008 a Fortran-2018. Je také plně zpětně kompatibilní s Fortran-77. Existuje také nezávislý projekt g95 na vytvoření kompilátoru Fortran-95 založeného na GCC .
Mnoho programovacích systémů umožňuje propojit objektové soubory získané jako výsledek překladu programu Fortran s objektovými soubory získanými z kompilátorů z jiných jazyků, což umožňuje vytvářet flexibilnější a multifunkční aplikace. Pro jazyk Fortran je k dispozici také velké množství knihoven obsahujících jak rutiny pro řešení klasických výpočetních problémů ( LAPACK , IMSL , BLAS ), úlohy pro organizaci distribuovaných výpočtů ( MPI , PVM ), tak úlohy pro tvorbu grafických rozhraní ( Quickwin , FORTRAN / TK ) nebo přístup k DBMS ( Oracle ).
Fortran se objevil v SSSR později než na Západě, protože nejprve v SSSR byl Algol považován za slibnější jazyk . Důležitou roli při zavedení Fortranu sehrála komunikace sovětských fyziků s jejich kolegy z CERNu , kde se v 60. letech téměř všechny výpočty prováděly pomocí programů Fortran [36] .
První sovětský kompilátor Fortranu byl vytvořen v roce 1967 pro stroj Minsk-2 , ale velké slávy se nedočkal. Široké zavedení Fortranu začalo po vytvoření kompilátoru FORTRAN-DUBNA v roce 1968 pro stroj BESM-6 . Fortran je hlavní jazyk pro počítače ASVT a SM , často používaný spolu s preprocesorem RATFOR . Počítače ES , které se objevily v roce 1972 , již zpočátku měly překladač Fortran („vypůjčený“ od IBM/360 spolu s dalším softwarem).
V 70. letech IPM vyvinula grafickou knihovnu GRAFOR („Graphic Extension of FORtran“) [37] .
Na konci 80. a na začátku 90. let vytvořil fyzik Andrej Zaretskij sérii dětských knih, jejichž jednou z hlavních postav byl profesor Fortran , který dětem v přístupném jazyce vysvětlil základy počítačové gramotnosti a programování [38] [39]. .
![]() | ||||
---|---|---|---|---|
Tematické stránky | ||||
Slovníky a encyklopedie | ||||
|
Programovací jazyky | |
---|---|
|