2.12.2012

Harmaiden aivosolujen jumppausta


Vanhoja tiedostoarkistoja kaivellessa silmiini sattui bfuck-niminen hakemisto, jonka alta ei kuitenkaan paljastunut aikuisviihdettä, vaan muutamia Brainfuck-ohjelmointikielellä kirjoitettuja ohjelmapätkiä. Brainfuck (BF) on Urban Müllerin 1993 kehittämä minimalistinen ohjelmointikieli, jossa on vain kahdeksan komentoa. Kieli ei sovellu käytännön ohjelmointitehtäviin, vaan "tarjoaa älyllistä haasteta ja hupia" kuten edellä linkatussa Wikipedian artikkelissa asia ilmaistiin. Joskus on ilmeisesti ollut tekemisen puutetta meikäläiselläkin :)

Jos torstain linnanjuhlien 384 kättely alkaa lamauttamaan aivotoimintaasi, niin tarkastelepas alla olevaa BF-koodia ja selvitä mitä se tekee. Tämä on luultavasti sopivaa jumppaa myös joulukinkun rasvojen hidastamille harmaille aivosoluille. Sitä ennen kuitenkin opiskellaan BF:n kahdeksalla erilaisella merkillä esitettävät komennot. Koko ohjelmointikieli näyttää yksinkertaisuudessaan seuraavalta:

> kasvattaa osoitinta yhdellä (siis siirtyy osoittamaan seuraavaa tavua) ja < vähentää osoitinta yhdellä

+ kasvattaa osoittimen osoittaman tavun arvoa yhdellä ja - vastaavasti vähentää tavun arvoa yhdellä

. (piste) tulostaa osoittimen osoittaman tavun arvoa vastaavan ASCII-merkin

, (pilkku) lukee syötteestä tavun ja tallentaa sen osoittimen osoittamaan paikkaan

[ aloittaa esiehtoisen silmukan (while), josta poistutaan osoittimen osoittaman tavun ollessa nolla

] lopettaa silmukan, jolloin hypätään takaisin vastaavaan [-kohtaan, mikäli osoittimen osoittama tavu ei ole nolla

Näillä siis mennään. BF-tulkit saattavat sisältää myös debuggaamiseen liityviä lisäkomentoja, mutta ne eivät ole osa varsinaista Brainfuckia. Kuten varmaan arvasitkin, BF-ohjelmien koodi näyttää melkoisen mystiseltä. Lämmitellään aluksi ensimmäisessä artikkelissani viittaamani Hello World! -tekstin tulostavan ohjelman koodilla:

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


Sillä viissiin. Nyt sitten harmaisiin aivosoluihin liikettä - mitä siis seuraava ohjelma tekee?

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

Pelkän BF-koodin tulkinta on melkoista extreme-hommaa, ja koska jokaisessa kunnon ohjelmassa on kommentteja mukana, niin seuraavaksi yllä olevan koodin kommentoitu versio. Brainfuckissa ei tarvita erillistä kommenttimerkkiä, sillä ainoastaan kielen omat kahdeksan komentoa tulkitaan.

>++++++++++               tavu(1)=10
[-                        silmukan alku / tavu(1)=9
>++++++++++  kasvata tavu(2) 10
>+++++++++++  kasvata tavu(3) 11
>+++  kasvata tavu(4) 3
>++++++  kasvata tavu(5) 6
<<<<  siirry takaisin ykköseen
]  silmukan loppu 

  arvot tässä tavu(0)=0 tavu(1)=0 
  tavu(2)=100 tavu(2)=110 tavu(4)=30 tavu(5)=60

>+.>.++++++.<.>--.        tulosta sana enter / tavu(2)=101 & tavu(3)=114 
>++.                    tulosta välilyönti / tavu(4)=32
<+++++.--------.+++.<-.   tulosta sana word / tavu(2)=100 & tavu(3)=114

>>>--.<.                 tulosta kaksoispiste ja välilyönti / 
                          tavu(4)=32 & tavu(5)=58

<<<---------             Siirry tavuun 1 / tavu(1)=-10
[  lukusilmukka alkaa
>,  lue syöte
----------              vähennä 10
]                       lukusilmukka loppuu jos painettu enteriä

<                       siirry edelliseen
[                       tulostussilmukka alkaa
++++++++++.              lisää 10 ja tulosta merkki
<                       siirry edelliseen
]
++++++++++.

Toki voit myös fuskata ja asentaa Brainfuck-tulkin koneellesi. Näitä löytynee suunnilleen jokaiselle Linux-jakelulle (Arch Linuxin AUR:sta löytyvä brainfuck-parser ainakin hoitaa hommansa hyvin) ja myös Windowsille on melko varmasti omat ohjelmansa.

Happy Brainfucking!

2 kommenttia:

  1. vaikeeta koodia. tulostaa enter word ja tekee sitten jotai

    VastaaPoista
  2. Juups, palidromihan sieltä tulostuu.

    VastaaPoista