základů algoritmizace

Podobné dokumenty
Automaty a gramatiky(bi-aag) Motivace. 1. Základní pojmy. 2 domácí úkoly po 6 bodech 3 testy za bodů celkem 40 bodů

Formální jazyky a gramatiky Teorie programovacích jazyků

doplněk, zřetězení, Kleeneho operaci a reverzi. Ukážeme ještě další operace s jazyky, na které je

Algoritmus. Přesné znění definice algoritmu zní: Algoritmus je procedura proveditelná Turingovým strojem.

Základy algoritmizace

Vlastnosti Derivační strom Metody Metoda shora dolů Metoda zdola nahoru Pomocné množiny. Syntaktická analýza. Metody a nástroje syntaktické analýzy

Bezkontextové jazyky. Bezkontextové jazyky 1 p.1/39

Výukový materiál zpracován v rámci projektu EU peníze školám

Turingovy stroje. Teoretická informatika Tomáš Foltýnek

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

AUTOMATY A GRAMATIKY. Pavel Surynek. Kontextové uzávěrové vlastnosti Turingův stroj Rekurzivně spočetné jazyky Kódování, enumerace

2 Formální jazyky a gramatiky

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Kapitola 6. LL gramatiky. 6.1 Definice LL(k) gramatik. Definice 6.3. Necht G = (N, Σ, P, S) je CFG, k 1 je celé číslo.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Algoritmizace. 1. Úvod. Algoritmus

Algoritmy a algoritmizace

Návrh algoritmů pro sémantické akce při výstavbě interpretu metodou rekurzivního sestupu

Algoritmizace. Obrázek 1: Přeložení programu překladačem

Vlastnosti algoritmu. elementárnost. determinovanost. rezultativnost. konečnost. hromadnost. efektivnost

Regulární výrazy. Definice Množina regulárních výrazů nad abecedou Σ, označovaná RE(Σ), je definována induktivně takto:

Algoritmizace- úvod. Ing. Tomáš Otáhal

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Bezkontextové jazyky 2/3. Bezkontextové jazyky 2 p.1/27

Množinu všech slov nad abecedou Σ značíme Σ * Množinu všech neprázdných slov Σ + Jazyk nad abecedou Σ je libovolná množina slov nad Σ

Výpočetní modely pro rozpoznávání bezkontextových jazyků zásobníkové automaty LL(k) a LR(k) analyzátory

Vztah jazyků Chomskeho hierarchie a jazyků TS

Formální jazyky a automaty Petr Šimeček

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Masarykova střední škola zemědělská a Vyšší odborná škola, Opava, příspěvková organizace

Automaty a gramatiky(bi-aag) Formální překlady. 5. Překladové konečné automaty. h(ε) = ε, h(xa) = h(x)h(a), x, x T, a T.

Konstrukce relace. Postupně konstruujeme na množině všech stavů Q relace i,

IB111 Programování a algoritmizace. Programovací jazyky

Naproti tomu gramatika je vlastně soupis pravidel, jak

Syntaxí řízený překlad

Program a životní cyklus programu

Jednoznačné a nejednoznačné gramatiky

IB111 Úvod do programování skrze Python Přednáška 13

Čísla značí použité pravidlo, šipka směr postupu Analýza shora. Analýza zdola A 2 B 3 B * C 2 C ( A ) 1 a A + B. A Derivace zleva:

Algoritmus. Cílem kapitoly je seznámit žáky se základy algoritmu, s jeho tvorbou a způsoby zápisu.

Lexikální analýza Teorie programovacích jazyků

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

ALGORITMIZACE A PROGRAMOVÁNÍ

Vektory a matice. Obsah. Aplikovaná matematika I. Carl Friedrich Gauss. Základní pojmy a operace

OSTRAVSKÁ UNIVERZITA V OSTRAVĚ PŘÍRODOVĚDECKÁ FAKULTA

Operátory pro maticové operace (operace s celými maticemi) * násobení maticové Pro čísla platí: 2*2

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Úvod do informatiky. Miroslav Kolařík

UČEBNÍ TEXTY VYSOKÝCH ŠKOL. Prof. RNDr. Milan Češka, CSc. Gramatiky a jazyky

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Algoritmizace prostorových úloh

Postův korespondenční problém. Meze rozhodnutelnosti 2 p.1/13

Pojem algoritmus. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava

Složitost Filip Hlásek

Implementace LL(1) překladů

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Lekce 01 Úvod do algoritmizace

Úvod. Programovací paradigmata

Programovací jazyk Pascal

Vysoké učení technické v Brně Fakulta informačních technologií. Gramatiky nad volnými grupami Petr Blatný

AUTOMATY A GRAMATIKY

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Profilová část maturitní zkoušky 2017/2018

Regulární výrazy. M. Kot, Z. Sawa (VŠB-TU Ostrava) Úvod do teoretické informatiky 14. března / 20

Automaty a gramatiky

Teoretická informatika TIN 2013/2014

Třídy složitosti P a NP, NP-úplnost

Matematika v programovacích

1 Základních pojmy z oblasti programování, vyšší programovací jazyky, programovací paradigmata

ANOTACE vytvořených/inovovaných materiálů

Profilová část maturitní zkoušky 2013/2014

Syntaktická analýza. Implementace LL(1) překladů. Šárka Vavrečková. Ústav informatiky, FPF SU Opava

Překladač a jeho struktura

Konečný automat. Jan Kybic.

Grafy. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 13.

TÉMATICKÝ OKRUH Softwarové inženýrství

Teoretická informatika

Maticí typu (m, n), kde m, n jsou přirozená čísla, se rozumí soubor mn veličin a jk zapsaných do m řádků a n sloupců tvaru:

DTP Základy programování Úvod do předmětu

Algoritmizace a programování

Automaty a gramatiky. Uzávěrové vlastnosti v kostce R J BKJ DBKJ. Roman Barták, KTIML. Kvocienty s regulárním jazykem

Výroková a predikátová logika - III

Množiny, relace, zobrazení

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Z. Sawa (VŠB-TUO) Teoretická informatika 5. listopadu / 43

= je prostý orientovaný graf., formálně c ( u, v) 0. dva speciální uzly: zdrojový uzel s a cílový uzel t. Dále budeme bez

Moderní technologie ve studiu aplikované fyziky CZ.1.07/2.2.00/ Množiny, funkce

0.1 Úvod do lineární algebry

Teoretická informatika - Úkol č.1

Matematika (CŽV Kadaň) aneb Úvod do lineární algebry Matice a soustavy rovnic

ALGORITMIZACE Příklady ze života, větvení, cykly

Vývojové diagramy 1/7

Vlastnosti regulárních jazyků

2. Množiny, funkce. Poznámka: Prvky množiny mohou být opět množiny. Takovou množinu, pak nazýváme systém množin, značí se

Předměty. Algoritmizace a programování Seminář z programování. Verze pro akademický rok 2012/2013. Verze pro akademický rok 2012/2013

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Algoritmizace a programování

Teoretická informatika TIN

Algoritmizace prostorových úloh

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Transkript:

Mendelova univerzita v Brně Provozně ekonomická fakulta Punťa - vývojové prostředí pro výuku základů algoritmizace Diplomová práce Vedoucí práce: Mgr. Tomáš Foltýnek, Ph.D. Bc. Marek Fojtl Brno 2010

zadání práce

Děkuji Mgr. Tomáši Foltýnkovi, Ph.D. za vedení a podporu při tvorbě této práce a umožnění nasazení vývojové verze aplikace do výuky. Chtěl bych dále poděkovat Mgr. Jitce Machalové, Ph.D., Ing. Miroslavu Ceplovi a vybraným studentům a studentkám předmětu Výpočetní technika a algoritmizace II (LS09/10) za cenné připomínky a testování aplikace.

Prohlašuji, že jsem tuto diplomovou práci vyřešil samostatně s použitím literatury uvedené v závěru práce. V Brně dne 28. května 2010....................................................

5 Abstract Fojtl M., Punťa - development environment for teaching of basic algorithms. Diploma thesis. Brno, 2010 This diploma thesis deals with construction of Punťa - new czech programming language and development environment for teaching of algorithms. A theoretical part discusses the meaning of a word algorithm, and important terms of programming language theory. A baseline analysis describes so far known products for teaching of algorithms. A solution consists in design and implementation Punťa language to its own development environment. Keywords algorithms, programming language, development environment, lexical analysis, syntactic analysis, semantic actions Abstrakt Fojtl M., Punťa - vývojové prostředí pro výuku základů algoritmizace. Diplomová práce. Brno, 2010 Diplomová práce se zabývá tvorbou nového českého programovací jazyka a vývojového prostředí pro výuku algoritmizace - Punťa. V teoretické části rozebírá význam slova algoritmus a důležité pojmy z teorie programovacích jazyků. V analýze výchozího stavu jsou popsány dosud známé produkty pro výuku algoritmizice. Vlastní řešení spočívá v návrhu a implemenentaci jazyka Punťa do vlastního vývojového prostředí. Klíčová slova algoritmizace, programovací jazyk, vývojové prostředí, lexikální analýza, syntaktická analýza, sémantické akce

OBSAH 6 Obsah 1 Úvod a cíl práce 10 1.1 Úvod do problematiky.......................... 10 1.2 Cíl práce.................................. 11 2 Teoretická východiska práce 12 2.1 Algoritmus................................. 12 2.1.1 Historická východiska....................... 12 2.1.2 Definice pojmu.......................... 12 2.1.3 Formalizace pojmu........................ 13 2.1.4 Způsoby zápisu.......................... 14 2.1.5 Algoritmizace........................... 14 2.2 Programovací jazyky........................... 15 2.2.1 Prostředek pro zápis algoritmu................. 15 2.2.2 Dělení programovacích jazyků.................. 15 2.3 Formální jazyky a gramatiky....................... 17 2.3.1 Abeceda a jazyk......................... 17 2.3.2 Gramatika............................. 17 2.3.3 Chomského klasifikace gramatik................. 19 2.4 Konečné automaty a jazyky typu 3 Chomského klasifikace...... 21 2.4.1 Nedeterministický konečný automat............... 21 2.4.2 Deterministický konečný automat................ 22 2.4.3 Jazyky akceptované KA, konstrukce NKA........... 22 2.4.4 Převod NKA na DKA...................... 23 2.5 Bezkontextové jazyky a zásobníkový automat............. 24 2.5.1 Bezkontextová gramatika..................... 24 2.5.2 Derivační stromy......................... 24 2.5.3 Rozklad věty........................... 25 2.5.4 Syntaktické diagramy....................... 25 2.5.5 Zásobníkový automat....................... 26 2.6 Deterministické bezkontextové jazyky.................. 27 2.6.1 LL gramatiky........................... 28 2.6.2 Výpočet množin FIRST a FOLLOW.............. 28 2.6.3 Syntaktická analýza LL(1) gramatiky.............. 29 2.7 Sémantika................................. 30

OBSAH 7 3 Současný stav řešené problematiky 31 3.1 Pascal................................... 31 3.2 Robot Karel................................ 32 3.3 Baltazar, Baltík, Baltie.......................... 32 3.4 Petr.................................... 33 3.5 Imagine Logo............................... 34 3.6 Ostatní................................... 35 4 Zvolená metodika a programové prostředky 36 4.1 Návrh lexikálního a syntaktického analyzátoru............. 36 4.2 Návrh a implementace vývojového prostředí.............. 36 4.3 Implementace lexikálního a syntaktického analyzátoru a sémantických akcí do aplikace........................... 37 5 Vlastní práce 38 5.1 Obecné vlastnosti jazyka Punťa..................... 38 5.2 Regulární gramatika lexikálního analyzátoru.............. 38 5.2.1 Abeceda jazyka.......................... 38 5.2.2 Gramatika jazyka čísel...................... 38 5.2.3 Gramatika jazyka přiřazení................... 39 5.2.4 Gramatika jazyka operátorů................... 39 5.2.5 Gramatika jazyka řetězců.................... 40 5.2.6 Gramatika jazyka znaků..................... 40 5.2.7 Gramatika jazyka proměnných.................. 40 5.2.8 Gramatika jazyka klíčových slov................. 41 5.2.9 Gramatika ukončovacího znaku příkazu............. 41 5.2.10 Gramatika příkazových bloků.................. 42 5.2.11 Gramatika oddělovače parametrů a názvů proměnných.... 42 5.2.12 Gramatika jazyka polí...................... 42 5.2.13 Gramatika bílých znaků..................... 42 5.2.14 Gramatika komentářů...................... 43 5.2.15 Stanovení nevýznamových tokenů................ 43 5.2.16 Stanovení významových tokenů................. 44 5.2.17 Zregularizovaný lexikální analyzátor............... 44 5.2.18 NKA a DKA........................... 45 5.3 Bezkontextová gramatika syntaktického analyzátoru.......... 45 5.3.1 Deterministická bezkontextová gramatika souboru s hlavním programem............................ 46 5.3.2 Deterministická bezkontextová gramatika modulu....... 48

OBSAH 8 5.3.3 Syntaktické diagramy....................... 48 5.3.4 Výpočet množin FIRST a FOLLOW.............. 48 5.3.5 Zásobníkový automat....................... 48 5.4 Vývojové prostředí............................ 48 5.4.1 Návrh uživatelského rozhraní.................. 48 5.4.2 Implementace uvítací obrazovky, editoru a console....... 50 5.4.3 Funkce editoru.......................... 53 5.4.4 Zvýrazňovač syntaxe....................... 54 5.5 Implementace lexikálního a syntaktického analyzátoru......... 54 5.5.1 Lexikální analyzátor....................... 54 5.5.2 Syntaktický analyzátor...................... 55 5.6 Implementace sémantických akcí a popis příkazů............ 56 5.6.1 Sémantický procesor....................... 56 5.6.2 Datové typy a pole........................ 57 5.6.3 Zpracování výrazů........................ 58 5.6.4 Větvení.............................. 58 5.6.5 Cykly............................... 59 5.6.6 Matematické funkce........................ 60 5.6.7 Standardní vstup a výstup.................... 60 5.6.8 Práce s proměnnými typu Text................. 61 5.6.9 Funkce definované uživatelem a globální proměnné...... 61 5.6.10 Práce s grafikou.......................... 62 5.6.11 Zpracování chyb.......................... 62 6 Diskuse 64 7 Závěr 68 8 Literatura 69 Přílohy 71 A Nedeterministický a deterministický konečný automat 72 B Syntaktické diagramy 73 C Výpočet množin FIRST a FOLLOW 82 D Zásobníkový automat 85 E Dotazník 86

OBSAH 9 F Ukázkový příklad 88

1 ÚVOD A CíL PRÁCE 10 1 Úvod a cíl práce 1.1 Úvod do problematiky Využití prostředků informačních technologií v našem běžném i pracovním životě zaznamenalo v posledních letech velký nárůst. Možnost zakoupení personálního počítače je dnes cenově dostupná každému. Díky tomu se otevřela další cesta pro programátory a vývojáře aplikací, kteří již v dnešní době nemusí své aplikace vyvíjet pouze pro úzkou a specializovanou skupinu lidí, ale i pro širokou veřejnost. Aby vývojář navrhl dobrý a správně fungující software, musí nastudovat moderní přístupy pro jeho tvorbu a také jednu ze základní činností řešení problémů - algoritmizaci. Někteří by se nyní mohli mylně domnívat, že cílem výuky algoritmizace je připravit budoucí programátory na jejich povolání a toto téma se ostatních vlastně netýká. Ale jejím cílem nemusí být nutně jen výchova nových programátorů. Jde o trénink mozku a logického myšlení a zdokonolování se v řešení různých problémů, které nás v životě čekají. Trénink mozku je přitom v dnešní době velmi důležitý. Trendem se totiž stává automatizace rutinních činností, kdy máme k dispozici různé softwarové aplikace a zařízení přemýšlející za nás. Mezi ně patří chytré mobilní telefony (smartphony) nebo informační systémy, které nám usnadňují práci. Lidé tak ztrácejí potřebu uvažovat a jejich schopnost řešit problémy klesá. Základním pojmem této činnosti je algoritmus, s jehož definicí se nejčastěji potkáte v podobě: jednoznačný srozumitelný přesně specifikovaný postup (předpis) vedoucí v konečném počtu kroků k řešení určité úlohy (Havelková, 2008), ale později bude vysvětleno, že za tímto pojmem se skrývá mnohem více než jen tato definice. Algoritmy můžeme zapisovat různě. Slovem, matematicky, graficky a nebo programovacím jazykem. Je jasné, že nejvhodnější zápis, kterému počítač rozumí je programovací jazyk, ale i ten se musí přeložit do tzv. strojového kódu, kterému počítač, respektive jeho operační systém, teprve plně porozumí. Jazyk tedy není pouze nástroj pro dorozumívání lidí mezi sebou, ale slouží i ke komunikaci s počítačem, jehož forma stejně jako u lidského jazyka má svá pravidla a ta se musí dodržovat. Drtivá většina programovacích jazyků disponuje pouze angličtinou a ta může být pro české uživatele problémem, přitom čeština je jazyk unikátní, bohatý, různorodý a krásný a z těchto dvou důvodů vznikla myšlenka ulehčit výuku algoritmizace právě návrhem a implementováním nového programovacího jazyka s českou syntaxí a vlastním vývojovým prostředím.

1.2 Cíl práce 11 1.2 Cíl práce Tato práce si klade za cíl navrhnout a implementovat zcela nový interpretovaný programovací jazyk s jednoduchou českou syntaxí vhodný pro výuku algoritmizace a vytvořit pro něj takové vývojové prostředí, jehož ovládání bude jednoduché i pro úplné začátečníky. Cíle bude dosaženo postupně ve dvou fázích. V první fázi dojde k navržení regulární gramatiky lexikálního analyzátoru a sestavení deterministického konečného automatu společně s návrhem bezkontextové gramatiky syntaktického analyzátoru a sestavením zásobníkového automatu. V druhé fázi bude proveden návrh a implementace vlastního vývojového prostředí včetně zakomponování lexikálního a syntaktického analyzátoru a implementace sémantických akcí.

2 TEORETICKÁ VÝCHODISKA PRÁCE 12 2 Teoretická východiska práce 2.1 Algoritmus 2.1.1 Historická východiska Historie vzniku tohoto pojmu je celkem spletitá. Jak uvádí Donald E. Knuth (2008), vyvinulo se ze slova algorism, které vzniklo ve středověku a jehož původní význam zněl: provádění aritmetických výpočtů s arabskými číslicemi (Knuth, 2008), ale historikové matematiky však nakonec objevili skutečný původ, který pocházel ze jména perského matematika 9. století Abu Jafar Muhammada ibn Musa al- Chwarizmího, autora slavného arabského matematického textu Kitab al-jabr wa lmuqabala ( Pravidla pro odvozování a srovnávání ). (Knuth, 2008) Od původního slova algorism došlo v průběhu vývoje k několika odklonům a přeměnám, které dospěly až do jeho finální fáze, která se používá do dnes. Největší podíl na tom nese záměna arabského kořene s kořenem řeckého slova arithmos a díky tomu se z algorismu stal algoritmus. (www.manualy.net, 2006) 2.1.2 Definice pojmu Význam slova algoritmus má hodně synonym. Mezi nejčastěji používané se řadí recept, metoda, technika, procedura nebo postup. Ale jak bylo řečeno již v úvodu, za tímto pojmem se skrývá mnohem více. Algoritmus je konečnou množinou pravidel, která popisují posloupnost operací pro řešení jistého typu problému (Knuth, 2008) a musí splňovat 5 důležitých vlastností: 1. Konečnost. Každý algoritmus musí mít konečný počet kroků a po jejich vykonání musí skončit. Procedura, která splňuje všechny vlastnosti algoritmu, ale není konečná, se nazývá výpočetní metoda. 2. Určitost. Každý krok algoritmu musí být jednoznačně definován a za všech okolností musí být vždy jasné, co a jak se má provést. Prováděné operace musí být popsány s jednoznačností a určitostí. 3. Vstup. Algoritmus může mít jeden a více vstupů, ale také nemusí mít žádný. Jsou to veličiny zadávané do algoritmu před jeho zahájením nebo dynamicky zadávané během průběhu algoritmu. Vstupy jsou přebírány z určité množiny objektů. 4. Výstup. Algoritmus má jeden či více výstupů, což jsou veličiny, které jsou dány vztahem ke vstupům.

2.1 Algoritmus 13 5. Efektivnost. Každý algoritmus by měl být efektivní, což znamená, že všechny jeho operace musí být v rozumné míře jednoduché a jejich řešení by mělo být proveditelné i s pomocí tužky a papíru. (Knuth, 2008) Na základě Dvorského (2007) lze výše uvedené vlastnosti rozšířit o opakovatelnost (stejné vstupy musí poskytovat stejné výsledky) a rezultivnost (algoritmus poskytuje správné výsledky). (Dvorský, 2007) 2.1.3 Formalizace pojmu Nyní vyvstává otázka, jak rozlišit, zda-li na řešený problém algoritmus existuje či nikoliv. Dříve, než bude zodpovězena, je třeba objasnit pojem Turingův stroj. Černá, Křetínský a Kučera (2002) popisují Turingův stroj jako stroj sestrojený Alanem Turingem 1 s konečnou množinou stavů Q, páskou rozdělenou na jednotlivá políčka a hlavou pohybující se po pásce doleva a doprava, čímž je umožněno čtení a zápis symbolů. Na každém políčku je zapsán právě jeden páskový nebo pracovní symbol náležící do konečné množiny symbolů. Páska je jednosměrná a nekonečná. Na nultém políčku (vlevo) je zapsán speciální symbol, kterému se říká startovací a označuje levý konec pásky. (Černá, Křetínský, Kučera, 2002) Odpověď na výše uvedenou otázku poskytuje Churchova 2 teze (či též jako Church-Turingova teze): Každý proces, který lze intuitivně nazvat algoritmem, se dá realizovat na Turingově stroji. (Černá, Křetínský, Kučera, 2002) Churchova teze nám tedy dává do souvislosti pojmy algoritmicky řešitelný a řešitelný Turingovým strojem a ztotožňuje je. Obsah Churchovy teze nelze formálně dokázat, protože pojem algoritmicky řešitelný je pouze intuitivní pojem. Černá, Křetínský a Kučera (2002) však také uvádějí, že existují další systémy, které potvrzují platnost teze a jsou, co se výpočetní síly týče, ekvivaletní s Turingovým strojem. Jmenovat lze Postovy systémy, Minského stroje, µ-rekurzivní funkce, λ-kalkul a while programy. Navíc dosud nebyl nalezen algoritmus, který by na Turingově stroji nešel sestavit. Na základě těchto faktů, lze považovat tezy za platnou. (Černá, Křetínský, Kučera, 2002) 1 Alan Turing - matematik, který v roce 1936 definoval jeden z dosud nejsilnějších výpočetních modelů - Turingův stroj (Černá, Křetínský, Kučera, 2002) 2 Alonzo Church - americký matematik a profesor na Princestonské univerzitě, mezi jeho studenty patřil i Alan Turing (World of Mathematics Biography, 2006)

2.1 Algoritmus 14 2.1.4 Způsoby zápisu Algoritmus lze zapsat několika způsoby: slovním popisem využití přirozeného jazyka jako prostředek zápisu algoritmu vývojovým diagramem pomocí jednotných značek a zkratek graficky zobrazený algoritmus řešení úlohy strukturogramy opět se jedná o grafické zobrazení splňující podmínky pro strukturované programování, které používá obdobné symboly jako při znázornění vývojovým diagramem datově orientované diagramy HIPO (Hierarchy plus Input-Process- Output) - forma zápisu, kdy je graficky vyjádřeno funkční členění problému, struktury dat a postupu řešení problému při různém stupni podrobnosti rozhodovací tabulky používají se při velmi složitých větveních (www.manualy.net, 2006) pseudokódem - kombinace kódu a přirozeného jazyka programovacím jazykem - využití některého z dostupných programovacích jazyků k zápisu algoritmů (Beránek, 2008) 2.1.5 Algoritmizace Algoritmizace je postup, který se uplatňuje při tvorbě programu pro počítač a pomocí kterého lze prostřednictvím algoritmu řešit daný problém. (Diviš) Tento postup lze rozdělit do několika etap: 1. Formulace problému - formulace požadavků, určení výchozích hodnot, požadovaných výsledků, jejich formu a přesnost měření 2. Analýza úlohy - ověření, zda je úloha řešitelná a vytvoření první představy o jejím řešení, zjištění zda výchozí hodnoty jsou k řešení postačující, zda má úloha více řešení a výběr nejvhodnějšího řešení 3. Vytvoření algoritmu - sestavení jednoznačného sledu jednotlivých operací pro správné vyřešení úlohy a je třeba mít na paměti, že algoritmus nedává přímo odpověď na řešený problém, ale postup, jak ji získat 4. Sestavení programu - sestavení programu na základě navrženého algoritmu v určitém programovacím jazyce a provedení překladu nebo intepretace programu

2.2 Programovací jazyky 15 5. Odladění programu - odstranění syntaktických (odhalí překladač) a sémantických chyb (musí odhalit člověk na základě získaných chybných výsledků nebo nekorektním chováním programu při určitých činnostech) (Diviš) 2.2 Programovací jazyky 2.2.1 Prostředek pro zápis algoritmu Chceme-li docílit nahrazení člověka při realizaci algoritmu počítačem, je potřeba zvolit takovou formu zápisu algoritmu, které počítač plně rozumí. Přirozený jazyk ani vývojové diagramy tuto podmínku nesplňují. Jediný jazyk, kterému počítače rozumí se nazývá strojový kód. Strojový kód je jazyk primitivní a umožňuje zapsat pouze ty nejzákladnější operace, které se nazývají strojové instrukce (např. aritmetické operace, porovnání dvou hodnot, skok aj.), zapsané v binárním tvaru. Značnou nevýhodou tohoto způsobu zápisu algoritmu je pracnost a nepřehlednost, a proto se k praktickému zápisu algoritmů příliš nehodí. Z těchto důvodů vznikají programovací jazyky, které nejsou sice pro počítač přímo srozumitelné, ale pomocí speciálního programu - tzv. překladače - je lze do strojového kódu přeložit. (Častorál, 1991) 2.2.2 Dělení programovacích jazyků Programovací jazyky lze dělit dle nejrůznějších kritérií. Jak uvádí Josef Kadlec (2004), za nejobecnější rozdělení se dá považovat rozlišení na nižší a vyšší. Nižší programovací jazyky se vyznačují využíváním přímo příkazů procesoru. K velké výhodě těchto jazyků patří maximálně optimalizovaný program pro zvolenou platformu a vyšší rychlost při provádění programu. Mezi další výhody patří minimální omezení při programování a možnost využívat všechny funkce zařízení. Nevýhoda spočívá v nepřenositelnosti programu na jiný druh procesoru, který tyto instrukce nezná. Další vlastností, na základě které nelze k zápisu algoritmů nižší jazyky doporučit, je jistá nepohodlnost při psaní programu (větší rozsah kódu než u vyšších programovacích jazyků). Skupina nižších jazyků není příliš početná, patří sem zejména jazyk symbolických adres a strojový kód. Vyšší programovací jazyky tvoří mnohem početnější skupinu. Řadí se sem jazyky, které jsou pro člověka čitelnější a mají logicky uspořádaný kód. Pro zápis algoritmů jsou tedy lepším nástrojem. Tato skupina není závislá na strojových principech počítače. Na rozdíl od nižších programovacích jazyků se zde může stát, že některé věci, vyžadující např. přímou adresaci zařízení, zde nepůjdou zhotovit. V těchto případech musíme tuto část kódu nahradit tzv. inline vložením kódu z nižšího progra-

2.2 Programovací jazyky 16 movacího jazyku (pokud to překladač dovoluje). Mezi vyšší patří prakticky všechny ostatní jazyky (C, C++, Java, Perl, Php, Python, atd.). (Kadlec, 2004) Dalším kritériem, podle kterého můžeme jazyky rozdělit, je na interpretované a kompilované. Hlavní rozdíl spočívá ve zpracovávání zdrojového kódu. Zatímco jazyky kompilované překládají kód do spustitelné formy, kód psaný v jazyku intepretovaném potřebuje ke svému spuštění tzv. interpret, který zpracovává jednotlivé příkazy a ihned je vykonává. Zdeněk Častorál (1991) i Josef Kadlec (2004) spatřují výhody kompilovaných jazyků zejména v rychlosti provádění programu, která je několikanásobně vyšší než u jazyků interpretovaných. Největší výhodu interpretovaných jazyků vidí Častorál (1991) v pohodlném testování programu, kdy po opravě chyby v kódu lze ihned provést výpočet, zatímco Kadlec (2004) spíše vyzdvihuje fakt, že u většiny interpretovaných jazyků není nutné deklarovat proměnné, velikost paměti, kterou mají proměnné zabírat, apod. Mezi interpretované jazyky patří např. Php, Perl, Python nebo Java. Do skupiny kompilovaných řadíme např. C++, Pascal nebo Visual Basic. (Kadlec, 2004) Další dělení jazyků může probíhat na základě přístupu k řešení problému a to na procedurální a funkcionální. V procedurálních (imperativních) jazycích se využívá postupu, jak se má daná úloha (vy)řešit, tedy využívá se algoritmu. V jazycích funkcionálních se nevyjadřuje, jak daný problém řešit, nýbrž co chceme řešit. (Kadlec, 2004) Jak uvádí Dosedla (2006), celý program je v tomto případě chápán jako funkce, jejímž výsledkem je výraz. Základem je výpočtový model λ-kalkul 3. Příkladem funkcionálních jazyků je např. LISP nebo Haskell. Procedurální jazyky lze rozdělit z hlediska přístupu tvorby programu na strukturované a objektové. Strukturovaný přístup je založen na principu rozdělení algoritmu na podproblémy implementované pomocí strukturovaných datových typů a řídících struktur (posloupnost příkazů, větvení, cykly). Do jazyků se strukturovaným přístupem se řadí např. jazyk C nebo Pascal. Objektově orientované jazyky jsou založeny na objektech a vztazích mezi nimi. Základem je třída, z které vzniká objekt jakožto instance třídy. Mezi objektově orientované jazyky patří např. Java nebo Smalltalk. Některé jazyky umožňují kombinovat jak objektový, tak strukturovaný přístup. Mezi ně se řadí např. jazyk C++. (Dosedla, 2006) 3 λ-kalkul - teorie funkcí založená na velmi jednoduchém jazyce. Základní prvky tohoto jazyka (tzv. lambda výrazy) jsou pouze tři: proměnná, aplikace a abstrakce (Beneš, 2006)

2.3 Formální jazyky a gramatiky 17 2.3 Formální jazyky a gramatiky 2.3.1 Abeceda a jazyk Abecedou se rozumí neprázdná konečná množina prvků, které se nazývají symboly abecedy. Každá konečná posloupnost symbolů abecedy se nazývá řetězec (též slovo nebo věta). Formální definice řetězce podle Češky (2002) nad abecedou Σ zní: 1. Prázdný řetězec ɛ je řetězec nad abecedou Σ. 2. Je-li x řetězec nad Σ a a Σ, pak i xa Σ. 3. y je řetězec nad Σ, tehdy a jen tehdy když lze y získat pomocí aplikace pravidel 1 a 2. Konkatenací (zřetězením) se nazývá taková operace, kdy spojením řetězce x Σ a y Σ vznike řetězec xy. Operace konkatenace je asociativní, tzn. x(yz) = (xy)z, ale není komutativní, protože xy yx. Nechť existuje řetězec x = a 1 a 2... a n nad abecedou Σ, a i Σ pro i = 1,..., n. Zápis symbolů v opačném pořadí vzhledem k řetězci x se nazývá reverzí (zrcadlovým obrazem), kdy x R = a n a n 1... a 2 a 1. Nechť w je řetězec nad abecedou Σ. Podřetězcem w se nazývá takový řetězec z, pro který při existenci řetězců x a y platí, že w = xzy. Prefixem řetězce w nazýváme takový řetězec x 1, pro který při existenci řetězce y 1 platí, že w = x 1 y 1. Pak se tedy analogicky sufixem řetězce w nazývá takový řetězec x 2, pro který při existenci řetězce y 2 platí, že w = y 2 x 2. Délkou řetězce se rozumí nezáporné číslo udávající počet symbolů řetězce. Délka řetězce x se značí x. Máme-li x = a 1 a 2... a n, a i Σ pro i = 1,..., n, pak platí x = n. Pro prázdný řetězec je délka řetězce nulová, tj. ɛ = 0. Jazykem L názýváme takovou množinu L, pro kterou platí: L Σ nebo L Σ +, kde Σ je množina všech řetězců nad abecedou Σ včetně prázdného řetězce a Σ + množina všech řetězců nad abecedou Σ vyjma prázdného řetězce. Z toho tedy plyne, že jazyk je libovolná podmožina řetězců nad danou abecedou. (Češka, 2002) 2.3.2 Gramatika Gramatika je nejznámější prostředek pro reprezentaci jazyků. Pokud bychom chtěli použít triviálnější způsob reprezentace, museli bychom vytvořit výčet všech vět ja-

2.3 Formální jazyky a gramatiky 18 zyka. Tento způsob je však nepoužitelný pro nekonečné jazyky 4 a prakticky i pro rozsáhlé konečné jazyky 5. Gramatika splňuje základní požadavek kladený na reprezentaci konečných i nekonečných jazyků, který spočívá v konečnosti reprezentace. Používá konečných množin N - nonterminálních a Σ - terminálních symbolů, které jsou vzájemně disjunktní. Nonterminální symboly (nonterminály) slouží jako pomocné symboly označující syntaktické celky, zatímco množina terminálních symbolů (terminálů) je identická s abecedou, nad níž je definován jazyk. Jestliže provedeme sjednocení množin, tj. N Σ, získáváme slovník gramatiky. Základem každé gramatiky je konečná množina přepisovacích pravidel P. Pravidla tvoří uspořádanou dvojici řetězců (α, β), kde β představuje možnou substituci řetězce α, který značí podřetězec generovaného řetězce. Řetězec α obsahuje vždy alespoň jeden nonterminální symbol (kdyby neobsahoval, nebyla by možná substituce) a řetězec β patří do množiny (N Σ). Množinu přepisovacích pravidel P pak lze formálně vyjádřit pomocí kartézského součinu: (N Σ) N(N Σ) (N Σ) Gramatiku G lze tedy na základě předchozích poznatků definovat jako čtveřici G = (N, Σ, P, S), kde N je konečná množina nonterminálních symbolů, Σ je konečná množina terminálních symbolů, platí, že N Σ = 0, P je konečná podmožina kartézského součinu (N Σ) N(N Σ) (N Σ), S N je startovací symbol gramatiky. Uspořádaná dvojice (α, β), která je prvkem množiny P, se nazývá přepisovacím pravidlem a zapisuje se ve tvaru (α β). Řetězec α představuje levou stranu přepisovacího pravidla, řetězec β pak pravou stranu. Nechť existují řetězce λ a µ, kde λ, µ (N Σ). Relace G se nazývá přímou derivac, jestliže lze řetězce λ a µ vyjádřit jako: λ = γαδ µ = γβδ 4 obsahují nekonečný počet slov (Černá, Křetínský, Kučera, 2002) 5 obsahují konečný počet slov(černá, Křetínský, Kučera, 2002)

2.3 Formální jazyky a gramatiky 19 kde γ, δ (N Σ) a α β P. Relace + se nazývá derivací, jestliže existuje taková posloupnost přímých derivací υ i 1 υ i, i = 1,..., n a n 1, že platí: λ = υ 0 υ 1... υ n 1 υ n = µ Nechť existuje řetězec ϕ (N Σ). ϕ se nazývá větnou formou, jestliže platí S ϕ (řetězec ϕ se generuje ze startovacího symbolu S). Větou se nazývá taková větná forma, která obsahuje pouze terminální symboly. Jazyk L(G), tedy jazyk produkovaný gramatikou G, je definován množinou všech vět: L(G) = {w S w w Σ } Gramatika tedy znázorňuje generativní systém, kdy pomocí aplikace tzv. přepisovacích pravidel lze z vyznačeného nonterminálu generovat řetězce tvořené pouze terminálními symboly. Tyto řetězce představují věty definované gramatikou jazyka. (Češka, 2002) 2.3.3 Chomského klasifikace gramatik Noam Chomský 6 vymezil čtyři typy gramatik, které se liší tvarem přepisovacích pravidel, jež jsou obsaženy v množině přepisovacích pravidel P. Označují se typ 0, typ 1, typ 2 a typ 3. Češka (2002) tato pravidla rozvádí následujícím způsobem: Typ 0 Gramatika tohoto typu obsahuje nejobecnější tvar pravidel, který je shodný s definicí gramatiky popsané v předchozí sekci: α β, α (N Σ) N(N Σ) (N Σ) Z definice je patrné, že zde neexistují žádná omezení, proto se gramatiky typu 0 nazývají take neomezenými. 6 Noam Chomský - americký lingvista, díky němuž vznikla teorie generativní gramatiky, kterou byla ovlivněna (nejen) americká teorie lingvistiky ve 20. století (Szabó, 2004)

2.3 Formální jazyky a gramatiky 20 Typ 1 Gramatika typu 1 umožňuje vytvářet pravidla tvaru: αaβ αγβ, A N, α, β (N Σ), γ (N Σ) + nebo S ɛ Tento typ se nazývá gramatika kontextová, protože svým tvarem pravidla udává, že k nahrazení nonterminálu A řetězcem γ může dojít tehdy a jen tehdy, pokud jeho pravým kontextem je řetězec β a levým kontextem řetězec α. Kontextové gramatiky nepřipouštějí nahrazení nonterminálu prázdným řetězcem. Výjimku tvoří startovací pravidlo S, které umožňuje prázdný řetězec do jazyka zařadit. V tomto případě se ale symbol S pak už nesmí vyskytnout na pravé straně přepisovacího pravidla. Typ 2 Gramatika typu 2 umožňuje vytvářet pravidla tvaru: A γ, A N, γ (N Σ) Tento typ gramatiky se nazývá bezkontextová gramatika, poněvadž lze provádět substituci řetězce γ za nonterminál A bez ohledu na kontext, ve kterém je nonterminál A zapsán. Na rozdíl od gramatik typu 1, bezkontextové gramatiky umožňují zápis pravidla ve tvar A ɛ. I zde ale platí, existuje-li S ɛ, pak se S nesmí vyskytovat na pravé straně žádného pravidla. Typ 3 Gramatika typu 3 umožňuje vytvářet pravidla tvaru: A xb nebo A x; A, B N, x Σ Tento typ gramatiky se nazývá pravá lineární gramatika, poněvadž na pravé straně pravidla se může vyskytovat jediný nonterminál a ten musí být umístěn navíc úplně poslední, tedy vpravo na konci řetězce. Speciální případ pravé lineární gramatiky je regulární gramatika (přesněji regulární pravá gramatika), která se zapisuje ve tvaru:

2.4 Konečné automaty a jazyky typu 3 Chomského klasifikace 21 A ab nebo A a; A, B N, a Σ nebo S ɛ a z tohoto důvodu jsou gramatiky typu 3 nazývány regulárními gramatikami. Kromě pravých lineárních gramatik existují i levé lineární gramatiky. Jak uvádějí Šorm, Rybička a Haluza (2006), v tomto případě je nonterminál pravé strany umístěn jako první a pravidla se zapisují ve tvaru: A Ba nebo A a; A, B N, a Σ Jazykem typu i, i = 0, 1, 2, 3 nazýváme jazyk generovaný příslušnou gramatikou typu i. Dle tohoto označení pak podobně jako o gramatikách mluvíme o jazycích neomezených (i = 0), kontextových (i = 1), bezkontextových (i = 2) a regulárních (i = 3). 2.4 Konečné automaty a jazyky typu 3 Chomského klasifikace Konečný automat (dále jen KA) patří mezi abstraktní modely s konečným počtem stavů, které lze využít pro modelování systémů. Pracuje v diskrétním čase a aktuální stav se mění na základě vnějšího podnětu, přičemž je pro daný stav a podnět určeno, do kterého stavu systém přejde. KA se obecně dělí na deterministické a nedeterministické. Deterministické se vyznačují jednoznačností, zatímco nedeterministické tuto vlastnost nemají. (Dostál, 2008) 2.4.1 Nedeterministický konečný automat Nedeterministický KA (dále jen NKA) je definován jako 5-tice M = (Q, Σ, δ, q 0, F ), kde: Q - konečná množina stavů, Σ - konečná vstupní abeceda, δ - funkce přechodu - zobrazení Q Σ 2 Q (2 Q je množina podmnožin mnnožiny), q 0 Q - počáteční stav, F Q - množina koncových stavů Činnost konečného automatu M lze charakterizovat jako přechod z jednoho stavu do druhého. Tento přechod řídí funkce přechodu δ, která zpracovává symboly

2.4 Konečné automaty a jazyky typu 3 Chomského klasifikace 22 čtené ze vstupního řetězce. Na základě aktuálního stavu q i a přečteného symbolu a Σ pak funkce přechodu vyhodnotí, do kterého stavu q j automat přejde. Počet stavů, do kterých lze v té chvíli přejít, může být i více než jeden. Přechodová funkce tedy v případě NKA předepisuje množinu budoucích stavů Q j, kde Q j 2 Q. Přechodová funkce se zapisuje v tabulkové formě, kde řádky reprezentují množinu stavů Q a sloupce symboly abecedy. (Češka, 2002) Konfigurací automatu M se nazývá taková dvojice C = (q, w), pro kterou platí C Q Σ. Je popsána tedy stavem, ve kterém se automat právě nachází a dosud nepřečtenou částí řetězce. (Češka, 2002) Konfigurace ve tvaru (q 0, w) označuje počáteční konfiguraci a (q F, ɛ), q F F označuje konfiguraci koncovou (automat akceptuje řetězec). Přechod je definován jako relace na množině konfigurací a značí se. Celou činnost automatu lze tedy popsat jako posloupnost konfigurací značící přechod z počáteční do koncové neboli (q 0, w) (q F, ɛ). Uskutečnění přechodu z konfigurace (q i, ax) do konfigurace (q j, x) je možné pouze tehdy, je-li δ(q i, a) = {..., q j,...}. (Šorm, Rybička, Haluza, 2006) 2.4.2 Deterministický konečný automat Deterministický KA (dále jen DKA) je definován stejně jako NKA, rozdíl však spočívá v definici funkce přechodu δ. V případě DKA se δ definuje jako zobrazení Q Σ Q a předepisuje pouze jediný budoucí stav q j. 2.4.3 Jazyky akceptované KA, konstrukce NKA Mezi jazyky, které jsou akceptovány KA, patří jazyky typu 3 Chomského klasifikace 7. Nejprve je nutné převést pravou lineární gramatiku na regulární. Tohoto cíle dosáhneme následovně: 1. všechna pravidla ve tvaru A wb převedeme na řetězec pravidel A a 1 A 1, A 1 a 2 A 2,..., A n 1 a n B, kde w = a 1 a 2... a n 2. najdeme a případně odstraníme ɛ-pravidla (A ɛ) 3. najdeme a případně odstraníme jednoduchá pravidla typu A B Podobný princip funguje i u levých lineárních gramatik 8. 7 Důkaz tohoto tvrzení lze nalézt v publikaci (Češka, 2002) 8 V této práci není nutné dále rozvádět, protože implementační část výchází z pravých lineárních gramatik. Více informací o převodu levých lineární gramatik se lze dočíst v (Češka, 2002)

2.4 Konečné automaty a jazyky typu 3 Chomského klasifikace 23 Takto sestavenou regulární gramatiku lze převést na NKA dle následujících pravidel (Šorm, Rybička, Haluza, 2006): Nechť existuje gramatika G = (N, Σ, P, S). Na základě této gramatiky vytvoříme automat M = (Q, Σ, δ, q S, F ) takový, že platí L G = L M : Q = N {q F } stavy automatu jsou vytvořeny z nonterminálů gramatiky a k nim je přidán stav q F, který představuje koncový stav. Stavy se označují písmenem q s indexem v podobě odpovídajícího nonterminálu gramatiky abeceda automatu je identická s abecedou gramatiky, přechodovu funkci vytváříme na základě pravidel gramatiky; je-li A ab P, pak δ(q A, a) obsahuje q B. Je-li A a P, pak δ(q A, a) obsahuje q F, za počáteční stav automatu označíme q S, což je stav odpovídající startovacímu nonterminálu gramatiky S, prvek q F musí být vždy obsažen v množině koncových stavů F; existuje-li však pravidlo S ɛ P, počáteční stav automatu považujeme také za koncový a platí F = {q F, q S } 2.4.4 Převod NKA na DKA Z popisu konečných automatů plyne, že praktická implementace NKA by byla velice náročná, protože by se muselo procházet všemi směry, jelikož dopředu není jasné, který je správný. Proto je mnohem výhodnější implementovat DKA. U návrhu NKA a DKA to platí zase obráceně. DKA je mnohem náročnější na svůj návrh než NKA. V tomto případě ale existuje velice důležitý poznatek o vztahu mezi NKA a DKA, který zní: Každý NKA lze převést na ekvivaletní DKA 9. Nejprve tedy provedeme návrh NKA, převedeme na DKA a implementujeme. Princip převodu NKA na DKA spočívá v rozšíření původní množiny Q takovým způsobem, že několik původních stavů vytvoří jeden nový. Tento nově vzniklý stav přebírá vazby a vlastnosti stavů, z kterých byl vytvořen. Tento postup se používá na místech, kde výsledek přechodové funkce není jednoznačný stav, nýbrž množina stavů. Jestliže i po vytvoření kompozitního stavu vznikne opět nedeterministická množina, postup znovu opakujeme a spojením vytvoříme stav nový. Postup opaku- 9 Více informací o vztahu DKA a NKA se lze dočíst v (Češka, 2002)

2.5 Bezkontextové jazyky a zásobníkový automat 24 jeme do té doby, dokud se v přechodové funkci nalézá na některém místě nedeterministická množina. (Šorm, Rybička, Haluza, 2006) 2.5 Bezkontextové jazyky a zásobníkový automat 2.5.1 Bezkontextová gramatika Bezkontextové gramatiky a jazyky mají dva důležité významy. Prvním z nich je fakt, že jsme s nimi schopni popsat většinu rysů současných jak programovacích (Češka, 2002), tak i komunikačních jazyků. (Šorm, Rybička, Haluza, 2006) Druhým důležitým významem je existence algoritmů, které dokáží analyzovat věty bezkontextových jazyků. Tyto algoritmy jsou uplatňovány zejména v základech překladačů, přesněji v syntaktických analyzátorech. Bezkontextová gramatika G je definována jako čtvečice G = (N, Σ, P, S), kde: N je konečná množina nonterminálů, Σ je konečná množina terminálů, P je konečná množina přepisovacích pravidel, které se zapisují ve tvaru A α, A N a α (N Σ), S je výchozí nonterminální symbol 2.5.2 Derivační stromy Derivační (syntaktický) strom 10 je důležitým prostředkem pro grafické vyjádření struktury věty (její derivace). Při generování věty hovoříme o tzv. levé derivaci v případech, kdy je systematicky přepisován nejlevější nonterminální symbol nebo pravé derivaci, kdy je naopak přepisován nejpravější nonterminální symbol. O jednoznačném jazyce hovoříme tehdy, jestliže ke každé větě existuje právě jeden derivační strom. Každá věta generovaná gramatikou jednoznačného jazyka má vždy právě jednu (levou) pravou derivaci. Existuje-li k větě derivačních stromů více, jazyk se nazývá víceznačný 11.(Šorm, Rybička, Haluza, 2006) 10 strom - orientovaný acyklický graf, pro který platí, že má jeden uzel, do něhož nevstupuje žádná hrana (tzv. kořen stromu) a do všech ostatních uzlů pak vstupuje hrana pouze jedna; uzly z nichž žádná hrana nevystupuje se nazývají uzly (listy) stromu (Češka, 2002) 11 např. podmíněný příkaz if-then-else umožňuje konstrukci dvou derivačních stromů; více se lze dočíst v (Češka, 2002)

2.5 Bezkontextové jazyky a zásobníkový automat 25 Obr. 1: Ukázka derivačního stromu, (Češka, 2002) 2.5.3 Rozklad věty Syntaktickou analýzou neboli rozkladem věty se nazývá proces, při kterém se vytváří derivační strom pro danou větu nebo větnou formu. Program, který tuto činnost vykonává se nazývá syntaktický analyzátor (angl. parser). Konstrukce derivačního stromu využívá dvě metody: syntaktickou analýzu shora dolů syntaktickou analýzu zdola nahoru Syntaktická analýza shora dolů začíná vytvářet derivační strom od výchozího symbolu (kořene) a přes postupné přímé derivace se dopracovává k terminálům 12. Metoda zdola nahoru pak začíná vytvářet derivační strom od koncových uzlů a pomocí redukcí se snaží dopracovat ke kořenu (výchozímu symbolu). (Češka, 2002) 2.5.4 Syntaktické diagramy Syntaktické diagramy slouží k grafickému vyjádření bezkontextové gramatiky. Při kreslení diagramů používáme dva hlavní symboly: obdélník - představuje odkaz na jiný graf, tj. nonterminál a ovál - představuje terminál. K vyjádření posloupnosti symbolů ve větné formě se využívají graficky orientované linky, tzv. spojnice. Rozeznáváme čtyři druhy elementů, které můžeme při tvorbě syntaktických diagramů použít a to zřetězení symbolů, varianta, iterace a seznam s oddělovači. 12 tato metoda je použita při implementaci ve vlastní práci

2.5 Bezkontextové jazyky a zásobníkový automat 26 Vztahy mezi prvky a pravidly bezkontextové gramatiky jsou následující: zřetězení symbolů - A α 1 α 2, varianta - A α 1 α 2, iterace - A α 1 Ā, Ā, α 1 Ā ɛ; v tomto případě pravidla gramatiky musí vyjadřovat skutečnost, že α 1 se musí vyskytovat alespoň jedenkrát, a musí odrážet iteraci, tedy být rekurzivní, seznam s oddělovači - A α 1 Ā, Ā aα 1 Ā ɛ; iterace prvků s oddělovači v podobě terminálního symbolu a; odpovídající pravidla gramatiky jsou odvozena od tvaru v předchozím případě. Využití těchto diagramů je čistě praktické, zpřehledňuje gramatiky a popisuje programovací jazyk, a proto tento způsob bývá pro člověka mnohem více čitelnější.(šorm, Rybička, Haluza, 2006) 2.5.5 Zásobníkový automat Zásobníkový automat je jednocestné nedeterministrické abstraktní zařízení (viz Obr. 2), které představuje model syntaktického analyzátoru bezkontextových jazyků. Je vybaven zásobníkem reprezentujícím nekonečnou paměť. Vstupní páska je rozdělena na elementární symboly. Vstupní pásku lze číst, nikoliv na ni zapisovat. V určitém časovém okamžiku může hlava setrvat nad aktuálním záznamem a nebo se posunout doprava (proto jednocestný). Řídící jednotka tak realizuje operace prováděné čtecí hlavou a ukládá informace do zásobníku prostřednictvím funkce přechodů, množinou stavů řídící jednotky a vrcholem zásobníku. (Češka, 2002) Obr. 2: Schéma zásobníkového automatu (Češka, 2002)

2.6 Deterministické bezkontextové jazyky 27 Zásobníkový automat P je definován jako sedmice P = (Q, Σ, Γ, δ, q 0, z 0, F ) kde Q je konečná množina symbolů reprezentující vnitřní stavy automatu, Σ je konečná množina terminálů, Γ je konečná množina tzv. zásobníkových symbolů, δ je přechodová funkce, definovaná jako zobrazení δ : Q (Σ {ɛ}) Γ 2 Q Γ q 0 Q je výchozí vnitřní stav, z 0 F startovací symbol, který je na počátku vložen do zásobníku F Q je množina koncových stavů. Zásobníkové automaty, podobně jako konečné automaty, pracují na principu přecházení mezi jednotlivými konfiguracemi. Konfiguraci tvoří trojice (q, w, α) Q Σ Γ, kde q je aktuální stav řídící jednotky, w je část vstupní věty, která nebyla dosud přečtena a α představuje obsah zásobníku. Počáteční konfiguraci nazveme takovou konfiguraci zásobníkového automatu, která má tvar (q 0, w, Z 0 ). Koncovou konfiguraci zásobníkového automatu zapisujeme ve tvaru (q, ɛ, α), kde q F a, a Γ. (Šorm, Rybička, Haluza, 2006) 2.6 Deterministické bezkontextové jazyky Deterministické bezkontextové jazyky patří do skupiny bezkontextových jazyků, respektive jsou jejich podmnožinou. Jejich název koresponduje se zařízením, které tyto jazyky reprezentuje - deterministický zásobníkový automat 13. Deterministické gramatiky lze rozdělit do těchto skupin: 1. precedenční gramatiky 2. LL gramatiky 14 3. LR gramatiky Tyto jazyky mají tři nejvýznačnější vlastnosti, které je třeba vyzdvihnout (Češka, 2002): 1. efektivnost rozkladu - deterministický syntaktický analyzátor pracuje s lineárním paměťovým prostorem a časem 13 Deterministický zásobníkový automat je určitý druh zásobníkového automatu. Zobrazení δ obsahuje pro každou konfiguraci pouze jeden prvek, tedy δ : Q (Σ {ɛ}) Γ Q Γ (Šorm, Rybička, Haluza, 2006) 14 tato třída je použita při implementaci ve vlastní práci

2.6 Deterministické bezkontextové jazyky 28 2. automatizovatelnost výstavby analyzátoru syntaxe - realizaci lze řešit algoritmicky 3. snadnost nálezu syntaktických chyb a propojení se sémantickým zpracováním - deterministické syntaktické analyzátory pracují bez návratů (není potřeba zkoušet všechna pravidla než najdeme to správné) 2.6.1 LL gramatiky LL gramatika patří mezi gramatiky generované deterministickými jazyky. Generuje třídu deterministických jazyků, tzv. LL jazyků, které rovněž tvoří podmmnožinu deterministických jazyků. Název LL vychází ze dvou způsobů analýzy, které využívá: Left to right parse (rozklad zleva doprava) a Left Parse (levý rozklad). Při deterministické analýze je důležité vybrat správnou variantu pravé strany z množiny přepisovacích pravidel, které mají na levé straně stejný nonterminál. Při realizaci levého rozkladu věty a existenci pravidel tvaru A α 1 α 2... α n máme při výskytu nejlevějšího neterminálu A ve větné formě právě n možností na jeho přepis. Šorm, Rybička a Haluza (2006) popisují základní princip analýzy LL jazyka následovně: Vzhledem k tomu, že vytváříme levou derivaci věty, má každá větná forma (s výjimkou výsledné věty) tvar ξ r = a 1 a 2... a j Aβ, kde prefix a 1 a 2... a j je identický s prefixem analyzované věty. Při přechodu k další formě ξ r+1 expanzí neterminálu A pak tedy může být tento prefix obohacen o další terminální symboly, které opět musí souhlasit s analyzovanou větou. Ze všech A-pravidel je tedy potřeba vybrat tu variantu, jejíž prefix odpovídá požadovanému řetězci symbolů ve větě. Na základě toho, kolik následujících symbolů vstupní věty je potřeba znát, abychom se dokázali správně rozhodnout, hovoříme o LL(k) gramatikách, kde k je počet následujících symbolů potřebný pro výběr správné varianty. Pokud k výběru správné varianty postačuje znát jediný následující terminální symbol, hovoříme o tzv. LL(1) gramatikách 15. (Šorm, Rybička, Haluza, 2006) 2.6.2 Výpočet množin FIRST a FOLLOW Při rozhodování o variantě na pravé straně A pravidel se setkáme s problémem, kdy potřebujeme zjistit, kterým terminálem jednotlivé varianty začínají. K tomuto účelu použijeme výpočet množiny FIRST(α) dané gramatiky G = (N, Σ, P, S) podle následujícího algoritmu (Šorm, Rybička, Haluza, 2006): 15 použity při řešení vlastní práce

2.6 Deterministické bezkontextové jazyky 29 1. Předpokládejme, že α = X 1 X 2... X m, kde X i (N Σ). 2. Je-li X 1 Σ, pak FIRST(α) = {X 1 }. 3. Je-li X 1 N a X 1 aβ, pak k množině FIRST(α) přidáme terminální symbol a. 4. Je-li X 1 N a X 1 ɛ, pak k množině FIRST(α) přidáme symboly množiny FIRST(γ), kde γ = X 2... X m. Množinu FIRST je potřeba vypočítat pro všechny varianty pravých stran A-pravidla. Na místech, kde α i = ɛ, potřebujeme navíc vypočítat množinu FOLLOW(A): 1. Množina vzniklá FOLLOW(S) obsahuje ɛ. 2. Je-li A αbβ P a β ɛ, pak FOLLOW(B) obsahuje všechny prvky FIRST(β). 3. Je-li A abβ P a β ɛ, pak všechny prvky FOLLOW(A) jsou v množině FOLLOW(B). 2.6.3 Syntaktická analýza LL(1) gramatiky Zásobníkový automat řízený rozkladovou tabulkou provádí rozklad věty v zásobníku na základě symbolů čtených ze vstupní pásky. Rozkladová tabulka reprezentuje zobrazení M : (Γ {Z 0 }) (Σ {ɛ}) R, kde R nabývá pro každou dvojici (X, Y ) následující hodnoty (Šorm, Rybička, Haluza, 2006): 1. řetězec β Γ, je-li X N a zároveň A B P a zároveň Y FF(β), 2. prvek pop, je-li X = Y pro X, Y Σ, 3. prvek accept, je-li X = Z 0 a zároveň Y = ɛ, 4. prvek error v ostatních případech. Na počátku se v zásobníku nachází startovací symbol gramatiky a speciální symbol Z 0. Na vstupní pásce najdeme analyzovanou větu. Na konci zpracování, tedy v místě, kdy se automat nachází v koncové konfiguraci, se předpokládá, že v zásobníku je umístěn jediný symbol Z 0 a na vstupní pásce pak prázdný řetězec. Činnost automatu probíhá způsobem, který lze algoritmicky popsat. Podíváme se, jaký symbol se nachází na vrcholu zásobníku. Je-li to nonterminální symbol, vybere se z rozkladové tabulky podle aktuálního symbolu na vstupní pásce příslušný řetězec β, kterým se nahradí nonterminál v zásobníku. Je-li na vrcholu terminální

2.7 Sémantika 30 symbol a na vstupu je tentýž terminál, provede se operace pop, což znamená odstranění symbolu z vrcholu zásobníku a přečtení (odstranění) téhož symbolu ze vstupní pásky. Je-li vrcholem zásobníku Z 0 a věta je přečtena, je provedena akce accept, tj. přijetí věty. V ostatních případech je provedena akce error, což znamená chybu a neakceptaci věty. (Šorm, Rybička, Haluza, 2006) 2.7 Sémantika Abychom jazyk plně definovali, nelze skončit pouze u syntaktické analýzy. Ta pouze definuje jeho strukturu. Je nutné také specifikovat význam jednotlivých konstrukcí. Je tedy třeba, abychom statickým zápisům dali určitou formu dynamiky a význam. Ke analýze významu jednotlivých konstrukcí slouží tzv. sémantická analýza. Ta kontroluje, zda-li jsou deklarovány všechny proměnné, volané funkce existují a jsou definovány, atd. Po sémantické analýze pak přichází na řadu sémantická akce, která provede v příslušném místě danou operaci (např. přiřazení hodnoty do proměnné, výpis na obrazovku, atd.). S popisem sémantiky k danému programovacímu jazyku se lze setkat nejčastěji v manuálech a referenčních příručkách. (Elbl, 2003)

3 SOUČASNÝ STAV ŘEŠENÉ PROBLEMATIKY 31 3 Současný stav řešené problematiky V současnosti je na trhu dostupných několik produktů, které se prezentují jako software pro výuku algoritmizace nebo programování. Tato kapitola se věnuje nejznámějším aplikacím a programovacím jazykům, popisuje jejich vlastnosti, hodnotí cenovou dostupnost, metodickou vhodnost a praktickou využitelnost. Jednotlivé produkty jsou seřazené chronologicky od doby jejich vzniku. 3.1 Pascal Pascal je název programovacího jazyka, jehož návrh pochází ze 70. let 20. století od Niklause Wirtha, profesora na Vysoké škole technické v Curychu. Tento jazyk byl původně navržen pro studenty za účelem výuky, později se však dočkal širšího pojetí. Od svého vzniku prošel několika proměnami a inovacemi. O nejvýznačnější se postarala firma Borland (www.borland.com) a její produkt s názvem Turbo Pascal. Pascal patří mezi jazyky procedurální a obsahuje všechny základní algoritmické prvky (cykly, podmínky, std. vstup a výstup, atd.), proto je velmi vhodný pro výuku algoritmizace. Syntaxe disponuje klíčovými slovy v anglickém jazyce a i vývojová prostředí jsou pouze v angličtině. Mezi nejznámější patří již jmenovaný Turbo Pascal od firmy Borland (placený, již se nevyvíjí) a open-source kompilátor s vývojovým prostředím Free Pascal (www.freepascal.org). V praxi se spíše využívá jeho nádstavby s názvem Delphi (původně od firmy Borland, nyní vývoj převzala společnost Embarcadero), která disponuje jazykem Object Pascal. V tomto prostředí je vyvíjen např. nejznámější český editor PSPad (www.pspad.com). Obr. 3: Prostředí Free Pascal - OS Linux (zdroj: http://www.slax.org)

3.2 Robot Karel 32 3.2 Robot Karel Karel je programovací jazyk distribuovaný společně se svým vývojovým prostředím. S původní myšlenkou přišel na přelomu 70. a 80. let 20. století Richard E. Pattis. Patří mezi jazyky interpretované, zdarma dostupné a je určen pro výuku programování naprostých začátečníků. Princip práce spočívá v ovládání robota, který se pohybuje po čtvercové síti. Pomocí příkazů lze s robotem pohybovat, pokládat cihly a zase je zvedat. V původní verzi obsahuje klíčová slova v anglickém jazyce, existuje včak i verze počeštěná (http://xkarel.sourceforge.net). Překlad není příliš zdařilý, respektive se hodí použít spíše anglickou verzi, protože v češtině některé formulace zní poněkud krkolomně a nelogicky. Disponuje pouze elementárními povely (Krok, Polož, Zvedni, Vlevobok), podmínkami (JeCihla, JeZeď, JeSever, Jinak), cykly (Dokud, Dokud ne) a umožňuje tvorbu velice jednoduchých procedur. Tento jazyk není příliš rozsáhlý, nabízí pouze malé množství příkazů a navíc se svým pojetím od ostatních jazyků až příliš liší, proto je prakticky nevyužitelný. Je tak vhodný spíše pro rozvoj logického myšlení. Obr. 4: Robot Karel - online verze (zdroj: http://karel.oldium.net) 3.3 Baltazar, Baltík, Baltie Baltazar je vývojové prostředí (i jeho hlavní postava) s vlastním programovacím jazykem na bázi jazyka C vyvinuté českou firmou SGP Systems (www.sgpsys.com) v roce 1993 (poslední verze 5.0 je dostupná z roku 1998). Firma tento produkt prezentuje jako systém určený pro výuku strukturovaného programování v jazyce C, který je vhodný nejen pro dospělé, ale díky své koncepci strukturogramů, maker a česky pojmenovaných příkazů a funkcí i pro mládež a děti od 12 let.

3.4 Petr 33 Jedná se o nástroj, který obsahuje textový editor pro psaní kódů a strukturogramů, grafický editor, vlastní interpreter jazyka C (verze Profi pak i překladač) a systém nápovědy. Patří mezi produkty placené a cena se odvíjí od počtu zakoupených licencí. Baltazar je ve skutečnosti název pro 2D knihovnu implementovanou v jazyce C rozšiřující tento jazyk o nové prvky. Základní syntaxe je tedy s jazykem C totožná, funkce z knihovny jsou však již dostupné v češtině. Bohužel disponuje na dnešní dobu velmi zastaralým grafickým prostředí (na bázi DOSu). SGP systems na Baltazara navázali novým pojetím aplikace s názvem Baltík (později přejmenovaná na Baltie), který již opouští od klasického zápisu algoritmů v programovacím jazyce a přidává prvky vizuálního programování. Díky systému Drag&Drop je pomocí ikon sestavována scéna a celý program. Tento produkt se až příliš odklání od klasického způsobu zápisu algoritmů a je vhodný spíše pro děti a mládež, kteří se s počítačem teprve seznamují. Obr. 5: Baltík 4 (zdroj: http://www.sgpsys.com) 3.4 Petr Petr se prezentuje jako vizuální programovací nástroj určený k snadné a rychlé tvorbě programů. Jeho autorem je společnost Gemtree Software, s.r.o (www.gemtree.cz), první verze pochází z roku 1999 a vyvíjí se prakticky dodnes (i když vývoj již není tak intenzívní). Hlavní postavou je králík Petr, kterého lze ovládat pomocí vestavěných funkcí programu. Podobně jako Baltík, i Petr je založen na vizuálním stylu programování. Lze v něm vytvářet programy bez jakékoliv znalosti problematiky programovacích jazyků. Slouží tedy spíše k rozvoji logického myšlení (podobně jako Robot Karel) a představivosti, proto je vhodný pro děti a mládež. Obsahuje také podrobnou ná-