1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata Studijní cíl Tento první blok celého kurzu zaměřen na zvládnutí základních pojmů z oblasti programování a na seznámení se se základními programovacími paradigmaty.
Doba nutná k nastudování
2 – 2,5 hodiny
1.1 Programování Pro stanovení definice programování je vhodné si nejprve definovat pojem počítačový program. Počítačový program je jednoznačná posloupnost instrukcí, která popisuje realizaci dané úlohy počítačem. Bez počítačových programů je počítač pouze prázdný stroj. Definici programování je potom možné chápat v širším a užším pojetí. Asi každého, kdo má jakoukoliv zkušenost s programováním, spontánně napadne definice v užším pojetí, která by mohla znít následovně: programování je činnost, během které dochází k sestavení počítačového programu. Pro nás (i v celém dalším studiu) ale bude důležitější definice v širším pojetí, která vychází z normy ČSN ISO/IEC 2382-1 Informační technologie, Slovník – Část 1: Základní termíny, kde je stanovena následující definice: „Programování je navrhování, zápis, úpravy a testování programů.“ Z tohoto hlediska tedy budeme pod programováním chápat nejen samotné sestavení programu, ale také návrh, úpravy a testování programu. Pro další výklad si uvedeme definice i dalších důležitých pojmů, které budeme v tomto předmětu využívat. Informace – poznatek, který má v daném kontextu specifický význam (týká se jakýchkoliv objektů) Data – opakovaně interpretovatelná formalizovaná podoba informace vhodná pro komunikaci, vyhodnocování nebo zpracování Program – jednoznačný předpis, podle kterého je počítač schopen provádět výpočty nějakého algoritmu (instrukce počítači) Procesor – prvek, kterému je svěřeno vykonávání algoritmu Počítač – matematický stroj (přesné zpracování dat)
KST/IZAPR - Základy programování
blok 1, strana 1 (7)
Michael Bažant
1.2 Programovací jazyky Vzhledem k tomu, že počítače nerozumí lidské řeči, je nutné pro komunikaci s nimi využít psanou formu – programovací jazyky. Počítačové programy jsou tedy psány s využitím programovacích jazyků. Programovací jazyky lze v zásadě rozdělit na dvě základní skupiny: nižší programovací jazyky (low-level programming language) – svým pojetím se přibližují tomu, jak po technické stránce pracuje počítač. Programy zapsané pomocí nižších jazyků není nutné jakkoliv dál upravovat, protože jsou napsány formou, které přímo rozumí procesor. Mezi nižší programovací jazyky patří strojový kód (machine language), který představuje primitivní instrukce v binárním kódu nebo jazyk symbolických adres (assembly language), který je tvořen symbolickou reprezentací jednotlivých strojových instrukcí a konstant potřebných pro vytvoření strojového kódu pro daný procesor (pro překlad do strojového kódu se používá program, který nazýváme assembler). Symbolickou reprezentaci tvoří zpravidla výrobce procesoru. Příklad strojového kódu pro součet dvou čísel: 1101101010011010 Příklad jazyka symbolických adres pro součet dvou čísel: ADDF3 R1, R2, R3
Obrázek 1: Postup při překladu zdrojového kódu assembleru do strojového kódu
vyšší programovací jazyky (high-level programming language) – svým pojetím se blíží tomu, jak problémy zpracovává svým myšlením člověk. Obvykle jsou tyto jazyky tvořeny slovy z anglického jazyka, slova jsou snadno zapamatovatelná. Zápisu ve vyšším jazyku počítač nerozumí, proto je nutné, na rozdíl od nižších jazyků, vždy: a) provést překlad do nižšího jazyka překladačem (kompilátorem – viz Obrázek 2) nebo b) přímo vykonávat (interpretovat) zápis zdrojovém kódu interpretem. V tomto případě není nutné převádět program do strojového kódu, neboť interpret je speciální program, který umožňuje přímo vykonávat zápis jiného programu v jeho zdrojovém kódu. Rozdíl mezi interpretem a kompilátorem můžeme vztáhnout též na programovací jazyky, které podle toho můžeme rozdělit na interpretované a kompilované.
KST/IZAPR - Základy programování
blok 1, strana 2 (7)
Michael Bažant
Postup při kompilaci zdrojového kódu do strojového kódu je uveden na obrázku (viz Obrázek 2) s tím, že je celý proces doplněn o linker, který sestaví výsledný spustitelný kód po doplnění funkcí obsažených v knihovnách. Příklad zápisu ve vyšším programovacím jazyku pro výpočet obsahu kruhu: plocha = 5 * 5 * 3.1415;
Obrázek 2: Postup při překladu zdroj. kódu vyššího progr. jazyka do spustitelného kódu
1.3 Přehled vyšších programovacích jazyků V tomto kurzu bude pozornost zaměřena výhradně na práci s vyššími programovacími jazyky, konkrétně potom na jazyk Java. Je ovšem nutné mít na paměti, že existuje celá řada vyšších programovacích jazyků a můžeme si uvést přehled alespoň těch nejvíce používaných mezi které patří např.: Ada, Algol, APL, awk, BASIC, C, C++, Cobol, Delphi, Eiffel, Euphoria, Forth, Fortran, HTML, Icon, Java, Javascript, LISP, Logo, Mathematica, MatLab, Miranda, Modula-2, Oberon, Pascal, Perl, PL/I, Prolog, Python, Rexx, SAS, Scheme, sed, Simula, Smalltalk, Snobol, SQL, Visual Basic, Visual C++, XML. Zájemci o detailnější přehled o vyšších programovacích jazycích mohou využít odkaz 1. Nutno podotknout, že tento seznam zdaleka neobsahuje vyčerpávající přehled všech vyšších programovacích jazyků. Ten je natolik dlouhý (jsou jich desítky až stovky), že by byl svou mohutností nad rámec tohoto dokumentu a z toho důvodu si jej mohou zájemci prostudovat ve zdroji [2]. Neméně zajímavou oblastí je potom popularita vyšších programovacích jazyků, pro jejíž zobrazení mohou zájemci využít zdroj [3].
1.4 Syntaxe a sémantika Algoritmus zapsaný v programovacím jazyku musí mít přesně dané chování, které lze odvodit z jeho zápisu – tento požadavek vyžaduje přesnou definici
KST/IZAPR - Základy programování
blok 1, strana 3 (7)
Michael Bažant
jazyka. První částí definice jazyka je syntaxe – tu je možné popsat pomocí gramatik. Druhou, nedílnou součástí definice jazyka, je jeho sémantika (význam, chování). Syntaxe je tedy soubor pravidel udávající přípustné konstrukce programů, přičemž korektnost programu lze po syntaktické stránce kontrolovat pomocí překladače. Na základě syntaktických pravidel je možné říci, zda se jedná o korektní zápis programu v daném jazyce. Pro vyjádření syntaxe daného jazyka máme několik možností a to jak grafických, tak textových. Mezi nejčastěji používané grafické popisy syntaxe patří syntaktické diagramy, které se skládají ze základních dvou typů symbolů: a) terminálních - nelze je již dále rozkládat, obvykle značíme kružnicí nebo elipsou a b) nonterminálních symbolů - lze je rozvést až do úrovně terminálních symbolů a obvykle je značíme obdélníkem. Na obrázku (viz Obrázek 3) je uveden příklad syntaktického diagramu pro zápis identifikátoru. Další příklady jsou k dispozici online ve zdroji [4]. Alternativou ke grafickému znázornění syntaxe je popis textový, jehož příkladem může být Backus-Naurova forma (BNF), případně rozšířená BackusNaurova (EBNF) forma. Textový popis má stejnou vyjadřovací schopnost jako syntaktické diagramy, jen je použito textové vyjádření formou metajazyka, kde se využívají tyto prvky: Nonterminální znak <> Definiční znak =, ::= Alternativní znak – seznam variant | Opakování 0–n krát {} Nepovinná část [] Příkladem na EBNF může být definice číslice:
= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Backus-Naurova forma se také často používá pro popis parametrů programů ovládaných z příkazového řádku.
KST/IZAPR - Základy programování
blok 1, strana 4 (7)
Michael Bažant
Obrázek 3: Příklad syntaktického diagramu pro identifikátor proměnné
Příklad syntaxe pro podmíněný příkaz: if (výraz) {} else {} Pro úplnou definici jazyka nestačí popsat jeho syntaxi, ta totiž definuje pouze jeho strukturu. Aby byla zajištěna nezávislost programů na implementaci překladače, je nutné specifikovat význam jednotlivých konstrukcí – tímto rozumíme sémantiku. Nejjednodušší metodou je slovní popis v přirozeném jazyku pod pojmem sémantika rozumíme význam jednotlivých konstrukcí prvků jazyka – jaký má daný prvek význam v jazyku. Příklad syntaxe pro podmíněný příkaz: Po vyhodnocení logického výrazu (musí být v závorkách) se v případě jeho vyhodnocení na hodnotu true provede příkaz za logickým výrazem. Po jeho provedení pokračuje program za tímto příkazem. V případě vyhodnocení výrazu na false se řízení programu předá bezprostředně za podmíněný příkaz. Jinak řečeno se příkaz za logickým výrazem přeskočí. Příkaz if můžeme použít i s variantou else. Sémantika takového příkazu ifelse je v první části totožná se samotným příkazem if. Je-li výslednou hodnotou logického výrazu hodnota true, provede se příkaz za logickým výrazem. V opačném případě, kdy je výsledkem false, se provede příkaz za else. V obou případech se řízení programu po provedení prvního, respektive druhého příkazu předá za celý podmíněný příkaz.
1.5 Programovací paradigmata Při programování je možné využít několika základních programovacích stylů, které byly v průběhu desítek let vymyšleny a definovány (v průběhu času mohou samozřejmě nová paradigmata vzniknout). Pojem paradigma představuje způsob myšlení nad daným problémem. Cílem této kapitoly není uvést vyčerpávající přehled všech paradigmat, ale pouze stručně uvést v současnosti nejpoužívanější programovací paradigmata. 1.5.1
Naivní paradigma
Naivní programovací paradigma je typické pro počítačové laiky a začátečníky. Vyznačuje se nekoncepčností a chaotičností a proto bychom jej vlastně ani neměli nazývat paradigmatem. Programovací jazyky, podporující toto paradigma, jsou minimálně strukturované, neumožňují modularitu a poskytují minimální prostředky pro datovou abstrakci.
KST/IZAPR - Základy programování
blok 1, strana 5 (7)
Michael Bažant
Například ve standardním BASICu byly řádky číslovány pořadovým číslem. Při přidání kódu bylo nutné provádět přečíslování řádků. Často používanou konstrukcí byl skok (příkaz GOTO) na jiný programovací řádek. Programy byly těžko pochopitelné a nepřehledné. Doporučením je tomuto paradigmatu se vyhýbat a nepoužívat jej. 1.5.2
Procedurální paradigma
Procedurální paradigma se též někdy nazývá klasické nebo imperativní. Z prvního synonyma lze vyčíst, že jde o jedno z nejstarších paradigmat, druhé synonymum napovídá, že základní úlohu v tomto paradigmatu hrají příkazy. Typické pro procedurální paradigma je, že průběh výpočtu je dán sekvencí po sobě jdoucích instrukcí (příkazů), přičemž rozhodující roli zde hraje přiřazovací příkaz. V procedurálním paradigmatu je program strukturalizován v závislosti na funkcionalitě – procedurách. Můžeme tedy říci, že jeden modul programu vykonává jednu akci, zatímco druhý modul vykovává jinou akci. Stejné akce přitom mohou být vykonávány nad různými daty. Toto paradigma se běžně používá, lze jej uplatnit v programovacích jazycích jako je Fortran, C, C++, Pascal, Modula2. 1.5.3
Funkcionální paradigma
V případě funkcionálního paradigmatu je průběh výpočtu založen na postupném aplikování funkcí. Funkce zde bývají aplikovány na výsledky jiných funkcí. Pro toto paradigma je typické, že se zde nepoužívá přiřazovacího příkazu a silné místo zde zaujímají tzv. funkce vysoké úrovně a rekurze. Po procedurálním paradigmatu jde o druhé nejstarší paradigma. Rozsáhlé programy psané funkcionálním stylem mohou působit poněkud nepřehledně. Krátké programy, naopak, mohou využít tradiční expresívnosti tohoto paradigmatu a s minimálním množstvím použitých prostředků vyjádřit základní algoritmy. Tento typ paradigmatu je podporován jazyky LISP, Scheme nebo Haskell. 1.5.4
Objektově orientované paradigma
Základními programovacími prvky v objektově orientovaném programování jsou útvary zvané objekty. Tyto útvary v zásadě modelují objekty reálného světa: osoby, předměty, události. Každý objekt je nositelem jistých informací o sobě samém (tzv. stavu) a má schopnost na požádání tento stav měnit. Objekt v sobě zapouzdřuje jak data, tak procedury pracující nad těmito daty (procedurám v objektovém programování říkáme metody). Průběh výpočtu je pak určen posíláním zpráv mezi jednotlivými objekty. Pomocí zpráv objektům říkáme, jak mají změnit svůj stav.
KST/IZAPR - Základy programování
blok 1, strana 6 (7)
Michael Bažant
Objektově orientované programování přineslo zásadní posun v kvalitě programování velkých systémů a umožnilo rychlejší vývoj programů. V další části tohoto kurzu se budeme tímto paradigmatem zabývat (a potom také v navazujících předmětech). Programovací jazyky, které podporují toto paradigma: např. SmallTalk, C++, Java.
Otázky na procvičení 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Co rozumíme pod pojmem počítačový program? Vyjmenujte všechny činnosti, které obsahuje pojem programování. Čím jsou specifické interpretované jazyky? Co je to kompilátor? K čemu slouží linker? Čím jsou typické vyšší programovací jazyky? Co je to jazyk symbolických adres? Co je to strojový kód? Jak jsou vytvářeny počítačové programy? Co je to interpret?
Odkazy a další studijní prameny 1. Současné vyšší programovací jazyky http://groups.engin.umd.umich.edu/CIS/course.des/cis400/ 2. Seznam programovacích jazyků http://en.wikipedia.org/wiki/List_of_programming_languages 3. Popularita vyšších programovacích jazyků - http://langpop.com/ 4. Syntaktické diagramy a EBNF pro jazyk Java http://cuiwww.unige.ch/dbresearch/Enseignement/analyseinfo/JAVA/BNFindex.html
KST/IZAPR - Základy programování
blok 1, strana 7 (7)
Michael Bažant