Obsah
1. Programovací jazyky používané na mainframech
4. Vliv FORTRANu na vývoj překladačů
7. Obsah dalšího pokračování seriálu
1. Programovací jazyky používané na mainframech
Mainframy firmy IBM jsou z hlediska vývoje programovacích jazyků velmi důležité a zajímavé, protože právě na nich vznikaly první implementace vyšších programovacích jazyků, z nichž mnohé se používají, i když s různými inovacemi, dodnes. První aplikace pro mainframy byly programovány přímo ve strojovém kódu, který bylo možné zadávat z řídicího panelu počítače či načítat z externích paměťových médií (děrných štítků, magnetických pásek atd.). Ovšem zapisovat programy přímo ve strojovém kódu je zdlouhavé a pro větší aplikace z mnoha důvodů nepraktické, o čemž se mohli přesvědčit například i studenti programující na československém mikropočítači PMI-80. Z důvodu usnadnění práce programátorů tedy vznikly první utility, jejichž úkolem bylo transformovat programy zapsané pomocí symbolických jmen strojových instrukcí do (binárního) strojového kódu. Těmto programům, jejichž možnosti se postupně vylepšovaly (například přibyla podpora textových maker, řízení víceprůchodového překladu atd.), se začalo říkat assemblery a jazyku pro symbolický zápis programů pak jazyk symbolických instrukcí – assembly language (někdy též zkráceně nazývaný assembler).
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-1-prev.jpg)
Obrázek 1: Československý mikropočítač PMI-80, který ve dvou ohledech připomíná první sálové počítače. Je, podobně jako mainframy, vybaven jednoduchým řídicím panelem, pomocí něhož lze do operační paměti vkládat programy zapisované přímo ve strojovém kódu (hexadecimální kódy instrukcí a operandů), spouštět tyto programy a dokonce je i trasovat a ladit. Tento mikropočítač byl vybaven mikroprocesorem Tesla MHB 8080A (kopie slavného Intelu 8080) taktovaným na 1 MHz, obsahoval 1 kB ROM s tzv. monitorem a 1 kB operační paměti RAM. Namísto výstupu dat na monitor či tiskárnu byl mikropočítač vybaven sedmisegmentovým displejem. Zdroj fotky: Osmibitové muzeum.
2. Vyšší programovací jazyky
„A computer without COBOL and FORTRAN is like a piece of chocolate cake without ketchup or mustard.“
Ovšem ani zápis programů v jazyku symbolických instrukcí nebyl snadný a přehledný, už jen z toho důvodu, že každý procesor mohl mít odlišnou instrukční sadu, což znamenalo, že se při přechodu na jinou platformu muselo provést přeškolení programátorů (nebo vytvoření nového programátorského týmu) a posléze stávající aplikace přepsat. Mnohé zdánlivě snadné operace, například vyčíslení aritmetických výrazů či práce s vektory, maticemi či textovými řetězci, se navíc musely rozepisovat do sekvencí jednodušších strojových instrukcí, které nebyly přehledné tak, jako původní algoritmická konstrukce. Z tohoto důvodu byly, zejména z důvodu jednoduššího zápisu a modifikace programů i kvůli snazší přenositelnosti aplikací na různé platformy, v průběhu padesátých a na začátku šedesátých let minulého století vytvořeny vyšší programovací jazyky, z nichž největší vliv na další vývoj výpočetní techniky měly především FORTRAN, LISP a ALGOL. Tyto programovací jazyky si zevrubně popíšeme v následujících kapitolách.
Vybrané assemblery a překladače vyšších programovacích jazyků dostupné na mainframech IBM 7×x a 70×x:
Jméno | Popis | Podporované systémy |
---|---|---|
SAP | Symbolic Assembly Program | 704 |
IBMAP | assembler for IBSYS/IBJOB | 704, 709 |
FAP | FORTRAN assembly program | 709× |
FORTRAN I | 709× | |
FORTRAN II | 709× | |
FORTRAN IV | S/360 | |
Commercial Translator | predecessor of COBOL | |
COBOL | ||
LISP 1.5 | 704 | |
ALGOL60 | 704 |
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-2-prev.jpg)
Obrázek 2: Ovládací panel mainframu IBM System/360 Model 65.
3. FORTRAN
„Much of my work has come from being lazy. I didn't like writing programs, and so, when I was working on the IBM 701, writing programs for computing missile trajectories, I started work on a programming system to make it easier to write programs.“
John W. Backus, tvůrce FORTRANu
Prvním vyšším programovacím jazykem, na který není možné v souvislosti s mainframy firmy IBM zapomenout, je jazyk FORTRAN neboli plným názvem The IBM Mathematical Formula Translating System, který byl v IBM vytvořen již v roce 1954 týmem vedeným Johnem W. Backusem (jehož příjmení se mj. objevuje i ve zkratkách BNF a EBNF). Jak již plný název FORTRANu napovídá, jedná se o programovací jazyk určený především pro tvorbu aplikací zaměřených na numerické výpočty, podobně jako tomu bylo u vůbec prvního překladače – A-0 vytvořeného již v roce 1952 Grace Hopperem pro sálový počítač UNIVAC I. Z důvodu zaměření na matematické výpočty byl FORTRAN již od svých prvních verzí (určených původně pouze pro mainframe IBM 704) vybaven všemi základními aritmetickými i relačními operátory, možností práce s komplexními čísly, takzvaným aritmetickým IF (variantou podmíněného příkazu IF, v němž je podmínka vyjádřena aritmetickým výrazem, nikoli výrazem pravdivostním), programovou smyčkou typu DO, možností formátování numerických hodnot při jejich tisku atd.
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-3-prev.jpg)
Obrázek 3: Manuál k první verzi FORTRANu určeného pro mainframy IBM 704.
První verze FORTRANu byla vytvořena s ohledem na architekturu sálového počítače IBM 704, což mj. znamenalo zařazení podmínek testujících přetečení akumulátoru při sčítání, ale i specializovaných příkazů, pomocí nichž bylo možné přímo ovládat světelné indikátory na řídicím panelu a naopak číst stav přepínačů na panelu a provádět rozeskoky na základě sepnutí či rozepnutí konkrétního přepínače. Programy psané v prvních verzích FORTRANu se vyznačovaly pevným formátem zápisu zdrojového kódu, ve kterém se muselo dodržovat odsazení jednotlivých programových řádků podle toho, jakou konstrukci daný řádek obsahoval (komentáře například začínaly znakem „C“ v prvním sloupci, cíle skoků celočíselnou hodnotou začínající na prvním až pátém sloupci atd.). Volný způsob zápisu programů, který je používán i v naprosté většině dnešních programovacích jazyků, byl do FORTRANu oficiálně zaveden až v ANSI a ISO normě nazvané Fortran 90 v letech 1991 a 1992. Následuje ilustrační program typu „Hello, world!“ napsaný ve FORTRANu, který používá pevný způsob zápisu. Povšimněte si použití návěští, které se ve FORTRANu používalo jak při zápisu programových smyček, tak i pro adresaci dat:
C JEDNODUCHY PROGRAM TYPU HELLO WORLD PROGRAM HELLO WRITE (*,100) STOP 100 FORMAT ('Hello, world!' /) END
4. Vliv FORTRANu na vývoj překladačů
„The determined Real Programmer can write FORTRAN programs in any language.“
Po uvedení prvního překladače FORTRANu v roce 1956 (tedy celé dva roky po vydání první specifikace) se mnoho vývojářů obávalo, že přechodem z jazyka symbolických instrukcí k vyššímu programovacímu jazyku budou výsledné (přeložené) programy méně efektivní, tj. že budou pro svůj běh vyžadovat více systémových prostředků (strojového času, operační paměti). Z tohoto důvodu se tým Johna W. Backuse při vývoji překladače FORTRANu soustředil na to, aby výsledný překladač prováděl alespoň základní optimalizace generovaného strojového kódu. Výsledek sice nebyl vždy lepší, než ruční práce zdatného programátora, ale cca dvacetinásobné urychlení vývoje přesvědčilo většinu programátorů (či spíše jejich šéfů) o tom, že má smysl větší část aplikací psát ve vyšším programovacím jazyce a pouze časově kritické části dále tvořit v jazyku symbolických instrukcí. Toto rozhodnutí mělo další velký vliv na vývoj překladačů, protože do jejich výzkumu a vývoje jak komerční firmy, tak i mnoho universit vložily velké prostředky.
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-4-prev.jpg)
Obrázek 4: Spolu s rozšiřováním Fortranu z mainframů firmy IBM na další architektury se zvyšovala potřeba standardizace tohoto jazyka. Postupně vzniklo několik norem, například ANSI norma FORTRAN 66, FORTRAN 77, či ANSI/ISO standard Fortran 90 (názvy standardů jsou uvedeny správně – jméno jazyka se skutečně postupem času změnilo z „FORTRAN“ na „Fortran“).
Výsledkem tohoto zvýšeného zájmu o vyšší programovací jazyky byl vznik ucelené teorie překladačů (regulární výrazy, přepisovací gramatiky, reprezentace programu mezikódem, optimalizace generovaného kódu, atd.), který později umožnil rozšíření dalších universálních i specializovaných programovacích jazyků. Některé jazykové konstrukce byly z FORTRANu převzaty i do mnoha dalších programovacích jazyků, například (pěkně podle abecedy) ALGOLu, BASICu či Céčka. Samotný FORTRAN se samozřejmě také vyvíjel – došlo například k odstranění některých problematických konstrukcí (aritmetické IF, počítané GOTO), zavedení volného způsobu zápisu programů, rozšíření imperativního jazyka o možnost rekurzivního volání funkcí, přidání objektů atd. FORTRAN je dodnes používán, což znamená, že se jedná o nejstarší „živý“ vyšší programovací jazyk (na druhém místě se společně nachází LISP a ALGOL).
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-5.png)
Obrázek 5: Ukázka programu napsaného ve FORTRANu II, ve kterém můžeme mj. vidět i použití aritmetického IF.
5. ALGOL
„Here is a language so far ahead of its time that it was not only an improvement on its predecessors but also on nearly all its successors.“
C. A. R. Hoare
Druhým programovacím jazykem, o němž se dnes zmíníme, je jazyk ALGOL (Algorithmic Language). Jedná se o programovací jazyk, který původně vznikl za účelem snadno pochopitelného algoritmického popisu matematických (především numerických) úloh, výuku programování a vývoj překladačů. Z tohoto důvodu například původní návrh jazyka (IAL – International Algorithmic Language, později přejmenovaný na ALGOL 58) neobsahoval žádné konstrukce pro vstup a výstup dat, ovšem se vznikem prvních reálných překladačů se množina konstrukcí jazyka postupně rozrůstala, takže ve standardu ALGOL 68 již jazyk obsahoval jak operace vstupu a výstupu, tak i podporu pro nenumerické úlohy aj. V programovacím jazyce ALGOL byly prakticky poprvé použity konstrukce umožňující strukturované programování – týká se to především programových smyček bez návěští, podmíněných příkazů, blokové struktury programu a též lexikálního rozsahu (viditelnosti) proměnných (tuto vlastnost z ALGOLu převzal i programovací jazyk Scheme, který je v v mnoha jiných ohledech založený na LISPu).
ALGOL se využíval jak pro zápis programů v učebnicích a vědeckých článcích, tak i v každodenní programátorské praxi. V tištěné literatuře se používal poněkud jiný způsob zápisu, protože bylo možné použít typografické zvýraznění jednotlivých prvků jazyka i sadu znaků velké a malé abecedy, zatímco některé mainframy používaly pouze znaky velké abecedy. Jednou ze zajímavostí je, že se tento jazyk (resp. jeden z jeho dialektů) používal i v SSSR, mj. také v projektu raketoplánu Buran (viz odkazy na konci článku). Tato verze jazyka byla dokonce v SSSR standardizována jako GOST 10859. Existuje i čínská verze tohoto jazyka, ve které se namísto znaků z tabulek ASCII či EBDIC používají národní znaky. Programovacím jazykem ALGOL se inspirovali tvůrci mnoha dalších programovacích jazyků. Jedná se například o jazyky Simula, Pascal (i další jazyky navržené N. Wirthem) a v neposlední řadě též trojice na sebe navazujících jazyků BCPL, B a C. Na syntaxi céčka jsou postaveny další jazyky, zejména C++, Java a dokonce dynamicky typovaný JavaScript. Těmto jazykům se proto také někdy říká „algolské“ (Algol-like).
Na následujícím výpisu krátkého programu (jedná se o Bresenhamův algoritmus rasterizace úsečky) si povšimněte, že je celý program snadno pochopitelný i v případě, že jazyk ALGOL neznáte. Mnoho konstrukcí ALGOLu totiž skutečně „zdomácnělo“ i v dalších programovacích jazycích:
PRAGMAT READ "Basic_bitmap_storage.a68" PRAGMAT; line OF class image := (REF IMAGE picture, POINT start, stop, PIXEL color)VOID: BEGIN REAL dx = ABS (x OF stop - x OF start), dy = ABS (y OF stop - y OF start); REAL err; POINT here := start, step := (1, 1); IF x OF start > x OF stop THEN x OF step := -1 FI; IF y OF start > y OF stop THEN y OF step := -1 FI; IF dx > dy THEN err := dx / 2; WHILE x OF here /= x OF stop DO picture[x OF here, y OF here] := color; err -:= dy; IF err < 0 THEN y OF here +:= y OF step; err +:= dx FI; x OF here +:= x OF step OD ELSE err := dy / 2; WHILE y OF here /= y OF stop DO picture[x OF here, y OF here] := color; err -:= dx; IF err < 0 THEN x OF here +:= x OF step; err +:= dy FI; y OF here +:= y OF step OD FI; picture[x OF here, y OF here] := color # ensure dots to be drawn # END # line #;
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-7.jpg)
Obrázek 6: Jedna z populárních dobových učebnic ALGOLU 68.
6. LISP
Posledním programovacím jazykem, u němž se dnes (prozatím jen krátce) zmíníme, je jazyk LISP. Tento jazyk je založen na teoretické práci Johna McCarthyho, který v roce 1960 vydal důležitý článek „Recursive Functions of Symbolic Expressions and Their Computation by Machine“. V tomto článku je popsán matematický aparát založený na Lambda kalkulu, z něhož byl později odvozen programovací jazyk LISP (McCarthy v tomto článku mj. popisuje i funkci eval, jejíž implementací v podstatě vznikne základ interpretru LISPu). Jedná se o jazyk, který je mezi programátory známý především strukturou v něm zapsaných programů, jenž jsou reprezentovány pomocí vnořených seznamů. Vzhledem k tomu, že prvky seznamů jsou uzavřeny do kulatých závorek, bývá v programech vytvářených v LISPu poněkud „přezávorkováno“, což je však v případě použití vhodného editoru (který například dokáže označit párové závorky) spíše malá nepříjemnost, nikoli nepřekonatelný problém:
; Mandelbrotova množina ; Vytvořeno pro Common Lisp ; (ukázka "imperativního" kódu využívajícího smyčky Common Lispu) (loop for y from -1 to 1.1 by 0.1 do (loop for x from -2 to 1 by 0.04 do (let* ((c 126) (z (complex x y)) (a z) ) (loop while (< (abs (setq z (+ (* z z) a))) 2) while (> (decf c) 32) ) (princ (code-char c)) ) ) (format t "~%") )
V LISPu se objevilo několik revolučních prvků, které se teprve až o mnoho let později dostaly i do dalších programovacích jazyků. Jedná se například o automatickou správu paměti (garbage collector), možnost vytváření vlastních programových konstrukcí a operátorů, možnost snadné serializace a deserializace programů (program v LISPu se nijak neliší od dat, které je možné v tomto jazyku zpracovávat, proto také systémy založené na LISPu většinou ukládaly strukturovaná data jako LISPovské programy; obdoba dnešního XML a podobných technologií zde byla nadbytečná), později se objevil i propracovaný systém maker, objektové rozšíření jazyka, překladače LISPu, LISP určený pro masivní paralelní systémy (zde mám na mysli systémy s několika tisíci procesory, nikoli dnešní „čtyřjádra“) atd. Paul Graham dokonce s nadsázkou tvrdí, že celý vývoj programovacích jazyků směřuje směrem od Fortranu k LISPu. Tímto zajímavým a poněkud nedoceněným programovacím jazykem se budeme podrobněji zabývat v některé z dalších částí tohoto seriálu, v níž si popíšeme specializované počítače optimalizované právě na zpracování LISPovských programů (LISP machines).
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-6-prev.png)
Obrázek 7: Manuál k LISPu 1.5 pracujícího na mainframech IBM 70×.
7. Obsah dalšího pokračování seriálu
V následující části seriálu o historii výpočetní techniky se, podobně jako v části dnešní, budeme zabývat popisem programovacích jazyků, které byly používány na mainframech. Zaměříme se především na ty jazyky, které byly specializovány na určitý typ úloh. Jedná se především o COBOL (1959), v němž, i přes jeho úctyhodný věk 50 let, stále programuje cca jeden milion vývojářů a je v něm implementováno 70% transakčních systémů (například i NYSE ve svém burzovním systému používá 800 programů napsaných v COBOLu, které jsou provozovány na mainframech IBM. Právě tyto původní programy v COBOLu způsobily velké obavy z W2K). Dále si popíšeme netradiční, ale pro určité typy úloh velmi expresivní jazyk APL (1960, viz též obrázek pod odstavcem), jazyk určený pro práci s textovými údaji SNOBOL (1962) atd. Nezapomeneme ani na BASIC (1964), který se taktéž na mainframech (a samozřejmě nejen na nich) s relativně velkým úspěchem používal.
![ibm-5](https://i.iinfo.cz/images/38/ibm-5-8-prev.png)
Obrázek 8: Zápis programů (zde jednotlivých matematických funkcí, nikoli větších celků) v jazyku APL připomíná spíše hieroglyfy nežli skutečný programovací jazyk :-), ovšem pro některé typy úloh je tento jazyk pro svoje unikátní vlastnosti využíván dodnes.
8. Literatura
- C.A.R. Hoare: The Emperor's Old Clothes Communications of the ACM, 1981
- IBM: VS BASIC Language, Third edition
- IBM: VS Fortran Application Programming: Language reference
- IBM: IBM System/360 Operating System: ALGOL Language
- B. Randell and L.J. Russell, ALGOL 60 Implementation: The Translation and Use of ALGOL 60 Programs on a Computer. Academic Press, 1964. The design of the Whetstone Compiler.
- E. W, Dijkstra, Algol 60 translation: an algol 60 translator for the x1 and making a translator for algol 60, report MR 35/61. Mathematisch Centrum, Amsterdam, 1961.
- Akin, Ed (2003). Object Oriented Programming via Fortran 90/95 (1st ed.). Cambridge University Press. ISBN 0–521–52408–3.
- Etter, D. M. (1990). Structured FORTRAN 77 for Engineers and Scientists (3rd ed.). The Benjamin/Cummings Publishing Company, Inc.. ISBN 0–8053–0051–1.
- Chapman, Stephen J. (2007). Fortran 95/2003 for Scientists and Engineers (3rd ed.). McGraw-Hill. ISBN 978–0–07–319157–7.
- Chapman, Stephen J. (2003). Fortran 90/95 for Scientists and Engineers (2nd ed.). McGraw-Hill. ISBN 0–07–282575–8.
- Chivers, Ian; Jane Sleightholme (2006). Introduction to Programming with Fortran (1st ed.). Springer. ISBN 1–84628–053–2.
- Ellis, T. M. R.; Ivor R. Phillips, Thomas M. Lahey (1994). Fortran 90 Programming (1st ed.). Addison Wesley. ISBN 0–201–54446–6.
- Kupferschmid, Michael (2002). Classical Fortran: Programming for Engineering and Scientific Applications. Marcel Dekker (CRC Press). ISBN 0–8247–0802–4.
- McCracken, Daniel D. (1961). A Guide to Fortran Programming. Wiley.
- McCracken, Daniel D. (1965). A Guide to Fortran IV Programming. Wiley.
- Metcalf, Michael; John Reid, Malcolm Cohen (2004). Fortran 95/2003 Explained. Oxford University Press. ISBN 0–19–852693–8.
- Nyhoff, Larry; Sanford Leestma (1995). FORTRAN 77 for Engineers and Scientists with an Introduction to Fortran 90 (4th ed.). Prentice Hall. ISBN 0–13–363003-X.
- Martínez Baena, Javier; Ignario Requena Ramos, Nicolás Marín Ruiz (2006). Programación estructurada con Fortran 90/95. Universidad de Granada. ISBN 84–338–3923–3.
9. Odkazy na Internetu
- Paul Graham: Home page
http://paulgraham.com/index.html - Paul Graham: The roots of LISP
http://paulgraham.com/…soflisp.html - Rosetta Code – Category:ALGOL 68
http://rosettacode.org/…y%3AALGOL_68 - Rosetta Code – Category:Fortran
http://rosettacode.org/wiki/Fortran - Rosetta Code – Category:Lisp
http://rosettacode.org/…ategory:Lisp - Algol 68 – 25 Years in the USSR
http://www.computer-museum.ru/…/algol68.htm - IBM 36-bit computers
http://www.36bit.org/ibm/ - Symbolics 36-bit computers
http://www.36bit.org/symbolics/ - IBM System 360/370 Compiler and Historical Documentation
http://www.edelweb.fr/Simula/ - Who Was Who in IBM's Programming Research? Early FORTRAN Days
http://www.trailing-edge.com/…r/PRORES.HTM - How do we tell truths that might hurt?
http://www.cs.utexas.edu/…/EWD498.html - Wikipedia: ALGOL
http://en.wikipedia.org/wiki/ALGOL - Wikipedia: JOVIAL
http://en.wikipedia.org/wiki/JOVIAL - Lambda kalkul
http://cs.wikipedia.org/…ambda_kalkul - Osmibitové muzeum
http://osmi.tarbik.com/ - Tesla PMI-80
http://osmi.tarbik.com/cssr/pmi80.html - PMI-80
http://en.wikipedia.org/wiki/PMI-80 - PMI-80
http://www.old-computers.com/…computer.asp?… - IBM 700/7000 series
http://en.wikipedia.org/…/7000_series - IBM System/360
http://en.wikipedia.org/…M_System/360 - IBM System/370
http://en.wikipedia.org/…M_System/370 - Mainframe family tree and chronology
http://www-03.ibm.com/…ame_FT1.html - 704 Data Processing System
http://www-03.ibm.com/…e_PP704.html - 705 Data Processing System
http://www-03.ibm.com/…e_PP705.html - The IBM 704
http://www.columbia.edu/…ory/704.html - IBM Mainframe album
http://www-03.ibm.com/…e_album.html