Sinoć u trenutcima dokolice (dobro, dobro, imao sam i pametnija posla, ali ovo mi je bilo zanimljivije) napisao sam Brainfuck interpreter. Verovatno zvuči ozbiljnije nego što stvarno jeste, jer je ceo program stao u nekih 200 linija koda sa sve komentarima i inline dokumentacijom.

Za one koji ne znaju, Brainfuck je jezik koga je napravio Urban Müller 1993. godine kao pokušaj da napravi najmanji kompajler, pa mu je trebao i kompaktan jezik. Nema nikakvu upotrebnu vrednost. Jako lako se uči, ali se jako teško programira u njemu, a kod je čitljiv koliko i binarni.
Struktura podataka koju koristi jezik je jedan niz (zavisi od implementacije, ali obično je niz 8-bitnih vrednosti) i jedan implicitno deklasiran pokazivač. Sintaksa se sastoji samo od 8 znakova:
- + uvećava za jedan vrednost na koju pokazuje pokazivač
- - umanjuje za jedan vrednost na koju pokazuje pokazivač
- < pomera pokazivač za jedno mesto u levo
- > pomera pokazivač za jedno mesto u desno
- . ispisuje ASCII vrednost znaka čiji kod se nalazi na lokaciji na koju pokazuje pokazivač
- , učitava kod ASCII znaka sa tastature i smešta ga na lokaciju na koju pokazuje pokazivač
- [ započinje petlju koja se izvršava sve dok vrednost u lokaciji na koju je pokazivaš pokazivao na početnu petlje ne bude 0
- ] završava petlju
Jedan primer brainfuck programa je ovo:
++++++++++[>++++++++++>+++++++++++>++++>++++
+++++++<<<<-]>.+.> - - .>+++++.<<---.>+++.<<+++[>>
>>+++<<<<-]>>>>++.
Ovaj kod, kad se propusti kroz interpreter koji sam napisao (ili bilo koji drugi brainfuck interpreter) će kao rezultat dati string “del-boy”.
Kao što možete pretpostaviti, za ovakav jezik je dosta jednostavno napisati interpreter. Moje rešenje je dosta jednostavno i nekompletno. Napravio sam jedan niz od 1000 elemenata (u praksi je potrebno dosta više… u stvari, u praksi bi taj niz trebao da bude ograničen samo količinom memorije u računaru, ali to ću možda napraviti tek u sledećoj verziji). Ako se dođe do kraja niza odlučio sam da će pokazivač da se vrati na početak. Ista situacija je ako program pokuša da pomeri pokazivač levo od nulte pozicije – vratiće se na kraj.
Nisam ugrađivao nikakve provere sintakse ili bilo šta slično (mrzelo me) tako da vrlo lako može da se desi da interpreter upadne u beskonačnu petlju ili da se neredvidivo ponaša, ali tad je uglavnom program loše napisan. Mislim, najverovatnije ima stvari koje sam propustio, ali za moje test primere je vraćao dobar rezultat.
Svi znakovi sem gore nabrojanih 8 se zanemaruju, tako da slobodno možete da pišete komentare u kod pod uslovom da se u komentaru ne pojavljuju brainfuck znaci. Čak šta više, ako želite možete da sakrijete brainfuck program u neki drugi program, napisan u nekom drugom programskom jeziku.
Jezik koji sam izabrao za implementaciju je Python. Njega već neko vreme učim, ali nikako da nađem više vremena da mu se posvetim tako da sam stalno negde na početku, tako da mi je ovo došlo kao dobra vežba.
I za kraj, kod.