Piet (programozási nyelv)
Piet | |
![]() | |
Paradigma | ezoterikus |
Megjelent | 1993 |
Fejlesztő | David Morgan-Mar |
Hatással volt rá | Piet Mondrian |
Weboldal |
A Piet egy vizuális, ezoterikus programozási nyelv, ahol a programok absztrakt festménynek tűnnek. A nyelv 17, nagyjából Assembly szintű utasítást ismer, az adatokat stackben tárolja. A programnyelv nevét Piet Mondrianról, a geometrikus absztrakció képviselőjéről kapta. Tervezője, David Morgan-Mar (becenevén DangerMouse),[1] eredetileg Mondrian-nak szerette volna nevezni, de a név már foglalt volt.
A színek
A színkör
A színkör 6 színre van felosztva: vörös (red), sárga (yellow), zöld (green), cián (cyan), kék (blue), magenta (magenta).
A fekete és fehér nem része a színkörnek.
Az egyéb színek használata implementációfüggő, az általános esetben a nem definiált színeket a fordító fehérként veszi figyelembe, tehát bárhol használhatóak, ahol a fehér is.
A fényesség
A nyelv 3 féle fényerőt különböztet meg: fényes (light), normál (normal), sötét (dark).
Színtáblázat
A színkörből és a fényerőből az alábbi 18+2 kombináció jöhet létre:
black (fekete) #000000 | |||||
white (fehér) #FFFFFF | |||||
light red (világosvörös) #FFC0C0 | light yellow (világossárga) #FFFFC0 | light green (világoszöld) #C0FFC0 | light cyan (világos cián) #C0FFFF | light blue (világoskék) #C0C0FF | light magenta (világos magenta) #FFC0FF |
red (vörös) #FF0000 | yellow (sárga) #FFFF00 | green (zöld) #00FF00 | cyan (cián) #00FFFF | blue (kék) #0000FF | magenta (magenta) #FF00FF |
dark red (sötétvörös) #C00000 | dark yellow (sötétsárga) #C0C000 | dark green (sötétzöld) #00C000 | dark cyan (sötét cián) #00C0C0 | dark blue (sötétkék) #0000C0 | dark magenta (sötét magenta) #C000C0 |
A program
![](http://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Piet_Program_Hello_World.gif/100px-Piet_Program_Hello_World.gif)
A piet program a definiált színekből álló kompozíció. Maga a nyelv nem a blokkokból, hanem az egymást követő blokkok közötti változásból áll elő. A színkör és a fényerő változását is ciklikusan értelmezzük (azaz a lista utolsó eleme után újra jön az első). Ennek az eredménye, hogy a piet program meglehetősen látványos megjelenésű.
A program végrehajtása tulajdonképpen egy sétának is tekinthető. A végrehajtást két mutató, a Direction Pointer (azaz irányjelző, DP) és a Codel Chooser (blokkválasztó, CC) teszi lehetővé. Az irányjelzőnek négy értéke lehet a négy lehetséges irány szerint (jobbra, le, balra, fel; az óramutató járása szerint), a blokkválasztó pedig a két kezet szimbolizálja, így két értéke van (bal kéz, jobb kéz).
A színek és a fényesség ciklikus, így összesen 18 utasítás lehetséges. Ebből egy kiesik a változás hiánya miatt, tehát egy Piet program 17 féle parancsból állítható össze.
A program alapegysége a codel, ami valójában egy pixelnyi területet jelképez. A program ugyanis pixelenként lép, azonban az egypixelnyi méretek általában nehezen észlelhetőek vizuálisan. A másik egység a színblokk, ami az azonos színű codelekből álló összefüggő tartomány. A codelek tehát négyzetes alakúak, a blokkok pedig egymással érintkező (tehát nem átlósan elhelyezkedő) codelekből álló, de tetszőleges alakú tartományok.
A színblokkok maguk egy-egy egész számot jelképeznek, történetesen a blokkot alkotó codelek számát. Így egy Piet program ábrája egyszerre tartalmaz konstansokat és utasításokat egy egységbe zárva. Ezeket a blokkokat járja be az interpreter, meghatározott szabályok szerint:
- A blokk belépési pontjától a DP szerinti legtávolabbi határig haladunk.
- A határnál a CC szerinti legtávolabbi codelt megkeressük.
- Az interpreter ennek a codelnek a blokkjába lép a DP irányában.
Ha az interpreter eléri a kép szélét, határát, akkor a CC értékét felcseréljük. Ha így is határba ütközünk, akkor a DP értékét egy negyed fordulattal negatív irányba változtatjuk (azaz az óramutató járásával azonos irányban), és természetesen a CC értéke megint cserélődik. Összesen nyolc lépési lehetőség van, ha ennyiből a program nem tud továbblépni, a futásnak vége.
A végrehajtás szempontjából a fekete és fehér blokkok speciális jelentéssel bírnak:
- A fekete blokk határt jelent a végrehajtás szempontjából. Itt ugyanaz történik, mintha az interpreter a kép szélét érné el, ez programvezérlési eszközként használható.
- A fehér blokk üres utasítást jelent, az interpreter egyenes áthalad rajta, amíg színblokkba nem lép. Mivel a fehérnek nincs színe, így színváltozás sincs, azaz utasítás végrehajtása nem történik. Ha határhoz ér, akkor mind a CC, mind a DP értékét egy lépéssel változtatja, mindaddig, amíg színes blokkba nem kerül. Ha ennek során visszafelé indul a program nyomvonalán, vagy nem talál színes blokkot, a program véget ér. A fehér blokkok alkalmasak ciklusok szervezésére.
A Piet utasításai
A nyelvben a következő 17 utasítás szerepel:[2]
A Piet utasításai | Fényesség változása | |||
---|---|---|---|---|
Nincs | Eggyel sötétebb | Kettővel sötétebb | ||
Szín változása | Nincs | push: Az elhagyott blokk értékét a verembe teszi | pop: A verem legfelső értékét eldobja | |
Egy lépés | add: Kiveszi a legfelső két értéket a veremből, majd az összegüket visszateszi | subtract: Kiveszi a legfelső két értéket a veremből, majd a különbségüket visszateszi | multiply: Kiveszi a verem legfelső két értékét a veremből, és a szorzatukat visszateszi | |
Két lépés | divide: Kiveszi a két legfelső értéket, az elsővel elosztja a másodikat, az eredményt (egész) visszateszi a verembe. A nullával osztás eredménye implementációfüggő | mod: Kiveszi a két legfelső értéket, a másodiknak képezi az elsővel való osztási maradékát, majd ezt visszateszi a verembe | not: A legfelső értéket kiveszi, majd 1-et tesz vissza, ha ez 0, egyébként 1-t | |
Három lépés | greater: Kiveszi a két legfelső értéket, majd 1-et tesz vissza, ha a második nagyobb, egyébként 0-t | pointer: Kiveszi a legfelső értéket, majd ennyi negyedfordulatot fordít a DP-n óramutató járása szerint | switch: Kiveszi a legfelső értéket, majd ennyiszer cseréli CC értékét | |
Négy lépés | duplicate: A verem tetejére a legfelső elem másolatát teszi | roll: Kiveszi a verem két legfelső elemét, majd a második által meghatározott számú további elemet az első által meghatározott számú alkalommal görgeti[3] | in (number): Beolvas az STDIN-ről egy egész értéket, és a verem tetejére teszi | |
Öt lépés | in (char): Beolvas az STDIN-ről egy Unicode karaktert, és a verem tetejére teszi | out (number): Kiír az STDOUT-ra egy egész értéket a verem tetejéről, majd az értéket eldobja | out (char): Kiír az STDOUT-ra egy Unicode karaktert a verem tetejéről, majd az értéket eldobja |
A verem
A Piet minden értéket egész számként veremben (stack) tárol. Az adatok megfelelő utasításokkal karakteres formában, Unicode karakterekkel is kiírathatóak. A verem mérete és a túlcsordulás kezelése implementációfüggő. Ennek eredményeképpen a nyelvben nincs szükség változókra, azokat a verem adatai, a velük végzett műveleteket pedig a veremeljárások helyettesítik.
Jegyzetek
- ↑ dangermouse.net – David Morgan-Mar (amerikai angol nyelven). (Hozzáférés: 2023. január 8.)
- ↑ DM's Esoteric Programming Languages - Piet. www.dangermouse.net. (Hozzáférés: 2022. december 18.)
- ↑ Görgetés alatt értendő, hogy az első elemet felvesszük, a többit eggyel előbbre helyezzük, majd a végére illesztjük a kivett elemet.
Források
- A Piet weboldala
További információk
- mintaprogramok
- npiet interpreter és editor
- Egy C++-ban írt interpreter
Kapcsolódó szócikkek
- Ezoterikus programozási nyelv
- Absztrakt művészet
- Malbolge programozási nyelv
Informatikai portál • összefoglaló, színes tartalomajánló lap