Brainfuck Compiller
A Brainfuck programozási nyelv egy nyolc utasítást tartalmazó Turing-teljes ezoterikus programozási nyelv. A nyelvet Urban Müller készítette Amiga OS 2.0 alá azzal a céllal, hogy olyan Turing-nyelvet hozzon létre, amire a lehető legkisebb fordítóprogramot meg tudja írni. Ez eredetileg 240 byte hosszú volt, de később sikerült 171 byte-ba is belezsúfolni. Vagyis a nyelv megalkotásakor nem a használhatóság volt a szempont, ahogy arra a név is utal, az egyik legnehezebb, legátláthatatlanabb programozási nyelv lett az eredmény, bár elvileg minden algoritmus leprogramozható benne...
A nyelvnek egy univerzális byte mutatója van, aminek a neve "pointer". Ez szabadon mozoghat egy 30 000 byte nagyságú tömbben, melynek alapértékei nullák. A pointer a tömb elején indul.
A nyelv nyolc parancsát egy-egy karakter reprezentálja:
> | A pointer növelése eggyel. |
< | A pointer csökkentése eggyel |
+ | A pointernél levő byte értékének növelése eggyel. |
- | A pointernél levő byte értékének csökkentése eggyel. |
. | A pointernél levő byte kiírása ASCII karakterként. |
, | Byte bekérése és a pointernél tárolása. A bevitt karakter ASCII kódjának decimális értékét tárolja, tehát a '2' beadása esetén 50-et. |
[ | Ugrás a következő, megfelelő ] jel utánig, ha a pointer alatti byte nulla. |
] | Ugrás az előző, megfelelő [ jelig. |
Minden más karaktert a fordító figyelmen kívül hagy, azaz megjegyzés szövegeként használható. A parancsok közé (szóköz) egyáltalán nem kell, sortörés, szóköz karakterek csak a jobb olvashatóságért(???) érdemes használni.
Nyilvánvaló, hogy a nyelvből egészen elemi funkciók is hiányoznak. Nemcsak, hogy egy konstans elhelyezése egy adott memóriacellában, de a szám kiírása is nehézségbe ütközik, hiszen semmilyen számábrázolás nem létezik. Így persze összeadás sincs, A+B helyett A-hoz hozzá kell adnunk egyet B-szer. Egyetlen 'A' betű (CHR$(65) kiírása pl.:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
"Lustábbak" persze megtehetik, hogy nem írnak le 65 darab + jelet, inkább 13-szor hozzáadnak ötöt a kezdetben 0 értékhez és az eredmény íratják ki. Ehhez felhasználhatjuk a ciklusszervezésre való egyetlen utasításpárt ([, ]):
> (itt lesz az eredmény)
> +++++++++++++ (ciklusváltozó)
[ < +++++ (eredményhez hozzáadunk ötöt)
> - (ciklusváltozó értékének csökkentése)
]
< . (eredmény kiírása)
Ember nem gondolta volna 40 éve, hogy ennyire fogunk örülni egy képernyőn megjelenő 'A' betűnek... Egy programozási nyelvvel történő ismerkedés első lépése szokott lenni a "Hello World!" üzenet kiírása. Ez itt annyira nem is sima "ügy":
+++++ +++++
[
> +++++ ++
> +++++ +++++
> +++
> +
<<<< -
]
> ++ .
> + .
+++++ ++ .
.
+++ .
>++ .
<< +++++ +++++ +++++ .
> .
+++ .
----- - .
----- --- .
> + .
Túlcsordulás ellenőrzés nincs, nulla értékét csökkentve 255, 255-öt növelve 0-át kapunk. 255-öt tehát a legegyszerűbben így kapjuk meg (0-1):
-
Ezt ciklusszervezéskor ki lehet használni, pl. az ASCII karakterkészletet megjelenítésekor (A 255. karakter kiírása után a ciklusváltozó 0 lesz, tehát leáll):
+[.+]
A ciklusszervezésre a lehető legegyszerűbb - gyakorlati jelentőséggel is bíró - példa egy byte lenullázása (mert pl. korábban már használtuk):
[-]
Az Enterprise fordító 1196 byte méretőre hízott, viszont ezért a "drámáért" cserébe kényelmi funkciókat kapunk. A program kapott egy menüt - tehát nem parancssorból kell fordítani. Az egyes menüpontokat a kezdőbetűjük megnyomásával lehet kiválasztani: