Algoritmus a vazba na program
Je důležité si uvědomit, že dosud počítače nejsou schopné zcela samostatného myšlení. Pro provádění výpočtů a obecně zpracování dat je třeba vytvořit jasné postupy - algoritmy zpracování.
1. Algoritmus a vazba na program
1.11. Sestavení programu v návaznosti na algoritmus
Předpokládejme, že jsme již problém formulovali a vytvořili potřebný algoritmus, nebo algoritmy řešící daný problém. Jako další fáze je tzv. kódování, tzn. sestavení programu ve vybraném programovacím jazyce, abychom mohli ve finále obdržet efektivně fungující aplikaci – viz Obrázek 1.

Obrázek 1: Kroky při vytváření aplikace
Kódováním programu se rozumí zápis algoritmu ve vhodném programovacím jazyku. Volba programovacího jazyka je velmi důležitá. Některé programovací jazyky jsou univerzální, jiné jsou vhodné jen pro určitý typ úloh. Vysvětleme si, co znamená programovací jazyk.
Programovací jazyky – obecně
Podstatná většina lidí běžně používá k dorozumívání jazyk. Pokud se nad tímto pojmem zamyslíme, jazyk je souhrn symbolů a pravidel, který podává návod, jak spojovat a obměňovat různé symboly. Jsou v něm stanovena jistá pravidla, která dávají význam jednotlivým symbolům a jejich spojením. Stejné principy jsou použity i u programovacích jazyků. Programovací jazyk (anglicky „Programming Language”) je umělý jazyk, vytvořený pro komunikaci mezi člověkem a počítačem, který slouží k zápisu algoritmů. V tomto umělém jazyce je využíván souhrn jednoznačných pravidel, kterými se řídí formální zápis programu – Syntaxe (anglicky „Syntax“). Sémantika (anglicky „Semantics“) jednoznačně určuje význam programu. Znalost sémantiky programovacího jazyka umožňuje zapsat program tak, že odpovídá požadovanému algoritmu.
V dnešní době existuje velké množství programovacích jazyků, které se liší uživatelskou přívětivostí, bezpečností v programování, tvorbou efektivního kódu i oblastí nasazení. Řada pojmů je však v různých jazycích společná nebo blízká. Znalost jednoho jazyka, stejně jako v případě živých jazyků, ulehčuje studium jiného jazyka.
Programovací jazyk je možné popsat pomocí metajazyků. Metajazyk (anglicky „Meta Language“) je jazyk pro popis jazyka. Metajazyky jsou úspornější a přesnější než popis např. pomocí přirozeného jazyka. Precisní popis jazyka bez nejednoznačností je předpokladem pro úspěšnou tvorbu překladače a správné fungování programů v tomto jazyce vytvořených.
Vývoj programovacích jazyků
Pojďme si něco říci k vývoji programovacích jazyků. Jazyky lze dělit do určitých generací:
1. generace jazyků - Strojově orientované jazyky
Strojově orientované jazyky, nebo také strojový kód - jsou nejnižší programovací jazyky, kde jednotlivé instrukce jsou přeloženy do binární podoby a ty jsou zpracovány mikroprocesorem („Central Processing Unit“ - CPU). Mikroprocesor dokáže vykonat omezené množství elementárních instrukcí (např. modifikaci adres, přičtení, odečtení, vynásobení, vydělení, skoky mezi instrukcemi) uložených jako sekvence bitů obvykle zadaných v hexadecimální (šestnáctkové) soustavě, představujících čísla. Nelze tedy jednoduše sečíst dvě čísla, ale je to proces více instrukcí odkazující se na místa (adresy) v paměti, se kterými pracuje. Tyto kódy jsou velmi obtížně čitelné až skoro nečitelné
2. generace - Strojové jazyky
Strojové jazyky nebo jejich symbolické verze jsou tzv. jazyky symbolických adres nebo asemblery (zkráceně ASM - anglicky „Assembler“). Instrukce mají slovní označení (kód) a odpovídají jedné operaci procesoru. Kódy takových instrukcí se přeloží do strojového kódu a jsou následně zpracovány mikroprocesorem. Programy se v nich vytvářejí dlouho, ale takto vytvořené programy pracují velmi rychle. Programy v nich jsou nestrukturovány a jsou proto špatně srozumitelné člověku.
Zobrazení instrukcí je dáno konstrukcí počítače. Liší se tedy podle typu počítače. Je třeba znát základní princip, rozdělení na operační kód a adresní část instrukce. Program popisuje algoritmus (předpis) zpracování údajů. Je tvořen posloupností instrukcí (u vyšších program. jazyků příkazů). Instrukce je elementární příkaz, který je z pohledu programátora chápán jako dále nedělitelný krok programu. Instrukce je podobně jako data uložena v paměti počítače, kde zabírá určité paměťové místo. Velikost zabraného paměťového místa se nazývá délka instrukce. Instrukce má většinou několik částí (viz Obrázek 2), z nichž některé mohou – podle druhu instrukčního kódu nebo vlastní funkce instrukce – chybět:
- Kód operace (vždy) - jednoznačně specifikuje operaci, která se bude podle dané instrukce provádět. Množina všech instrukcí tvoří tzv. operační kód počítače. Kód instrukce se v assembleru označuje jménem
- Adresní část (může být někdy vynechána) - obsahuje adresy operandů, se kterými se bude provádět operace určená kódem operace např. ADD X, Y ... instrukce pro součet dvou operandů. Adresní část může být jedno, dvou nebo tříadresová podle toho, kde jsou příslušné operace prováděny (střádače, případně další registry). U některých instrukcí může adresní část chybět nebo mohou údaje, uvedené na místě adresy znamenat něco jiného (např. celočíselnou konstantu). Skutečná adresa vzniká sečtením adresní části z instrukce s tzv. indexregistry (jedním nebo více)

Obrázek 2: Zobrazení instrukce
Množina všech instrukcí počítače na nejnižší úrovni se nazývá strojový kód počítače. U vyšších programovacích jazyků se algoritmus popisuje pomocí příkazů, které později překladač (kompilátor) rozloží (kompiluje) do jednotlivých instrukcí, které pak mohou být počítačem provedeny.
Pozn.: Pro ladění se obvykle užívají prohlížeče kódu, které zobrazují instrukce symbolickými jmény.
Jak se pomocí jednoadresových instrukcí zapíše příkaz X = Y + Z?
Použije se speciální buňka v paměti zvaná
střádač (akumulátor) a příkaz se rozdělí na tři instrukce:
- LDA Y ... naplň Y do střádače
- ADD Z ... přičti Z do střádače
- STA X ... ulož střádač do X
3. generace - Vyšší programovací jazyky
Pro ně je charakteristické zavedení operačních, řídících a datových struktur, které zvyšují srozumitelnost a čitelnost vytvořeného programu. Mezi tyto programovací lze zahrnout: Pascal, Fortran, Cobol, Ada, C, Basic, Java atd.
Jazyky 3. generace lze v zásadě rozdělit na 3 kategorie:
- Kompilované jazyky
- Interpretované jazyky
- Jazyk s virtuálním strojem
Kompilované jazyky
Mezi kompilované jazyky patří např. Pascal, Delphi, C, C++ - Program musí být zapsán v programovacím jazyce a uložen do paměti počítače. Této formě programu vytvořené programátorem se říká zdrojový program nebo zdrojový kód (anglicky „Source Code“). Zdrojový kód je pomocí překladače – kompilátoru (anglicky „Compiler“) přeložen do tvaru bližšímu počítači, tj. do strojového kódu, který je spuštěn na mikroprocesoru - viz Obrázek 3.

Program je v tzv. jazyce relativních adres. Během překladu překladač kontroluje syntaktickou správnost programu a při nalezení chyby překlad přeruší a vrátí řízení do editoru programovacího jazyka, který překládaný program zobrazí a promítne do něj na příslušné místo zprávu o nalezené chybě. Programátor musí chybu opravit a znovu spustit překlad. Tento cyklus se opakuje tak dlouho, dokud je v programu nějaká formální (syntaktická) chyba.
Bez chyby přeložený program obsahuje vždy minimálně několik symbolů, které překladač nezná. Mohou to být buď jména proměnných, které programátor zapomněl deklarovat nebo jména standardních podprogramů. Sestavovací program (anglicky „Linker“) předpokládá, že tyto objekty jsou v některé knihovně. Proto knihovny prohledá a nalezne-li podprogram, jehož jméno je shodné s hledaným symbolem, přisestaví ji k programu (po příslušných kontrolách typu). Knihoven je větší počet. Některé jsou prohledávány vždy, některé jen na zvláštní přání uživatele. Nenalezne-li se hledaný symbol v žádné knihovně, jde o zmíněnou deklarační chybu a celý překlad je s příslušným hlášením ukončen.
Na
konci tohoto procesu existuje přeložený, tzv. spustitelný program
uložený v počítači (lze jej spustit příslušným příkazem operačního
systému). Výsledkem sestavení může být i tzv. mapa, která obsahuje adresy
podprogramů a některých proměnných. Pro ladění programu se používají ladící
nástroje (anglicky „Debugger“), které umožňují např. program krokovat po jednotlivých
příkazech, prohlížet a měnit hodnoty proměnných. Celý proces od vytvoření
zdrojového programu programátorem až po uložení spustitelného programu bývá
výrobci softwaru zajištěn dodávkou tzv. programovacího prostředí.
Mezi
výhody kompilovaného jazyka patří: rychlost kompilovaného programu, jednodušší
odladění – hledání chyb ve zdrojovém kódu, nemožnost jednoduché modifikace
kompilovaného kódu bez zdrojového kódu.
Mezi nevýhody kompilovaného
jazyka patří: program je závislý na operačním systému a procesoru,
nelze přenést na jinou platformu, kompilovaný strojový kód nelze editovat,
možné přetečení paměti díky absenci automatické správy paměti.
Interpretované jazyky
Mezi interpretované jazyky patří např. PHP. Programy psané v interpretovaném jazyce lze přenášet
na různé platformy (hardware – procesor, paměti, připojené periferie i software
– operační systém, knihovny, framework, programovací jazyk). Interpret, na
rozdíl od kompilátoru, nepřekládá celý program najednou, ale pouze to, co je při
běhu programu v danou chvíli zapotřebí. Překládá (kompiluje) tedy každý
řádek kódu do strojového kódu a ten vykoná. Po vykonání příkazu výsledek
kompilace zahodí a přechází na nový řádek. Daní tohoto přístupu je vyšší
zatížení procesoru - viz Obrázek 4.

Obrázek 4: Interpretované jazyky
Mezi výhody interpretovaného jazyka patří: přenositelnost, pokud existuje interpret pro platformu, použití automatické správy paměti (anglicky „Garbage Collector“), shodné datové typy, kolekce atd., stabilní běh kompilovaného programu (reflexe – kontrola běhu programu), možnost editace programu za běhu programu.
Mezi nevýhody kompilovaného jazyka patří: odhalení chyby v kódu (chyba odhalena, pokud je spuštěn), pomalý běh programu díky interpretaci, možnost napadení zdrojového kódu (program se šíří ve zdrojovém kódu)
Jazyk s virtuálním strojem
Do jazyků s virtuálním strojem patří např. C#, Java. Tyto jazyky jsou spojením výhod kompilovaného a interpretovaného jazyku. U jazyka C# se zdrojový kód programu nepřeloží do strojového kódu počítače, ale do mezikódu – univerzálního pomocného jazyku označovaného „Common Intermediate Language“ – „CIL“ (má jednodušší instrukční sadu a podporuje objektové programování). Ten se pomocí dalšího interpreteru - u .NET je to „Common Language Runtime“ – „CLR“ - převede do strojového kódu cílového počítače, ale zpravidla až v okamžiku, kdy program spustíme. Virtuální stroj již převedený kód nezahazuje jako u interpretovaných jazyků - viz Obrázek 5.

Obrázek 5: Interpretované jazyky
s virtuálním strojem
To znamená, že na cílovém počítači musí být překladač, který překládá z „CIL“ do strojového kódu. Tento počítač se nazývá je z anglického „Just In Time“ – „JIT“, neboť překládá právě v době, kdy je potřeba). Věc je ale složitější: Na cílovém počítači musí být instalován tzv. virtuální stroj – prostředí „.NET Framework“, které kromě překladačů JIT obsahuje i další součásti potřebné pro běh programů vytvořených v jazyce C#.
Na závěr ještě doplníme, že překladač libovolného programovacího jazyka (i C#) zároveň kontroluje syntaktickou správnost programu, tedy zda je program napsán podle jistých formálních pravidel, která zaručují, že mu počítač rozumí. Syntaktická správnost programu bohužel nezaručuje věcnou správnost programu, tj. nezaručuje, že program bude dělat to, co si přejeme. [3]
Doplňme ještě další výhody, kterými jsou: stabilita provádění kódu, správa paměti, shodné datové typy, přenositelnost kódu mezi programovacími jazyky (C#, Visual Basic, C++), pomalejší start ale vyšší rychlost provádění operací než interpretovaný jazyk (menší než kompilovaný jazyk), malá možnost napadení kódu (špatná čitelnost zdrojového kódu v „CIL“)
Jazyky 4GL a jazyky usnadňující programování
Jsou
specializované na určitou oblast, vyskytují se například při zpracování dat v
databázových systémech. Zahrnují v sobě prostředky pro generaci menu, masek obrazovek,
výstupních sestav apod. Příkazy těchto jazyků vykazují značnou vyjadřovací
sílu. Vývoj aplikací pak probíhá rychleji než u jazyků tzv. 3 generace.
Aplikace ale pracují obvykle pomaleji.