Fortran

programovací jazyk

Fortran (akronymická zkratkaanglické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.

Fortran
Paradigmamultiparadigmatický: strukturovaný, imperativní (procedurální, objektově orientovaný), generický
Vznikroce 1957
AutorJohn Backus
VývojářJohn Backus a IBM
Poslední verzeFortran 2008 (ISO/IEC 1539-1:2010) (2010)
Hlavní implementaceAbsoft, 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 jazykySpeedcoding
Ovlivnil jazykyALGOL 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

editovat
 
Sálový počítač IBM 704 v národní laboratoři Lawrence Livermore (LLNL)
 
Kód jazyku Fortran na děrném štítku, je na něm vidět využití vyhrazených, speciálních sloupců 1–6 a 73–80

Vý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

editovat

Tento 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

editovat

Program 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

editovat
C
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

editovat

Na 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

editovat

Fortran 2008

editovat

Zatí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:

Přenositelnost

editovat

Př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