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: