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.
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 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:
>
eggyel jobbra lépteti a mutatót;
<
eggyel balra lépteti a mutatót;
+
a mutató által jelzett számot eggyel növeli;
-
a számot eggyel csökkenti;
.
kiírja a mutató által jelzett számhoz mint ASCII-kódhoz tartozó karaktert;
,
beolvas egy karaktert és a kódját tárolja a szalagon a mutatónál;
[
ha a mutatónál levő szám nulla, akkor a megfelelő ]-hez ugrik;
]
visszaugrik a megfelelő [-hez.
Ezennel gratulálok az olvasónak: éppen elvégezte a 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 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.
"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:
"
a következő idézőjelig minden karakter kódját a verembe teszi;
>
irány jobbra;
:
a verem tetején levő értéket megduplázza;
#
trambulin: átugorja a következő karaktert;
,
kiírja a verem tetején levő számhoz tartozó karaktert, levéve a veremről;
_
vízszintes HA utasítás (ha a verem tetején nulla van, akkor jobbra kell menni, különben balra);
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 :
megduplázza (BBefunge) és a ,
kiírja. Az _
megnézi, mit talál a vermen (el is dobja onnan), és mivel nem nullát, balra fog menni, vissza a ,
-höz. Most az e betű jelenik meg. A duplázáson átugrat minket a trambulin, aztán a >
visszafordít jobbra. Most duplázunk, kiírunk, megvizsgálunk, visszafordulunk… Amikor elfogy a szöveg, az _
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 (< > v ^
), amint összevissza kanyarogtatják a végrehajtást.
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.
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.
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 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).