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.

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 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.

Komennot
--------

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
--------------

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ä.

Lähteet
-------

* Brainfuck interpreter with integrated debugger (IDE) for Windows (Arkistoitu – Internet Archive)
* The Brainfuck Programming Language
* The Brainfuck Archive
* some brainfuck fluff
* Brainfuck generator (Arkistoitu – Internet Archive) - Tekstistä Brainfuckiksi