Brainfuck

Wikipediasta
Siirry navigaatioon Siirry hakuun
Hei maailma -ohjelma Brainfuck-ohjelmointikielellä.

Brainfuck on Urban Müllerin noin vuonna 1993 kehittämä esoteerinen ohjelmointikieli, joka tunnetaan äärimmäisestä minimalismistaan. Müllerin tarkoituksena oli saada aikaan mahdollisimman pienikokoinen kääntäjä. Kieli tarjoaa ohjelmoijille älyllistä haastetta ja hupia, mutta käytännöllisiin tarkoituksiin se ei sovellu.

Brainfuck on yksi tunnetuimmista "esoteerisistä ohjelmointikielistä". Kieli on Turing-täydellinen, eli kaikki mahdolliset algoritmit on periaatteessa mahdollista ohjelmoida sillä. Esteenä on ennen kaikkea ohjelmoijan kyky kirjoittaa nämä ohjelmat.

Brainfuck-ohjelmien tiedostopäätteenä käytetään useimmiten .b. Ohjelmaa suoritettaessa tulkin tulisi ottaa vain ja ainoastaan huomioon brainfuckin omat kahdeksan komentoa ja karsia muu data. Joissakin tulkeissa saattaa olla erityistoimintoja kuten '#', jolla tulkki esimerkiksi näyttää osoittimen nykyisen paikan ja muutaman viereisen solun arvot.

Brainfuck-ohjelmat on suurimmalta osin tehty käyttämään UNIXin rivinvaihtoa, ASCII #010. Jos tulkki lukee syötteen jostain tiedostosta ja päätyy tiedoston loppuun, EOF, sen tulisi jättää solu ennalleen eikä muuttaa sitä. Varsin usein tulkit palauttavat nollan (0) EOF-tilanteessa.

Brainfuckissa on kahdeksan komentoa:

Komento Selitys
> Kasvata osoittimen osoitetta yhdellä (siirrä osoitinta "oikealle")
< Vähennä osoittimen osoitetta yhdellä (siirrä osoitinta "vasemmalle")
+ Kasvata osoittimen osoittamaa tavun arvoa yhdellä.
- Vähennä osoittimen osoittamaa tavun arvoa yhdellä.
. Tulosta osoittimen kohdalla olevaa tavua vastaava ASCII-merkki.
, Lue syötteestä tavu osoittimen kohdalle.
[ Hyppää eteenpäin vastaavaan ]-merkkiin jos osoittimen osoittama tavu on nolla.
] Hyppää taaksepäin vastaavaan [-merkkiin jos osoittimen osoittama tavu ei ole nolla.

Koodiesimerkki

[muokkaa | muokkaa wikitekstiä]

Seuraava ohjelma tulostaa tekstin "Hello World!":

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

Luettavuuden parantamiseksi ohjelman voi kuitenkin jakaa useammalle riville ja siihen voi lisätä kommentteja keskelle, sillä Brainfuck ottaa huomioon vain merkit +-<>[],. eli erillistä kommentointisyntaksia ei tarvita:

++++++++++
[
   >+++++++>++++++++++>+++>+<<<<-
] Aloitussilmukka joka asettaa hyödyllisiä arvoja taulukkoon
>++. tulosta 'H'
>+. tulosta 'e'
+++++++. 'l'
. 'l'
+++. 'o'
>++. välilyönti
<<+++++++++++++++. 'W'
>. 'o'
+++. 'r'
------. 'l'
--------. 'd'
>+. '!'
>. rivinvaihto

Ensimmäinen rivi kasvattaa taulukon ensimmäisen solun arvoon 10, eli a[0] = 10. Rivien 2—4 silmukka alustaa muiden solujen arvot lähelle hyödyllisiä arvoja: a[1] = 70 (lähellä 72:ta, joka on H-kirjaimen ASCII-koodi), a[2] = 100 (lähellä 101:tä, 'e'), a[3] = 30 (lähellä 32:ta, välilyönti) ja a[4] = 10 (rivinvaihto). Silmukka toimii kertomalla solun a[0] arvoa, 10, seitsemällä, kymmenellä, kolmella ja yhdellä, tallentaen tulokset muihin soluihin. Silmukan päättyessä a[0] = 0.

Sen jälkeen >++. siirtää osoittimen kohtaan a[1] jossa nyt on tallennettuna arvo 70, lisää siihen kaksi, jolloin solun arvo on 72 eli H-kirjaimen ASCII-koodi, ja tulostaa sen.

Seuraava rivi siirtää osoittimen kohtaan a[2], lisää siihen yhden (jolloin a[2] = 101, 'e') ja tulostaa sen.

Pieni-l on seitsemäs kirjain e:n jälkeen, joten ohjelma lisää soluun a[2] seitsemän (+++++++) ja tulostaa sen kahdesti (..).

Pieni-o on kolmas kirjain l:n jälkeen, joten a[2]:ta kasvatetaan kolme kertaa ja tulostetaan se (+++.).

Ohjelman loppu toimii kuten edellä.