O čem si budeme povídat?
Uvedeme si počítačovou terminologii, zmíníme se trochu o historii a stručn> se podíváme na strukturu počítačového programu.
Počítačové programování spočívá v um>ní donutit počítač, aby d>lal to, co chcete aby d>lal.
Na nejjednodušší úrovni to znamená předat počítači posloupnost příkazů, které vedou k dosažení cíle. Uživatelé systému MS DOS byli zvyklí vytvářet textové soubory, do kterých zapisovali seznamy příkazů, jako takzvané BAT soubory (dávkové soubory). Ty jednoduše předepisují zpracování posloupnosti příkazů jako jednu dávku (anglicky batch [beč]), odtud jejich název. Dávkové soubory můžete používat i v současném prostředí Microsoft Windows, ale v praxi se s tím setkáte zřídka[1].
Dejme tomu že vytváříte dokument (jako je tato učebnice), který se
skládá z mnoha samostatných souborů s příponou HTM. Pokaždé, když uložíte
novou verzi souboru, může váš textový editor uchovávat záložní kopii souboru
s původním obsahem (anglicky backup [bek ap], odtud BAK). Dejme tomu, že na
konci vašeho celodenního snažení chcete aktuální verzi dokumentu (všechny
soubory v nejnov>jší podob>) uložit do adresáře, který se jmenuje
ZALOHA. Nakonec chcete uklidit a smazat všechny záložní soubory
(BAK), abyste zítra mohli začít od čistého stolu. Jednoduchý
dávkový soubor, který toto vše zajistí, by mohl vypadat takto:
COPY *.HTM ZALOHA DEL *.BAK
Pokud byste soubor nazvali ULOZIT.BAT, pak byste na konci
každého dne jednoduše na příkazový řádek systému DOS napsali příkaz
ULOZIT. Nové soubory by se uložily a starší záložní soubory by
se smazaly. A práv> toto je program.
Poznámka: Uživatelé systému Linux nebo jiných operačních systémů znají své verze podobných souborů jako shell skripty. Shell skripty v systému Unix jsou mnohem mocn>jší, než dávkové soubory systému MS DOS. Podporují v>tšinu programovacích technik, které budeme probírat v této učebnici.
Pokud vás předchozí text znepokojil, nem>jte obavy. Počítačový program je jednoduše sada instrukcí, která počítači říká, jak provést určitý úkol. Je to jako kuchařský recept: sada instrukcí, která kuchaři říká, jak připravit určité jídlo. Popisuje ingredience (data) a poloupnost kroků (proces), které jsou potřebné k tomu, aby se ingredience zm>nily na dort nebo cokoliv jiného. Programy se tomu velmi podobají.
Tak jako používáte určitý jazyk, když mluvíte s kamarádem, musíte n>jaký jazyk použít se i při hovoru s počítačem. Jediný jazyk, kterému počítač rozumí, se nazývá binární. Vyskytuje se v n>kolika odlišných dialektech — to je důvod proč onen skv>lý program pro iMac nepob>ží na vašem PC a naopak. Binární jazyk se nanešt>stí lidem obtížn> čte a obtížný je i z hlediska přímého zápisu. Proto musíme používat nám bližší počítačový jazyk, který si necháme přeložit do binární podoby. Je to jako kdybyste sledovali rozhovor mezi prezidenty U.S.A. a Ruska při setkání na vrcholné schůzce — první n>co říká a překladatel to opakuje v ruštin>. Druhý odpovídá v ruštin> a překladatel jeho v>tu op>t opakuje, tentokrát ovšem v angličtin>.
Překvapující může být skutečnost, že ta v>c, která překládá počítačový jazyk do binární podoby, se nazývá překladač. (Poznámka překladatele: V anglickém originále je jak pro simultánního překladatele lidského jazyka, tak pro onen počítačový překladač použito stejné slovo interpreter.) A tak jako obvykle potřebujete jednoho tlumočníka pro překlad z angličtiny do ruštiny a jiného pro překlad z arabštiny do ruštiny, podobn> potřebujete jiný překladač pro překlad z jazyka Python do binární podoby a jiný pro překlad z jazyka VBScript do binárního kódu.
První programátoři museli opravdu binární kód zapisovat ručn>. Tato
činnost je známa jako programování ve strojovém kódu a je velmi
obtížná. Dalším krokem bylo vytvoření překladače, který jednoduše nahrazoval
zápis binárních instrukcí zápisem využívajícím anglické ekvivalenty. Takže
místo toho, aby si programátoři museli pamatovat, že kód
001273 05 04 znamená sečti 5 a 4 (anglicky add 5 to
4), mohli napsat ADD 5 4. Toto prosté
zlepšení programátorům velmi zjednodušilo život. Podobné systémy kódů byly
ve skutečnosti prvními programovacími jazyky — určeným vždy pro
konkrétní typ počítače. Pro tento jazyk se používalo označení jazyk
symbolických instrukcí. (V angličtin> se takový překladač
nazýval assembler a stejný pojem se používal i pro samotný jazyk.)
Programování v assembleru (nebo v jazyku symbolických instrukcí, chcete-li) se
při řešení velmi specializovaných úloh používá dodnes.
Dokonce i takový přístup se ukázal jako velmi primitivní. Pořád jste museli počítači říkat co má d>lat na technické úrovni (co má provád>t jeho procesor), jako například přesuň bajty z této oblasti pam>ti do jiné, sečti tento bajt s tímto, a podobn>. Bylo to stále velmi složité a dokonce i vyřešení malých úkolů dalo hodn> práce.
Aby se programování zjednodušilo, byly postupn> vyvinuty počítačové jazyky vyšší úrovn>. Popudem k jejich vývoji byla také skutečnost, že uživatelé ve stejné dob> přicházeli se stále složit>jšími úkoly, pro jejichž řešení by se dal počítač využít. Toto sout>žení mezi v>dci a uživateli stále pokračuje, a proto stále vznikají nové a nové jazyky. D>lá to programování zajímav>jším. Současn> je ale důležité, aby programátoři rozum>li jak programátorským konceptům, tak praktickým způsobům používání t>chto konceptů v jednotlivých jazycích.
O n>kterých b>žných konceptech se zmíním v následujícím textu. V průb>hu kurzu se k nim budeme opakovan> vracet.
Před mnoha lety přišel Edsger Dijkstra s konceptem nazývaným strukturované programování. Tento koncept říká, že struktura všech programů může být vyjádřena pomocí následujících čtyř způsobů (prostředků, obratů, stavebních prvků):
Při provád>ní posloupnosti instrukcí program provádí jednotlivé instrukce v přesn> určeném pořadí, jednu za druhou.

V určitém bod> provád>ní programu dochází k rozhodování. V případ> pravdivého výsledku provád>ného testu se pokračuje instrukcemi v první v>tvi, v opačném případ> se přejde k provád>ní akcí v druhé v>tvi. Takovému v>tvení se n>kdy říká i podmín>né v>tvení, protože další sm>r b>hu programu závisí na výsledku testu podmínky.

V případ> cyklů se opakuje provád>ní kroků až do doby, kdy je spln>na určitá podmínka. V tom okamžiku tok řízení programu opouští smyčku a přechází se k provád>ní dalších částí programu.

Poznámka překladatele: Popsaný a zobrazený typ
cyklu bývá v jazyce Pascal vyjádřen konstrukcí
repeat/until. V tomto případ> se testování
podmínky provádí až za t>lem cyklu. Instrukce v t>le cyklu se tedy provedou
přinejmenším jednou. Říká se, že pro více než 90 % případů se hodí
spíše cyklus typu while, kdy se podmínka testuje ješt> před
prvním provedením instrukcí v t>le cyklu. Při nespln>ní podmínky se tedy
t>lo cyklu nemusí provést ani jednou.
V naznačeném případ> program provádí n>kolikrát stejnou posloupnost akcí. Ty můžeme umístit do modulu, který můžeme chápat jako miniprogram, proveditelný z hlavního programu. Moduly s popsaným charakterem bývají nazývány také jako podprogram, procedura nebo funkce.

Poznámka překladatele: V tomto okamžiku neuvažujeme o modulech ve významu technické realizace samostatných (samostatn> kompilovaných), opakovateln> použitelných jednotek pro výstavbu programu.
Používání modulů v tomto smyslu se anglicky označuje také jako DRY principle (Do not Repeat Yourself), který vyjadřuje snahu o to, abychom stejný nebo velmi podobný kód nepsali opakovan>. Hlavním důvodem jsou jeho pozd>jší modifikace. Při opakovaném rozepisování na různých místech programu se zvyšuje pravd>podobnost toho, že budoucí úpravy zapomeneme promítnout do všech částí. Dalším důvodem je i zjednodušení opakovaného použití takto zapsané funkčnosti. Typickým příkladem je používání funkcí ze standardních a jiných knihoven. Dostupnost a správná volba vhodných knihoven výrazn> zvyšuje produktivitu při tvorb> programu.
Krom> t>chto strukturálních prvků potřebujeme doplnit n>kolik dalších rysů, bez kterých by program ztrácel smysl:
Jakmile pochopíte tyto koncepty a to, jak se v určitém programovacím jazyce vyjadřují, jste schopni v tomto jazyce programovat.
Už jsme si řekli, že programování spočívá v um>ní donutit počítač d>lat to, co chcete aby d>lal. Ale co to je vlastn> program?
Na program se v podstat> můžeme dívat ze dvou různých pohledů. Podle prvního pohledu — jak to vidí uživatel — jde o spustitelný soubor, který může být nainstalován a může být opakovan> spoušt>n s cílem zpracovat daný úkol. Uživatelé například říkají, že spoušt>jí svůj textový editor. Z druhého pohledu — jak to vidí programátor — jde o textový soubor s příkazy pro počítač, zapsaný v n>jakém programovacím jazyku, který může být přeložen do podoby spustitelného souboru. Takže když budete mluvit o programu, dejte vždy najevo, který z t>chto pohledů máte na mysli.
V zásad> lze říci, že programátor píše program ve vyšším programovacím jazyce, srozumitelném pro programátora, a ten je přeložen na soubor bajtů, kterým rozumí počítač. Z technického pohledu programátor generuje zdrojový kód a překladač z n>j generuje cílový kód[2]. Cílový kód bývá n>kdy nazýván i jinými jmény, jako například P-kód, binární kód nebo strojový kód.
Pro překladače se používají dv> různá jména. Jeden typ bývá nazýván jako interpret a druhý jako kompilátor. Tyto dva pojmy se ve skutečnosti vztahují k dv>ma odlišným technikám generování cílového kódu ze zdrojového kódu. Za kompilátory (kompilační překladače) byly obvykle považovány takové překladače, které produkovaly přímo spustitelný cílový kód (jinými slovy spustitelný soubor), zatímco interpret (interpretační překladač) musí být přítomen při každém spušt>ní programu. Původn> ostrá hranice mezi t>mito přístupy je nyní stále mlhav>jší. N>které soudobé kompilátory vyžadují přítomnost interpretu, který provádí konečnou konverzi kódu, a n>které interprety jednoduše kompilují zdrojový kód do podoby dočasn> existujícího cílového kódu, který poté spustí.
Z našeho pohledu v tom není žádný důležitý rozdíl. Vytvoříme zdrojový kód a použijeme nástroj, který počítači umožní, aby jej přečetl, přeložil a provedl.
Konkrétní struktura programu závisí na programovacím jazyce a na prostředí, ve kterém se program spouští. N>které jejich rysy ale mají obecnou platnost:
V>tšina programů má jednu ze dvou následujících podob:
Programy tohoto typu se typicky spoušt>jí z příkazového řádku (nebo automaticky prostřednictvím plánovacího programu[3]) a chovají se přibližn> podle následujícího vzoru:

Program typicky zahajuje činnost nastavením svého vnitřního stavu (například nastavením celkového součtu na nulu), otevřením potřebných souborů atd. Jakmile je připraven, začíná číst data buď zadávaná uživatelem v míst>, kde program zobrazuje vyzývací text na obrazovce, nebo z datového souboru. Často se používá kombinace obou přístupů, kdy uživatel určí jméno datového souboru, ze kterého se poté načítají skutečná data. Poté program provádí zpracování dat za využití matematických operací, funkcí pro konverzi dat nebo jakýchkoliv jiných transformací. Získané výsledky se zobrazují na displeji nebo se třeba zapisují do výstupního souboru.
Všechny programy, které budeme vytvářet v rámci prvních částí tohoto kurzu, budou mít charakter programů s dávkovým zpracováním.
V>tšina systémů s grafickým uživatelským rozhraním — anglicky GUI = Graphical User Interface — (a vestav>né řídicí systémy — jako například ty, které řídí činnost vaší mikrovlnné trouby, fotoaparátu a podobn>) je řízena událostmi. To znamená, že operační systém zasílá zprávy o událostech b>žícímu programu a ten na n> reaguje v okamžiku, kdy se událost objeví. Události mohou být vyvolány uživatelem — například stisknutím tlačítka myši nebo stisknutím klávesy na klávesnici — nebo je může generovat přímo systém, jako například událost aktualizace systémového času nebo událost požadavku na překreslení obrazovky.
Událostmi řízené programy se chovají obecn> podle následujícího vzoru:

Program řízený událostmi rovn>ž zahajuje svou činnost nastavením svého vnitřního stavu. Ale poté je řízení předáno takzvané smyčce událostí (event loop), která je obvykle realizována operačním prostředím (n>kdy je označováno jako runtime). Program zde čeká, až je detekována uživatelská akce, která se přeloží do podoby události. Zprávy o t>chto událostech jsou jedna po druhé zaslány jiným částem programu, které je zpracovávají. Uživatel nakonec provede akci, která program ukončuje. V tomto bod> je vygenerována událost ukončení (označována jako Exit nebo Quit), která je programu rovn>ž zaslána. Poznámka překladatele: Program na jejím základ> provede své ukončení.
Ke smyčkám událostí a k událostmi řízenému programování se dostaneme v Tématech pro pokročilé a potom ješt> jednou v souvislosti s programováním grafického uživatelského rozhraní.
Zapamatujte si
Pokud vás napadne, co by se dalo na překladu této kapitoly vylepšit, zašlete e-mail odklepnutím Tím budou do dopisu automaticky vloženy informace o tomto HTML dokumentu.
$Id: cztutwhat.html,v 1.16 2005/01/09 19:44:12 petr Exp $