Brainfuck
Wikipedia
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.
Sisällysluettelo |
[muokkaa] Yleistä
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 näyttää osoittimen nykyisen paikan ja muutaman viereisen solun arvot, tai vastaavaa.
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.
[muokkaa] Komennot
Brainfuckissa on kahdeksan komentoa:
Komento | Selitys |
---|---|
> |
Kasvata osoittimen arvoa yhdellä. |
< |
Vähennä osoittimen arvoa yhdellä. |
+ |
Kasvata osoittimen kohdalla olevan tavun arvoa yhdellä. |
- |
Vähennä osoittimen kohdalla olevan tavun arvoa yhdellä. |
. |
Tulosta osoittimen kohdalla olevaa tavua vastaava ASCII-merkki. |
, |
Lue syötteestä tavu osoittimen kohdalle. |
[ |
Hyppää eteenpäin vastaavaan ] -merkkiin jos osoittimen kohdalla oleva tavu on nolla. |
] |
Hyppää taaksepäin vastaavaan [ -merkkiin jos osoittimen kohdalla oleva tavu ei ole nolla. |
[muokkaa] Koodiesimerkki
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ä.