Piet
Piet patří mezi nejznámější ezoterické programovací jazyky. Jako zdrojové kódy se používají abstraktní obrazy složené z celkem 20 barev a jednotlivé příkazy jsou interpretovány podle změn barev sousedících pixelů. Jazyk je pojmenován podle malíře Pieta Mondriana. Vytvořil jej americký programátor David Morgan-Mar. Jeho cílem bylo vytvoření jazyka, jehož kód bude vypadat jako abstraktní umění. Postupem času vzniklo několik modifikací tohoto jazyka, liší se však zanedbatelně, převážně však způsobem, jakým jsou barvy zobrazovány.[1]
Model jazyka
editovatProgram je 2-dimenzionální obraz složený z oddělených pixelů. Pixely mohou mít libovolnou barvu, ale pouze 20 barev je validních (černá, bílá a 18 dalších viz obrázek).
Sousedící pixely se stejnou barvou se nazývají „bloky“ a jsou nejmenšími částmi kódu. Obrázky reprezentující zdrojový kód bývají pro lepší orientaci v programu zvětšeny. Políčka reprezentující jeden pixel se nazývají „Codely“. Pamětí programu je halda. Piet pracuje pouze s „Integer“ hodnotami.Znaky jsou reprezentovány svými ASCII hodnotami. Příkazový pointer má komplexní strukturu. Skládá se z:
- Pointer na aktuální barevný blok – Piet nemá implementován koncept aktuálního pixelu.
- Směrový pointer – Může ukazovat 4 směry (nahoru, dolů, vlevo a vpravo).
- Codel Chooser – Může ukazovat pouze vlevo nebo vpravo.
Codely
editovatZdrojový kód jazyka Piet má formu grafického obrazce tvořeného barvami. Samostatné pixely barev jsou v tomto jazyce velice důležité, proto jsou výstupy z programů obecně pro lepší přehlednost zvětšovány a z jednotlivých pixelů jsou vytvořeny stejnobarevné bloky. V takto zvětšených obrazcích jsou bloky barev se stejnými barvami nazývány „Codely“.
Barevné bloky
editovatZákladními jednotkami jazyka Piet jsou barevné bloky. Barevný blok je blok mající společné všechny hrany s codely stejných jedné barvy ohraničený bloky jiných barev, nebo okrajem programu. Bloky barev sousedících pouze diagonálně nejsou chápány jako sousedící. Blok může být jakékoliv barvy, tvaru a může obsahovat prázdná místa, která však nejsou chápána jako součást jednoho bloku.
Uchovávání proměnných
editovatPro uchovávání všech proměnných je v jazyce Piet použita halda anglicky „stack“. Data existují pouze ve formě integerů, které mohou být interpretovány jako unicodové hodnoty znaků. Teoreticky je halda neomezená, ale v praxi jsou implementována omezení, která její obsah limitují.
Běh programu
editovatProgram začíná provedením příkazů v levém horním Codelu. Interpret zachovává počáteční hodnotu Směrového pointeru (ukazuje vpravo) a Codel Chooser (ukazuje vlevo). Směry obou pointerů se při běhu programu často mění. Při běhu programu se barevné bloky prochází pomocí následujících pravidel:
- Interpret vyhledá nejvzdálenější okraj Směrového pointeru v aktuálním bloku.
- Interpret vyhledá Codel aktuálního bloku na okraji, který je nejvzdálenější ve směru určeném Codel Chooserem.
- Interpret přechází z aktuálního Codelu do dalšího bloku, ve směru určeném směrovým pointerem, obsahujícím nejbližší Codel.
Interpret tyto operace opakuje, dokud program neskončí.
Syntaxe
editovatČísla
editovatKaždý pixel, který nemá černou nebo bílou barvu reprezentuje integerovou hodnotu odpovídající počtu Codelů v daném bloku. Maximální velikost hodnot je v základu nekonečná, ale některé implementace jazyka tuto možnost omezují.
Černé bloky a okraje
editovatČerné bloky a okraje omezují běh programu. Pokud se interpret snaží přejít do těchto částí, program je zastaven a Codel Chooser přepne směr a pokus o změnu pozice je opakován. V případě, že přesun opět selže je Směrový pointer změní směr ve směru hodinových ručiček. Za předpokladu, že interpret neúspěšně vyzkouší všechny možné strany – nelze se přesunout jinam – program je ukončen.
Bílé bloky
editovatBílé bloky jsou tzv. „volné oblasti“ které program prochází beze změny. Pokud při běhu programu interpret narazí na toto pole, pokračuje dále ve svém směru. Průchod bílým blokem do nového pole s ne-bílou barvou neznamená, že příkaz v novem poli bude uskutečněn. Toto je elementární vlastnost při využití smyček.
Příkazy
editovatPříkazy jsou definovány přechodem z jednoho barevného bloku na druhý v pořadí, kterým interpret prochází skrz program. Příkaz, který bude proveden je vyhodnocen odstínu barev, kterými při průběhu prochází.
- push: Uloží hodnotu vyjádřenou v barevném bloku do haldy. Při chodu programu je nutno vzít na vědomí, že hodnoty z bloků nejsou automaticky uloženy a proto, chceme-li nějakou hodnotu uchovat, musíme volat tento příkaz.
- pop: Vybere první hodnotu shora haldy a smaže ji z paměti.
- add: Odebere první dvě hodnoty shora, sečte je a výsledek vloží zpět do haldy.
- subtract: Odebere první dvě hodnoty shora haldy, vypočítá budoucí vrchní hodnotu a odečte od ní současnou vrchní hodnotu. Výsledek uloží zpět do haldy.
- multiply: Odebere první dvě hodnoty shora, roznásobí je a výsledek vloží zpět do haldy.
- divide: Odebere vrchní dvě hodnoty z haldy, vypočítá výsledek dělení současné a budoucí vrchní hodnoty a výsledek uloží do haldy. Pokud je děleno nulou příkaz je, pokud není implementací ošetřeno jinak, ignorován.
- mod: Odebere vrchní dvě hodnoty z haldy, vypočítá modulo z obou hodnot a výsledek uloží.
- not: Nahradí vrchní hodnotu haldy nulou, pokud je tato hodnota nenulová, a nebo jedničkou pokud je tato hodnota nulová.
- greater: Smaže první hodnoty z haldy a uloží číslo 1 do haldy, pokud druhá hodnota shora je vyšší než první hodnota shora a 0 pokud je tomu naopak.
- pointer: Odebere vrchní hodnotu z haldy a nasměruje Směrový pointer ve směru hodinových ručitek o tolik směrů, jaká byla hodnota vrchní hodnoty(změna směru je proti směru hodinových ručiček pokud je hodnota záporná).
- switch: Odebere vrchní hodnotu z haldy a přepne Codel Chooser toikrát, kolik je hodnota odebrané jednotky(uvažuje se abolustní hodnota u záporvných číšel).
- duplicate: Uloží kopii vrchní hodnoty z haldy.
- roll: Odebere vrchní dvě hodnoty z haldy a „převalí“ zbylé hodnoty do hloubky haldy rovné hodnotě druhé jednotky, která byla smazána. Samostatné „převalení“ do hloubky n je definováno jako „pohřbení“ vrchní hodnoty do hloubky n a posunutí všech hodnot nad tuto jednotku o jednu pozici.
- in: Přečtě hodnotu z standardního vstupu jako číslo nebo znak, s ohledem na konkrétní příkaz tohoto vstupu a uloží jej do haldy. Pokud není žádný vstup definován, je tento stav považován za chybu a příkaz je ignorován.
- out: Odebere vrchní hodnotu z haldy a vytiskne ji do standardního výstupu jako číslo, nebo znak s ohledem na konkrétní příkaz tohoto vstupu.
Piedit
editovatPiedit je grafické IDE pro a integreovaný intrepret jazyka Piet. Piedit je napsán v jazyce Python . Mezi jeho základní vlastnosti patří:
- Vytváření, editování a ukládání programů pomocí uživatelského rozhraní
- Spouštění programů pomocí příkazové řádky
- Krokování běžících programů v uživatelském rozhraní[2]
Ukázkové programy
editovatHello World
editovatTento program vytiskne „Hello World!“ a poté je ukončen. Příkazy jsou zpracovávány ve směru hodinových ručiček z horního levého rohu. Poté postupuje barevným spekrem podle naprogramovaných příkazů. Tento průchod generuje potřebné ASCI kódy, které reprezentují nápis „Hello World!“.
Hello World! |
---|
Externí odkazy
editovat- Obrázky, zvuky či videa k tématu Piet na Wikimedia Commons
- Oficiální stránka jazyka Piet
- Stránka věnována IDE Piedit
Reference
editovat- ↑ Poznámka: Zdroj: http://www.dangermouse.net/esoteric/piet.html Oficiální stránka jazyka Piet
- ↑ Víz také: https://code.google.com/p/piedit/
- ↑ Poznámka: Použité obrázky pochází z anglické Wikipedie