Programovací jazyky určené pro výuku programování

by Lukáš Bílek

Obsah

1. Programovací jazyky určené pro výuku programování

2. Programovací jazyk Logo

3. Želví grafika a její vliv na další vývoj výukových programovacích ja­zyků

4. Ukázka použití programových smyček, rekurze a želví grafiky v LOGU

5. KROK, VLEVO, KROK, KROK, ZVEDNI: programovací jazyk Karel

6. Řešení algoritmizova­telných problémů v programovacím jazyku Karel

7. Obsah následující části článku

8. Odkazy na Internetu

1. Programovací jazyky určené pro výuku programování

V dnešním článku, který shodou okolností vychází právě v první den letních prázdnin (popravdě řečeno se o úplnou náhodu nejedná ;-), si popíšeme některé známé i méně známé programovací jazyky a jejich dialekty, které byly navrženy pro výuku programování, algoritmizace, programovacích technik a v některých případech též návrhu datových struktur. Není bez zajímavosti, že mnohé z těchto jazyků jsou použity v projektech typu One Laptop per Child (OLPC). Některé z dále popsaných programovacích jazyků jsou určeny pro předškolní děti, popř. pro děti na prvním stupni základních škol. I přes zdánlivou jednoduchost jsou však některé z těchto jazyků překvapivě efektivní i pro tvorbu složitějších aplikací, samozřejmě v závislosti na tom, jaké knihovny daný programovací jazyk či jeho implementace obsahuje (například tvorba jednodušší hry v dále zmíněném systému Scratch je i pro začínajícího programátora otázkou několika desítek minut). Jedním z těchto jednodušších programovacích jazyků je i jazyk Karel (pojmenovaný po spisovateli Karlu Čapkovi), jehož základní vlastnosti i různá rozšíření budou popsány v navazujících kapitolách.

Obrázek 1: Jedna z variant vývojového prostředí programovacího jazyka Karel.

Zajímavé však je, že například několik prvních týdnů výuky metodiky programování na Stanfordské universitě je věnováno zdánlivě velmi jednoduchému programovacímu jazyku Karel, s pomocí něhož se studenti seznamují se základy programování a teprve v navazujících týdnech (a samozřejmě i v mnoha pokročilejších kurzech) se přechází na složitější universální i specializované programovací jazyky. Ostatně sami můžete tento kurz alespoň virtuálně navštívit – jednotlivé lekce úvodního kurzu do programování na Stanfordské universitě jsou dostupná online: Introduction to Karel (prvních několik minut je věnováno organizaci výuky, vlastní popis programovacího jazyka Karel začíná až od cca páté minuty). U některých současných dialektů tohoto programovacího jazyka se jejich podoba s původním Karlem hledá již velmi nesnadno – příkladem mohou být například rozsáhlé virtuální světy s mnoha samostatně programovatelnými entitami či na druhé straně spektra tuzemský jazyk Baltík, v němž se příkazy nemusí zadávat textově, ale pomocí ikon.

Obrázek 2: Grafické uživatelské rozhraní aplikace Imagine Logo, což je jedna z moderních variant Loga.

Jiným příkladem může být například programovací jazyk LOGO, jehož některé verze jsou používány i mnoha váženými vědci při programování různých simulací, expertních systémů nebo systémů umělé inteligence – AI. Další programovací jazyky, s nimiž se dnes alespoň ve stručnosti seznámíme, jsou určeny spíše pro výuku programování či algoritmizace na středních či vysokých školách, což je případ dnes již poněkud zastaralého Pascalu, který je postupně nahrazován jinými programovacími jazyky, ať již dynamicky typovanými (Python, různými verzemi Lispu a Scheme či na některých universitách Scalou a Groovy) nebo některým zástupcem „mainstreamových“ programovacích jazyků, především Javou a C#. Výčet dnes uvedených programovacích jazyků určených pro výuku programování samozřejmě není úplný, takže se s některými dalšími jazyky, vývojovými prostředími či nadstavbami obecných programovacích jazyků seznámíme v navazujícím článku.

Obrázek 3: Rozhraní projektu Squeak založeného na Smalltalku.

2. Programovací jazyk Logo

Historicky jedním z prvních programovacích jazyků, který byl vyvinut s ohledem na snadnou a efektivní výuku programování, je jazyk Logo, jehož první verze vznikla již v roce 1967, tj. o celé desetiletí dříve, než začaly být dostupné první typy domácích osmibitových počítačů, jejichž vliv na výuku programování je značný. Někteří lidé sice považují tento jazyk za pouhou dětskou hračku (určitou obdobu počítačových her), ovšem ve skutečnosti se jedná o velmi zajímavý programovací jazyk, který je neustále zdokonalován a používán, zejména na základních ale i středních školách, kde je využíván jak pro výuku algoritmizace, tak i jako pomůcka při názorné výuce geometrie. Programovací jazyk Logo je postaven na takzvané konstruktivní vzdělávací filozofií a je navržen k podpoře konstruktivního učení. Konstruktivismus vysvětluje znalosti a dovednosti, jak jsou vytvořeny žáky v jejich vlastních myslích, prostřednictvím vzájemné interakce s jinými lidmi a okolím. Tato zajímavá teorie je spojena především se švýcarským psychologem Jeanem Piagetem, který strávil mnoho času studováním a zdokumentováním procesu učení malých dětí. S Piagetem spolupracoval i Seymour Papert, který později stál u vzniku Loga.

Obrázek 4: UCB Logo je jedním z představitelů tradičních interpretrů jazyka Logo, vybavený systémem pro práci se želví grafikou popsanou v navazující kapitole. Tento interpret je dostupný pro většinu platforem, samozřejmě včetně Linuxu.

Z programátorského hlediska je programovací jazyk Logo postaven na podobných principech jako například jazyk LISP (ostatně není bez zajímavosti, že první verze Loga byla implementována právě v LISPu), ovšem jeho syntaxe je odlišná, což v případě Loga vede k tvorbě čitelnějších programů, které se vizuálně odlišují od Lispovského „lesa závorek“. Navíc se matematické a logické výrazy v Logu zapisují v infixové podobě, na rozdíl od formy prefixové používané LISPem. Tvorba programů v Logu vede žáky k dekompozici problému na jednodušší podproblémy, ale i k opačnému postupu – tvorbě nových slov (což jsou pouze jinak pojmenované funkce), kterými se repertoár dostupných příkazů (slovník) postupně rozšiřuje – jazyk se „učí“ novým příkazům. Logo pro řízení běhu programu nabízí standardní příkaz if, popř. jeho plnou verzi ifelse.

Obrázek 5: Obrazec vzniklý pomocí želví grafiky a programu obsahujícího dvojici vnořených programových smyček typu „repeat“.

Kromě toho jsou v mnoha interpretrech tohoto jazyka dostupné i příkazy case a cond, které nahrazují v několika ohledech běžnou programovou konstrukci typu switch-case. Pokud však nějaký interpret Loga příkaz case či cond neobsahuje (příkladem mohou být verze Loga určené pro osmibitové mikropočítače), je možné ho doprogramovat – stačí si uvědomit, že program je chápán jako (datový) seznam příkazů a podmínky je možné zapsat formou výrazů, které se vyhodnotí na logickou nepravdu či pravdu. Na tomto místě možná již začíná být zřejmé, že na první pohled zdánlivě jednoduchý programovací jazyk ve skutečnosti umožňuje díky přímé manipulaci s programem zavádět do syntaxe jazyka nové konstrukce, podobně jako je tomu například v LISPu.

Obrázek 6: Ukázka použití želví grafiky v Logu.

Standardní Logo dále programátorům nabízí pouze jeden typ smyčky. Jedná se o počítanou smyčku volanou příkazem repeat n, kde n je výraz znamenající počet opakování těla smyčky. Tvůrci Loga předpokládali, že se ostatní typy smyček nahradí rekurzí, podobně jako v programovacích jazycích LISP a Scheme, a z tohoto důvodu také žádné další typy smyček do interpretru nepřidávali (dokonce i počítaná smyčka repeat v některých dialektech Loga nepoužívá počitadlo, tj. proměnnou, která by se zvyšovala s počtem opakování smyčky).

Obrázek 7: Další ukázka možností želví grafiky.

Ve většině moderních implementací Loga však můžeme narazit i na další typy smyček, například počítanou smyčku for, while (s podmínkou vyhodnocovanou na začátku smyčky) či do-while (s podmínkou vyhodnocovanou naopak na konci těla smyčky). Taktéž se můžeme poměrně často setkat se smyčkami typu for-each, které jsou v Logu velmi užitečné, zejména při práci se seznamy a textem (jenž je z historických důvodů představován seznamem slov, nikoli jedním řetězcem).

Obrázek 8: Při tvorbě tohoto obrázku se, na rozdíl od obrázků předchozích, již musely používat proměnné. Zajímavé je, že v Logu je možné programovat poměrně dlouho bez znalosti proměnných (ostatně podobné je to v případě programovacího jazyka Karel).

3. Želví grafika a její vliv na další vývoj výukových programovacích ja­zyků

Jednou z nejznámějších a pro výuku algoritmizace taktéž nejužitečnějších vlastností programovacího jazyka Logo je takzvaná želví grafika, anglicky turtle graphics. Právě želví grafika velkou mírou přispěla k poměrně značné oblíbenosti a také rozšíření tohoto programovacího jazyka, především v zahraničním školství. V USA se zpočátku Logo šířilo spolu s počítačem Apple II a později Commodore C64 i Apple Macintosh, zatímco v Evropě se děti poprvé s Logem seznámily na domácích osmibitových počítačích, především na Atari, Spectru, v tuzemsku na PMD, Didaktiku, IQ 151 atd. Pojďme si nyní říci základní informace o této zajímavé součásti Loga a také o začlenění želví grafiky do dalších programovacích jazyků a aplikací (želví grafika totiž byla tak úspěšná a přitom implementačně jednoduchá, že se začala používat i mimo samotné Logo).

Obrázek 9: Historický screenshot pořízený v jedné z prvních verzí programovacího jazyka Logo.

Základem želví grafiky je virtuální želva (turtle), která se na základě poměrně malé množiny příkazů dodávaných napsaným programem (skriptem) či přímo pomocí interaktivního zápisu příkazů, pohybuje po obrazovce a přitom za sebou vykresluje stopu složenou z úseček. Tato virtuální želva se tedy chová podobně jako reálná želva, která se pohybuje po hladké pískové pláži a zanechává za sebou stopu. Původní Logo nedisponovalo pouze virtuální (vykreslovanou) želvou, ale skutečným malým robotem ve tvaru želvy, který byl radiovým spojením propojen s řídicím počítačem a reagoval na základní příkazy: pohyb vpřed, pohyb vzad, otočení doleva a otočení doprava. Navíc uměl tento robot reagovat i na jeden „multimediální“ příkaz – zapnutí zvonku. Je zřejmé, že pro výuku malých dětí je pohybující se reálný předmět mnohem zajímavější než pouhý obrázek, na druhou stranu však byl (prý) pohyb robota poměrně nepřesný, zejména při otáčení.

Obrázek 10: Projekt NetLogo je sice založený na tradičním jazyku Logo, ovšem rozšiřuje možnosti tohoto jazyka mnoha způsoby, zejména s ohledem na možnost snadné tvorby různých simulací.

Dnešní implementace programovacího jazyka Logo většinou (kromě několika komerčních distribucí, například LEGO/Loga a několika amatérských projektů) touto možností již nedisponují, takže se budeme muset spokojit s virtuální želvou pohybující se na obrazovce. V některých implementacích Loga je želva zobrazena poměrně reálným obrázkem želvy viděné z ptačí perspektivy (jedná se například o Atari Logo, Commenius Logo, Imagine), většinou se však na obrazovce zobrazuje pouhý rovnoramenný trojúhelník, podobně jako ve hrách typu Xpilot nebo Asteroids. Jednotlivé implementace se od sebe také liší tím, zda za sebou želva stopu vykresluje „hlavičkou“, svým středem či „zadečkem“.

Obrázek 11: Simulace spuštěná v NetLogu.

To jsou však pouze kosmetické rozdíly, funkce želví grafiky tím není nijak ovlivněna, což konkrétně znamená, že při zatáčení želvy nedochází ke kreslení oblouku, ale pouze k ostrému lomu kreslené polyčáry. Význam želví grafiky spočívá v tom, že pohyb želvy dává uživatelům (tj. především dětem) okamžitou a vizuální odezvu na jejich programy, takže všechny chyby je poměrně snadné ihned identifikovat (a někdy méně snadné opravit). Díky želví grafice se taktéž dají tvořit i poměrně složité programy bez použití proměnných – jediným stavem běžícího procesu je pozice a natočení želvy v ploše.

4. Ukázka použití programových smyček, rekurze a želví grafiky v LOGU

V předchozí kapitole jsme si řekli, že virtuální želva zobrazená na obrazovce dokáže reagovat na několik příkazů. Jedná se především o příkazy left (natočení doleva o zadaný počet stupňů), right (natočení doprava), forward (posun želvy dopředu o zadaný počet kroků) a back (posun želvy zpět). Plocha, po níž se želva pohybuje, má u většiny implementací rozměry 400×400 kroků, přičemž je možné nastavit, zda se želva z této plochy může dostat ven (tj. kreslit mimo vyhrazenou oblast), nebo se při pokusu o opuštění plochy objeví na druhé straně oblasti (takzvaný wrapping). S využitím programové smyčky typu repeat a čtyř výše zmíněných příkazů pro změnu stavu želvy je možné vykreslit překvapivě složité obrazce, například květ, který si můžete prohlédnout na pátém obrázku (viz předchozí kapitoly):

to kruznice :krok repeat 360 [ forward :krok left 1 ] end to kvet :pocet repeat :pocet [ kruznice 1 left 360/:pocet ] end draw kvet 10

Obrázek 12: Takzvaná sněhová vločka Helge von Kocha je fraktální útvar, který je možné v Logu vytvořit pomocí jednoduché rekurzivně volané procedury.

Mnohem silnější nástroj, než je pouhé opakování části kódu pomocí programové smyčky repeat, však představuje rekurze, která je samozřejmě v Logu plně podporována. V následujícím příkladu je ukázáno, jak lze rekurzi použít spolu s želví grafikou pro vykreslení fraktální sněhové vločky Helge von Kocha:

to koch_curve :size :iteration ifelse :iteration>0 [ koch_curve :size/3 :iteration-1 left 60 koch_curve :size/3 :iteration-1 right 120 koch_curve :size/3 :iteration-1 left 60 koch_curve :size/3 :iteration-1 ][ forward :size ] end to koch_snowflake :size :iteration repeat 3 [ koch_curve :size :iteration right 120 ] end ; nastavení velikosti kreslicí plochy v Turtle Tracks (draw 300 300) ; vykreslení pěti iterací sněhové vločky Helge von Kocha koch_snowflake 100 5

Obrázek 13: Sněhová vločka Helge von Kocha – úroveň rekurze nastavena na hodnotu 2.

Další příklady je možné si vyzkoušet přímo z webového prohlížeče na adrese viz například následující ukázky:

Obrázek 14: Sněhová vločka Helge von Kocha – úroveň rekurze nastavena na hodnotu 3.

5. KROK, VLEVO, KROK, KROK, ZVEDNI: programovací jazyk Karel

Dalším „dětským“ programovacím jazykem, který se v některých ohledech podobá výše zmíněnému Logu, je programovací jazyk Karel pojmenovaný po Karlu Čapkovi na paměť jeho hry R.U.R. Tento jazyk vytvořil v roce 1981 Richard E. Pattis a vzápětí po svém uvedení se tento jazyk rozšířil na všechny v té době používané osmibitové domácí mikropočítače. Není se čemu divit, protože se jedná o jazyk velmi jednoduše implementovatelný (dokonce existovalo mnoho jeho implementací v BASICu) a i jeho nároky na grafické schopnosti počítače jsou mnohem menší než v případě programovacího jazyka Logo. Základem prostředí Karla je dvourozměrná plocha rozdělená pravidelnou mřížkou na políčka, po kterých se může pohybovat robot (nazvaný samozřejmě Karel). Některá políčka mohou být obsazena zdí (nelze na ně tedy vkročit) nebo se na políčku může nacházet takzvaná značka (v anglických implementacích nazvaná beeper).

Obrázek 15: Česká varianta programovacího jazyka Karel, která navíc k původnímu jazyku přidává možnost práce s proměnnými.

Robota lze ovládat pomocí čtyř příkazů vypsaných v následující tabulce:

Příkaz Význam move přesun robota ve směru, kterým se dívá (S, J, Z, V) o jedno políčko turnLeft otočení robota o 90°doleva putBeeper položení značky na políčko, na němž se robot právě nachází pickBeeper zvednutí značky (pokud se na políčku nachází)

Obrázek 16: V projektu Greenfood lze mj. používat i dialekt programovacího jazyka Karel.

Povšimněte si, že robot se zprvu nedokáže například otočit doprava nebo chodit pozpátku – tyto „vyspělé“ příkazy se musí teprve naučit pomocí uživatelských procedur. Aby se robot mohl při procházení po čtverečkové ploše zorientovat a zjistit, jaké je jeho okolí, má k dispozici několik takzvaných predikátů, které lze použít jak v podmíněných blocích při větvení programu, tak i jako podmínky pro ukončení smyčky typu while (jiné typy smyček většinou nejsou implementovány a ani nebývají zapotřebí). Základní predikáty jsou vypsány v tabulce (identifikátory predikátů se však v různých implementacích Karla mohou měnit):

Predikát Význam IsBeeper robot stojí na políčku se značkou IsWall před robotem se nachází zeď IsNorth robot je otočen směrem k severu, tj. k hornímu okraji obrazovky

Obrázek 17: Guido van Robot je adaptace Karla v programovacím jazyce Python. Tento název má jeden skrytý význam – Guido (tvůrce Pythonu) se příjmením jmenuje Rossum, což je současně i příjmení vynálezce robotů z Čapkovy hry R.U.R.

6. Řešení algoritmizova­telných problémů v programovacím jazyku Karel

Příkazy a predikáty uvedené v předchozí kapitole jsou doplněny ještě příkazem pro tvorbu nových slov (Procedure popř. Define) a taktéž příkazem pro tvorbu programové smyčky while zapisovaným formou while predikát nebo while not predikát. Tento zdánlivě velmi jednoduchý jazyk, který například vůbec nezná pojem „proměnné“ nebo „parametru funkce“, je ve skutečnosti možné použít pro řešení poměrně velkého množství různých algoritmizova­telných problémů. Prvním úkolem, který většina začínajících programátorů musí vyřešit, je naučení robota Karla novým příkazům a predikátům, například turnRight (otočení robota doprava, realizováno třemi otočeními doleva), back (krok směrem vzad – musí se implementovat s využitím otočení vzad), frontIsClear (dotaz, zda je políčko před robotem prázdné), leftIsClear (zda je políčko nalevo od robota prázdné) atd.

Obrázek 18: V prostředí Greenfoot je robot Karel představován objektem, jehož stav je možné měnit pomocí metod pojmenovaných stejně či podobně jako v původním jazyku Karel.

S využitím těchto příkazů je dále možné implementovat i tak složité algoritmy, jako je průchod bludištěm (značky lze použít namísto Ariadniny nitě), uklizení značek na jediné místo označené zdí popř. jinou značkou, řešení problému N dam na šachovnici atd. Právě z tohoto důvodu se programovací jazyk Karel poněkud překvapivě používá i na středních a vysokých školách, i když se jedná, jak jsme sami viděli, o jazyk s pouhými čtyřmi příkazy, trojicí predikátů a jedním typem programové smyčky. Jeden z důvodů, proč je i takto jednoduchý jazyk použitelný pro tvorbu relativně složitých algoritmů je ten, že celý stav běžícího programu je, podobně jako v Logu, uložen ve formě pozice a orientace robota a taktéž pozic značek a zdí v ploše rozdělené na políčka. Stav programu nelze ukládat nikam jinam, což je zaručeno neexistencí proměnných a parametrů funkcí (procedur).

Obrázek 19: Implementace programovacího jazyka Karel na československém osmibitovém mikropočítači On­dra.

Animované ukázky řešení některých problémů Karlem lze najít například na YouTube:

7. Obsah následující části článku

Ve druhé části článku o programovacích jazycích vhodných pro výuku programování se zaměříme především na jazyky, které kladou důraz na návrh vhodné struktury dat popř. se s pomocí nich dá procvičit objektově orientovaný návrh a objektově orientované programování. Zmíníme se jak o klasickém výukovém jazyce Pascal, tak i o projektu Squeak, což je implementace virtuálního stroje plně objektově orientovaného programovacího jazyka Smalltalk s vlastním grafickým uživatelským rozhraním, knihovnami pro práci s multimédii atd. Na Squeaku jsou založeny projekty Scratch a Etoys určené jak pro výuku programování, tak i pro snadnou a rychlou tvorbu multimediálních aplikací, především her (což je samozřejmě pro děti mnohem zajímavější než stá implementace algoritmu pro řazení prvků v poli). I o těchto projektech se příště zmíníme, protože se v současnosti jedná o jedny z nejzajímavějších multimediálních vývojových prostředí, které je možné ve školách či programátorských kroužcích použít.

Obrázek 20: Ve Squeaku je vše objektem – pravdivostní hodnoty, čísla ale i geometrické tva­ry.

Obrázek 21: Pracovní prostředí Squeaku se v mnoha ohledech odlišuje od běžných programátorských vývojových prostředí (IDE).

8. Odkazy na Internetu

Leave a Comment