@t[Furcsa programnyelvek]~~META:date created = 2008-10-04~~ Kis blogom előző írása olyan programnyelvekről szólt, amiket abból a célból hoztak létre, hogy megkönnyítsék az ember és a számítógép kapcsolattartását. Éppen ezért nem említettem a világtörténelem legősibb programnyelvét, a gépi kódot, amely nagyjából így néz ki: 11100010010101100010010010010010100101001010100101010100101010100101110110000011110101001011101010101011010010101101010101   Ez itt nem értelmes program, csak nyomogattam a két billentyűt, de az értelmes programok is így néznek ki. A világ minden programja így néz ki „belül”, hiszen a számítógépek mindmáig csak egyeseket és nullákat ismernek, úgyhogy végső soron minden programot ezekre kell lefordítani, hogy a gép végrehajthassa. Mindazonáltal emberi szemszögből a gépi kód elég furcsa programnyelv. De vannak olyan programnyelvek is, amiket direkt tettek furcsává. A programozók is emberek, szeretnek játszani. És a játékaikból néha érdekes dolgok sülnek ki. {{1898-1.gif }}{{ 1898-2.jpg}}Amit itt lát az olvasó, az egy festmény és egy program. A festmény Piet Mondrian //Kompozíció sárgával, kékkel és pirossal// című festménye, készült 1921-ben, olaj és vászon – a program pedig Thomas Schoch Piet című programja, amely **Piet** nyelven íródott, és arra szolgál, hogy kiírja a //Piet// nevet. (Ejtsd pít, a Pieter rövidítése.) Találós kérdés: melyik melyik? Gondolom, a megfejtés akkor is könnyű, ha az olvasó nem ismeri ezt a festményt, hiszen nyilvánvaló, hogy ha Mondrian lilát is használt volna, az benne lenne a kép címében. A Piet programnyelvet a De Stijl híres művészéről nevezte el kidolgozója, David Morgan-Mar, akinek [[http://www.dangermouse.net|honlapján]] már nyolc ilyen ezoterikus programnyelv szerepel, mind saját alkotása. De a Piet a legszebb. A programok itt absztrakt festményeknek néznek ki, mert mindegyik egy-egy kép, amin színek jelzik a különböző műveleteket. Húsz színt használ (hatot három-három árnyalatban, plusz a fehéret és a feketét), ennyivel a világon mindent meg lehet írni. Hiszen például a **Brainfuck** nyelvnek nyolc jel is elég, ami egyúttal azt is jelenti, hogy ha a nyolc jel jelentését megtanultuk, akkor elméletileg tudunk programozni Brainfuckban. A Brainfuck program egy képzeletbeli szalaggal operál, amin számok lehetnek, a program indulásakor csupa nulla. Van egy „hol tartunk a szalagon” mutató. Ennyit kell tudni ahhoz, hogy megértsük a nyolc jelet: ;;g:''>'';; eggyel jobbra lépteti a mutatót; ;;g:''<'';; eggyel balra lépteti a mutatót; ;;g:''+'';; a mutató által jelzett számot eggyel növeli; ;;g:''-'';; a számot eggyel csökkenti; ;;g:''.'';; kiírja a mutató által jelzett számhoz mint ASCII-kódhoz tartozó karaktert; ;;g:'','';; beolvas egy karaktert és a kódját tárolja a szalagon a mutatónál; ;;g:''['';; ha a mutatónál levő szám nulla, akkor a megfelelő ]-hez ugrik; ;;g:'']'';; visszaugrik a megfelelő [-hez. Ezennel gratulálok az olvasónak: éppen elvégezte a [[http://lattilad.org|LAttilaD.org]] első //teljes// nyelvtanfolyamát. A nyelv azért kapta az //agybaszó// nevet, mert ez a nyolc jel ismétlődik a végtelenségig. A szabály szerint minden egyéb jelet át kell ugrani, azok tehát megjegyzésnek számítanak. A világ minden programnyelvén meg szoktak írni legalább egy programot, a //Hello, world//öt. Feladat: kiírni egy üdvözletet a világnak. Brainfuck nyelven ez így néz ki: ''%%++++++++++ [>+++++++> ++++++++++ >+++>+<<<<-] >++.>+.++++ +++..+++. >++.<<+++ +++++ +++++++.>. +++.------. --------.>+.>.%%'' Szóközöket csak azért tettem bele, hogy a böngészőnek legyen esélye tördelni valahogy. Ami lenyűgöző a dologban, hogy ez a zagyvaság nemcsak //működik,// de //érthető,// felfogható, ha az ember veszi hozzá a fáradságot. Az első tíz pluszjel a szalag első cellájának értékét megnöveli 10-re (hiszen minden nulláról indul). Ezután csinálunk egy ciklust (a két szögletes zárójel között), ami a következő cellákban a 70, 100, 30 és 10 számokat helyezi el, és visszamegy az első cellához. Ha most egyet jobbra lépünk és kettőt növelünk, abból 72 lesz, vagyis a H betű kódja. Egyet jobbra, egyet növelünk, 101, a kis e betű kódja. És így tovább, ide-oda lépkedve, állítgatva a számértékeket, a megfelelő pillanatban kiírva a karaktert – kijön a szöveg. A Brainfuck természetesen egy //Turing-gép.// Ezeket Alan Turing brit matematikus találta fel, és azóta számtalan matematikai problémát segítettek megoldani, de néha a valóságban is megépítenek egyet-egyet (például Denis Cousineau legóból csinált, be is mutatja [[http://www.mapageweb.umontreal.ca/cousined/lego/5-machines/turing/Turing.html|ezen]] az oldalon). A Turing-gép nagyon röviden egy olyan gép, ami egy vagy több szalagból és egy író-olvasó mechanizmusból áll. Ez a fej mozog a szalag mentén (illetve általában a szalagot tekerik ide-oda és a fej áll). A szalagon olvasott adatok arra utasíthatják, hogy mozduljon a szalagon balra vagy jobbra, írjon a szalagra vagy változtassa meg belső állapotjelzőjét. A Brainfuck egy kétszalagos Turing-gép: az egyik szalagon (amit csak olvasni lehet és csak egy irányba) a program van, a másikon az adatok. Bármilyen extravagáns a Brainfuck, mégiscsak hasonlít a többi programnyelvre abban, hogy a programot az elején kell elkezdeni, aztán sorban olvasni a jeleket. A **Befunge** nyelvben ez nem így van. A nyelv kétdimenziós. Egy négyzetrácsban helyezzük el a jeleket, és mindenféle irányokban szaladgálunk benne. ;;g:''"egnufeB">:#,_@'';; Ez mindazonáltal egy egyenes vonalban megírt program. Baloldalt kell kezdeni és jobb felé haladni. A jelek a következőket csinálják: ;;g:''"'';; a következő idézőjelig minden karakter kódját a verembe teszi; ;;g:''>'';; irány jobbra; ;;g:'':'';; a verem tetején levő értéket megduplázza; ;;g:''#'';; trambulin: átugorja a következő karaktert; ;;g:'','';; kiírja a verem tetején levő számhoz tartozó karaktert, levéve a veremről; ;;g:''_'';; vízszintes HA utasítás (ha a verem tetején nulla van, akkor jobbra kell menni, különben balra); ;;g:''@'';; vége a programnak. Van több is, de ezek szerepelnek itt. Sok más nyelvhez hasonlóan a Befunge is veremmel működik. Az adatokat egy veremben helyezi el, egymás tetején, mindig a legutolsónak berakott adatot lehet kivenni legelőször. A program tehát sorban a verembe teszi a //Befunge// szó betűit, visszafelé, utoljára a //B// betűt. Aztán ezt a ;;g:'':'';; megduplázza (BBefunge) és a ;;g:'','';; kiírja. Az ;;g:''_'';; megnézi, mit talál a vermen (el is dobja onnan), és mivel nem nullát, balra fog menni, vissza a ;;g:'','';;-höz. Most az //e// betű jelenik meg. A duplázáson átugrat minket a trambulin, aztán a ;;g:''>'';; visszafordít jobbra. Most duplázunk, kiírunk, megvizsgálunk, visszafordulunk… Amikor elfogy a szöveg, az ;;g:''_'';; nullát talál a veremben (mármint üres vermet), tehát jobbra fog menni, és véget ér a program. Ez pedig egy igazi kétdimenziós Befunge program. Érdemes figyelni a nyilakat (;;g:''< > v ^'';;), amint összevissza kanyarogtatják a végrehajtást. {{1898-3.gif}} Ezek a nyelvek azért furcsák, mert megszegik a programnyelvek írásának elemi szabályát – ami éppen azért nemlétező szabály, mert meg lehet szegni és úgy is létrejöhetnek programnyelvek. A szabály, ami tehát nem létezik: „programnyelvet azért írunk, hogy a gép és az ember közötti kommunikációt az ember számára minél könnyebbé tegyük, tehát olyannak kell lennie, hogy a programozó számára minél érthetőbb legyen”. Ezek a nyelvek más szempontokat követnek. Olyan programnyelv is van, ami követi a szabályt, és //mégis// furcsa. {{1898-4.png}} Ez itt egy program. Az öt kis szövegblokk nem a tartozéka, csak a szerző magyarázatai. Magát a programot a színekkel jelölt táblácskák alkotják, az ikonokkal, a nyúlványokat összekötő színes drótokkal, a narancssárga kerettel. Ez annyira szép, hogy muszáj még egyet mutatnom. {{1898-5.png}} {{ 1898-6.jpg}}  Ez a **NXT-G** programnyelv, ami éppen azért ilyen színes-rajzos, hogy jól érthető legyen. Ezen a nyelven a jobbra látható NXT gépet programozzák, ami a Lego Mindstorms sorozat tartozéka, és olyan robotokat építenek vele, mint például a [[http://www.plastibots.com/index.php/2009/12/08/bricksorter|BrickSorter,]] ami képes szín szerint szétválogatni legókockákat (ámbár, mint a videón látható, néha hibázik). @blogf[gépi_kód Mondrian‚_Piet Piet Brainfuck Turing‚_Alan NXT-G Lego_Mindstorms legó számtech programozás programnyelv Schoch‚_Thomas De_Stijl Morgan-Mar‚_David Turing-gép matematika Cousineau‚_Denis Befunge]