Furcsa programnyelvek

2008. október 4.

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.gif1898-2.jpgAmit 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;

[#u 5d#] 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.

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 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).