Kontext
Vykonání programu
 Vytisknout studijní materiál

Počítač

Zatím jsme přešli od problému přes algoritmus k programovacím jazykům pro zápis algoritmu ve tvaru programu, který je nebo by měl být srozumitelný lidskému vnímání. Na opačném konci je počítač se svým jazykem. Základní součásti počítače realizující počítání jsou procesor a (hlavní) paměť.

Procesor obsahuje omezenou sadu registrů pro uložení hodnot, nad kterými může bezprostředně vykonávat své operace, např. aritmetické, logické, porovnávání hodnot, přesun hodnot ap., jakož i uložení instrukcí pro tyto operace. V hlavní paměti je uložen program ve strojovém tvaru, jako posloupnost instrukcí, které vykonává procesor a data, s kterými program pracuje. Právě uložení instrukcí i dat fyzicky v jedné paměti je základním rysem von Neumannove architektury počítačů. Procesor a hlavní paměť jsou propojeny sběrnicí, po které jsou postupně přenášeny instrukce a data mezi registry procesoru a hlavní pamětí.

Procesor pracuje tak, že po vykonání instrukce pokračuje vykonáním instrukce, která je uložena v paměti jako následující. Na to, aby mohl realizovat algoritmy, ve kterých jako následující instrukce se vykoná libovolná jiná instrukce programu, sada instrukcí procesoru obsahuje instrukce umožňující odevzdání řízení na vykonávání jiné instrukce než je instrukce následující. Jde o analogii příkazu go to v jazyce počítače a říkáme jim skokové instrukce. Dalším způsobem je volání podprogramu, který opíšeme v kapitole 4.

Kompilace

Prvním způsobem jak vykonat program zapsaný v programovacím jazyce je jeho transformace na posloupnost strojových instrukcí, její uložení do paměti a vykonání. K tomu slouží překladač (kompilátor) a operační systém, co jsou opět programy a plní uvedené činnosti.

Program opakuj10 v jazyce Pascal na obr. vykoná 10 opakování, přičemž opakované operace jsou pro jednoduchost vynechány. Odpovídající strojový program je uveden pod ním. Jeho činnost je zřejmá z komentářů.

Interpretace

Uvedený způsob vyžaduje pro každou hardwarovou platformu napsání nového překladače programovacího jazyka. Alternativní způsob je definování mezijazyka abstraktního stroje a vykonávat překlad programu do tohoto mezijazyka. Vykonání programu potom bude znamenat vykonání příkazů takového jazyka, a protože mezijazyk není obecně vázán na konkrétní hardwarovou platformu, vykonání příkazů mezijazyka se děje programem, který tyto příkazy vykoná na specifickém procesoru. Říkáme, že je interpretuje, a protože má pro mezijazyk funkci stroje, který reálně fyzicky neexistuje, nazýva se virtuální stroj. Pro jazyk Java se tento mezijazyk nazývá bytecode a jeho interpret JVM - Java Virtual Machine. Virtuální stroj, protože abstrahuje od konkrétní hardwarové platfromy, se nemůže spoléhat na existenci registrů nad kterými procesor vykonává operace, a které navíc mívají specifické funkce případně různou velikost. Namísto toho pracuje se zásobníkem.

Zásobník je paměť organizována tak, že vybírat data z ní můžeme jenom v obráceném pořadí než jsme je vkládali a okamžitě je přístupná pouze naposledy vložená hodnota. Pokud hodnoty v zásobníku budeme zapisovat do řádku, potom při psaní zleva doprava, považujme za poslední zapsanou hodnotu tu, která je nejvíce vpravo.

Zápis

5, 6, 4

reprezentuje zásobníkovou paměť, do které jsme nejprve vložili hodnotu 5, potom 6 a naposledy 4. Operace se vykonávají tak, že podle uvedeného pravidla pro vybíraní hodnot se pro danou operaci vybere potřebný počet hodnot operandů a výsledek se vloží do zásobníku.

Pokud by například mezijazyk předepisoval nad uvedeným zásobníkem vykonat sčítání a potom násobení, obsah zásobníku by byl postupně následující

5, 6, 4

5, 10

50

Poznamenejme, že takto by došlo k výpočtu výrazu x*(y+z) zapsaného v programu, pokud by proměnným x,y,z byly přiřazeny hodnoty 5,6,4.

Na obr. je program opakuj10, který jsme si uvedli v jazyce Pascal, přepsán v jazyce Java a současně jeho tvar v bytecodu. První číslo v každém řádku bytecodu se nazývá index a je indexem v poli bytů, ve kterém jsou uloženy instrukce mezikódu označujícím začátek každé instrukce. Jeho činnost je opět zřejmá z komentářů.

Nyní stačí napsat program pro realizaci instrukcí mezijazyka (JVM) pro libovolnou hardwarovou platformu a všechny programy v jazyce Java budou na ní po překladu příkazem java do bytecodu vykonatelné.

Uveďme si ještě jak vypadá v mezijazyce jazyka Java výpočtová metoda Cyklus, jejíž překlad je možná překvapivě jednoduchý, obr..