Programovací jazyky používané na mainframech

Pavel Tišnovský 8. 12. 2009

V osmé části seriálu o historii výpočetní techniky si řekneme, jaké vyšší programovací jazyky se používaly na mainframech firmy IBM. Jedná se například o FORTRAN dodnes využívaný v oblasti numerických výpočtů a simulací, ALGOL, na němž jsou založeny i jazyky typu C či Java a v mnoha ohledech stále nepřekonaný LISP.

Obsah

1. Programovací jazyky používané na mainframech

2. Vyšší programovací jazyky

3. FORTRAN

4. Vliv FORTRANu na vývoj překladačů

5. ALGOL

6. LISP

7. Obsah dalšího pokračování seriálu

8. Literatura

9. Odkazy na Internetu

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

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

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

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 at­d.). 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

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

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

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 "~%")
)

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 FortranuLISPu. 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

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

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.

widgety

8. Literatura

  1. C.A.R. Hoare: The Emperor's Old Clothes Communications of the ACM, 1981
  2. IBM: VS BASIC Language, Third edition
  3. IBM: VS Fortran Application Programming: Language reference
  4. IBM: IBM System/360 Operating System: ALGOL Language
  5. 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.
  6. 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.
  7. Akin, Ed (2003). Object Oriented Programming via Fortran 90/95 (1st ed.). Cambridge University Press. ISBN 0–521–52408–3.
  8. Etter, D. M. (1990). Structured FORTRAN 77 for Engineers and Scientists (3rd ed.). The Benjamin/Cummings Publishing Company, Inc.. ISBN 0–8053–0051–1.
  9. Chapman, Stephen J. (2007). Fortran 95/2003 for Scientists and Engineers (3rd ed.). McGraw-Hill. ISBN 978–0–07–319157–7.
  10. Chapman, Stephen J. (2003). Fortran 90/95 for Scientists and Engineers (2nd ed.). McGraw-Hill. ISBN 0–07–282575–8.
  11. Chivers, Ian; Jane Sleightholme (2006). Introduction to Programming with Fortran (1st ed.). Springer. ISBN 1–84628–053–2.
  12. Ellis, T. M. R.; Ivor R. Phillips, Thomas M. Lahey (1994). Fortran 90 Programming (1st ed.). Addison Wesley. ISBN 0–201–54446–6.
  13. Kupferschmid, Michael (2002). Classical Fortran: Programming for Engineering and Scientific Applications. Marcel Dekker (CRC Press). ISBN 0–8247–0802–4.
  14. McCracken, Daniel D. (1961). A Guide to Fortran Programming. Wiley.
  15. McCracken, Daniel D. (1965). A Guide to Fortran IV Programming. Wiley.
  16. Metcalf, Michael; John Reid, Malcolm Cohen (2004). Fortran 95/2003 Explained. Oxford University Press. ISBN 0–19–852693–8.
  17. 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.
  18. 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

  1. Paul Graham: Home page
    http://paulgraham.com/index.html
  2. Paul Graham: The roots of LISP
    http://paulgraham.com/…soflisp.html
  3. Rosetta Code – Category:ALGOL 68
    http://rosettacode.org/…y%3AALGOL_68
  4. Rosetta Code – Category:Fortran
    http://rosettacode.org/wiki/Fortran
  5. Rosetta Code – Category:Lisp
    http://rosettacode.org/…ategory:Lisp
  6. Algol 68 – 25 Years in the USSR
    http://www.computer-museum.ru/…/algol68.htm
  7. IBM 36-bit computers
    http://www.36bit.org/ibm/
  8. Symbolics 36-bit computers
    http://www.36bit.org/symbolics/
  9. IBM System 360/370 Compiler and Historical Documentation
     http://www.edelweb.fr/Simula/
  10. Who Was Who in IBM's Programming Research? Early FORTRAN Days
     http://www.trailing-edge.com/…r/PRORES.HTM
  11. How do we tell truths that might hurt?
    http://www.cs.utexas.edu/…/EWD498.html
  12. Wikipedia: ALGOL
    http://en.wikipedia.org/wiki/ALGOL
  13. Wikipedia: JOVIAL
    http://en.wikipedia.org/wiki/JOVIAL
  14. Lambda kalkul
    http://cs.wikipedia.org/…ambda_kalkul
  15. Osmibitové muzeum
    http://osmi.tarbik.com/
  16. Tesla PMI-80
    http://osmi.tarbik.com/cssr/pmi80.html
  17. PMI-80
    http://en.wikipedia.org/wiki/PMI-80
  18. PMI-80
    http://www.old-computers.com/…computer.asp?…
  19. IBM 700/7000 series
    http://en.wikipedia.org/…/7000_series
  20. IBM System/360
    http://en.wikipedia.org/…M_System/360
  21. IBM System/370
    http://en.wikipedia.org/…M_System/370
  22. Mainframe family tree and chronology
    http://www-03.ibm.com/…ame_FT1.html
  23. 704 Data Processing System
    http://www-03.ibm.com/…e_PP704.html
  24. 705 Data Processing System
    http://www-03.ibm.com/…e_PP705.html
  25. The IBM 704
    http://www.columbia.edu/…ory/704.html
  26. IBM Mainframe album
    http://www-03.ibm.com/…e_album.html
Našli jste v článku chybu?
Vitalia.cz: Ošklivá zelenina s 10% slevou? Není to málo?

Ošklivá zelenina s 10% slevou? Není to málo?

Lupa.cz: Jak levné procesory změnily svět?

Jak levné procesory změnily svět?

Vitalia.cz: Když bílkoviny, tak jíme ty nekvalitní

Když bílkoviny, tak jíme ty nekvalitní

Vitalia.cz: Muž, který miluje příliš. Ženám neimponuje

Muž, který miluje příliš. Ženám neimponuje

Lupa.cz: Adblock Plus začal prodávat reklamy

Adblock Plus začal prodávat reklamy

Vitalia.cz: Tahák, jak vyzrát nad zápachem z úst

Tahák, jak vyzrát nad zápachem z úst

DigiZone.cz: Světový pohár v přímém přenosu na ČT

Světový pohár v přímém přenosu na ČT

DigiZone.cz: Parlamentní listy: kde končí PR...

Parlamentní listy: kde končí PR...

DigiZone.cz: Wimbledon na Nova Sport až do 2019

Wimbledon na Nova Sport až do 2019

DigiZone.cz: Technisat připravuje trojici DAB

Technisat připravuje trojici DAB

120na80.cz: Nejsilnější alergeny jsou pryč

Nejsilnější alergeny jsou pryč

DigiZone.cz: DVB-T2 ověřeno: seznam TV zveřejněn

DVB-T2 ověřeno: seznam TV zveřejněn

Lupa.cz: Cimrman má hry na YouTube i vlastní doodle

Cimrman má hry na YouTube i vlastní doodle

120na80.cz: Co je padesátkrát sladší než cukr?

Co je padesátkrát sladší než cukr?

Vitalia.cz: Jak Ondra o astma přišel

Jak Ondra o astma přišel

DigiZone.cz: Nova opět stahuje „milionáře“

Nova opět stahuje „milionáře“

Vitalia.cz: Tesco nabízí desítky tun jídla zdarma

Tesco nabízí desítky tun jídla zdarma

Podnikatel.cz: Nemá dluhy? Zjistíte to na poště

Nemá dluhy? Zjistíte to na poště

Vitalia.cz: Antibakteriální mýdla nepomáhají, spíš škodí

Antibakteriální mýdla nepomáhají, spíš škodí

DigiZone.cz: Numan Two: rozhlasový přijímač s CD

Numan Two: rozhlasový přijímač s CD