torek, 16. december 2008

Brainfuck ali Jebanje v glavo

Obstaja malo morje različnih programskih jezikov, vsak dan pa si kdo izmisli še kakšnega zraven. Vseeno pa programerji danes večino aplikacij sprogramiramo v enem od izvedenk petih programskih jezikov:

  • C in C++
  • Pascal (Delphi)
  • BASIC
  • Java in
  • PHP.

V manjši meri so v uporabi tudi nekateri drugi jeziki. Če verjamete ali ne, pa nekateri še danes pišejo v Clipperju in celo v Cobol-u!

Vendar tokrat ne bom pisal o teh jezikih, ampak o nečem povsem drugačnem. Z zanimivim imenom Brainfuck!

Brainfuck (južni bratje bi temu lepo rekli "jebanje u mozak", pri nas verjetno "jebanje v glavo") je leta 1993 razvil Urban Müller z namenom napisati najkrajši možni prevajalnik (po domače compiler). Napisanih je kar nekaj različic prevajalnika, krajših od 200 byte-ov (ne govorim o kilobyte-ih ali bognedaj megabyte-ih)! Najkrajše so seveda napisane direktno v zbirniku.

Seveda takšen programski jezik ni namenjen programiranju uporabniških programov, ampak ravno za to, kar pravi njegovo ime - za jebanje (programerjev) v glavo oz. za izziv programerjem. Vse se dogaja v polju (array), dolgem 30.000 znakov in s kazalcem, ki kaže na eno od polj. Število ukazov (operatorjev) je zreducirano na minimum, ravno tako njihova dolžina. Pozna jih vsega 8:

  • + prišteje ena polju, na katerega kaže kazalec
  • - odšteje ena polju, na katerega kaže kazalec
  • > trenutni kazalec premakne na naslednje polje
  • < trenutni kazalec premakne na predhodno polje
  • . izpiše vrednost polja, na katerega kaže kazalec, na standardni izhod (največkrat kar monitor)
  • , v polje, na katero kaže kazalec shrani vrednost iz standarnega vhoda (največkrat kar tipkovnice)
  • [ če vrednost polja, na katerega kaže kazalec ni nič, izvrši kodo do ]
  • ] če vrednost polja, na katerega kaže kazalec ni nič, se vrne do [

Vse ostale znake jezik ignorira!

Zaradi takih omejitev predstavlja velik izziv programerjem. Še vedno pa je “Turing kompleten”. Kar z drugimi besedami pomeni, da če se zadeva da napisati v Cju ali Pascalu (oz. v kateremkoli programskem jeziku), se da vsaj teoretično tudi v Brainfucku! Ni pa tako enostavno.

Program, ki izpisuje naslednjo črko po abecedi, zgleda takole:

,+.
Program prebere znak, njegovi ASCII kodi prišteje 1 in izpiše tako dobljen znak.

Enostavna vsota dveh enocifernih številk:

,>++++++[<-------->-],[<+>-]<.
Program prvi cifri najprej odšteje 48, kar je ASCII koda cifre '0' (pravzaprav odšteje 6 krat po 8) in nato prišteje ASCII kodo drugega znaka k prvemu.

Še nepogrešljiv "Hello world!":

v prvo celico vpiše 10 (števec ponovitev naslednje zanke) ++++++++++ v naslednji zanki vpišemo v naslednje štiri celice vrednosti 70, 100, 30 in 10 (10 krat prištevamo 7, 10, 3 in 1 v štiri zaporedne celice) [   >+++++++>++++++++++>+++>+<<<<- ] izpiše 'H' >++. 'e' >+. 'l' +++++++. 'l' . 'o' +++. presledek >++. 'W' <<+++++++++++++++. 'o' >. 'r' +++. 'l' ------. 'd' --------. '!' >+. ter skoči v novo vrstico >.

Koda je zapisana s komentarji le zaradi preglednosti in razumevanja. Seveda je komentarje mogoče izpustiti in "Hello world!" izpiše tudi naslednji "program":

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Če se kdo želi "jebat v glavo", lahko dodatne napotke najde na Wikipediji, googlovem imeniku ali na Jokerjevi strani! Za še bolj zagrete pa obstaja še nekaj podobnih jezikov!

Povezane objave:



1 komentar:

En Kovač pravi ...

Toliko težav, kot sem imel z objavo tega posta, pa res nisem pričakoval. Res, da je v postu kup > in <, vendar je očitno, da ima blogger s tem kup težav.

Zato tudi upam, da ne manjka kakšen "ukaz" v kodi!

Objavite komentar