Malbolge

**Malbolge** on avoimen lähdekoodin periaatteella toimiva esoteerinen ohjelmointikieli. Sen kehitti Ben Olmstead vuonna 1998.
Malbolge on saanut nimensä Danten "Jumalaisen näytelmän" kahdeksannen Helvetin kerroksen mukaan.

Malbolgen lähtökohtana on, että se on mahdollisimman vaikeasti ohjelmoitava. Kuitenkin muutamilla tempuilla sen saa ymmärrettäväksi.

## Malbolge-ohjelmointi

Malbolge on niin vaikeasti ymmärrettävä, että sen suunnittelusta kului kaksi vuotta ennen kuin ensimmäinen järkevä Malbolge-ohjelma tehtiin. Tosin tällöinkään ohjelmaa ei koodannut ihminen, vaan se generoitiin Andrew Cooken ohjelmoimalla sädehakualgoritmilla (beam search).

Vuonna 2000 Anthony Youhas esitti blogissaan  päihittäneensä Malbolgen vaikeudet ja osaavansa käyttää sitä. Hän osoitti tämän tekemillään kolmella ohjelmalla. Hän ei kuitenkaan paljastanut ohjelmointimetodiaan.

## Malbolgen toiminta

Malbolge on konekieli, joka toimii kolmikantaisessa (ternary) järjestelmässä, ei binäärissä. 

Malbolgessa on kolme rekisteriä, ***a***, ***c*** ja ***d***, jotka ovat kuin muuttujia muissa kielissä. Kun ohjelma alkaa, kaikkien kolmen arvo on 0.
***c**:llä on erityinen merkitys: Se osoittaa nykyiseen osoitteeseen.

### Osoitinnotaatio

*d*-rekisterissä voi olla muistiosoite; tällöin *[d]* on kyseisen osoitteen sisältämä arvo. *[c]* toimii vastaavasti.

### Muisti

Malbolgen virtuaalikoneessa on 59049 muistisanaa, joista kussakin voi olla 10 merkkiä pitkä kolmikantainen luku. Jokaisella muistipaikalla on osoite väliltä 0 - 59048, ja ne voivat kukin sisältää luvun väliltä 0 - 59048 (desimaalinen). Jos sanan arvo saavuttaa 59049:n, se korvataan 0:lla.

Ennen kuin Malbolge-ohjelman suoritus aloitetaan, ohjelma ladataan tulkin muistin alkuun. Välilyöntimerkit unohdetaan, ja jotta ohjelmoinnista tulisi vaikeampaa, koko muun ohjelman tulee koostua alla mainituista merkeistä. Loppuosa muistista täytetään "crazy operation"ia käyttäen kaavalla *[m]&nbsp;=&nbsp;crz&nbsp;[m&nbsp;-&nbsp;2],&nbsp;[m&nbsp;-&nbsp;1]*.

## Käskyt

Malbolge päättää suoritettavan käskyn kaavalla *([c]+c) mod 94*. Lopputulos kertoo, mitä tulkki tekee:

Kunkin käskyn suorituksen jälkeen käsky kryptataan (ks. alla), jotta se ei tee samaa ensi kerralla, ellei juuri ole suoritettu hyppyä. Heti hypyn jälkeen kryptataan sen sijaan hypyn kohdetta edeltävä käsky. Kryptauksen jälkeen rekisterien **c** ja **d** arvoa kasvatetaan yhdellä ja seuraava käsky suoritetaan.

### Kryptaus
Jokaisen konekäskyn suorittamisen jälkeen [c]:hen sijoitetaan arvo enc(c mod 94), missä enc(x) on seuraava funktio (valitse x taulukosta, enc(x) on sen alla olevan merkin ASCII-koodi):

 0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999
 0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
 ----------------------------------------------------------------------------------------------
 

### Crazy operation

Jokaiselle syötteiden numeroparille suoritetaan seuraava kuvaus tuloksen ternaarinumeron saamiseksi. Esimerkiksi **crz&nbsp;0001112220,&nbsp;0120120120** = 1001022211.

## Vaikeus
*Malbolge perustuu ternaariseen koodiin. 
*Kaikki ohjelmat koostuvat pelkästään numerosekvenssistä.
*Opkoodien käyttö lähdekoodissa on kielletty.
*Malbolgen tulkissa on kolme rekisteriä, joiden nimet ovat "c" (code, koodi), "d" (data), ja "a" (akkumulaattori).
*Tulkissa on myös muisti, jokainen muistin sana voi säilyttää 10 trinaarinumeroa pitkän arvon.

## Esimerkkiohjelma
Tämä Malbolge-ohjelma kirjoittaa "Hello world":
  (=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk**
  hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<

## Aiheesta muualla
*http://www.antwon.com/other/malbolge/malbolge.txt 
*http://www.lscheffer.com/malbolge_interp.html
*Kuvaus Andrew Cooken algoritmista, jolla luotiin ensimmäinen Malbolge -ohjelma 
*Lou Schefferin Malbolge -analyysi
*http://scienceblogs.com/goodmath/2007/01/hellish_programming_malbolge.php 
*Malbolgeohjelmointi
*Anthony Youhanin blogi 
*"99 bottles" -sanat Malbolgeohjelmoituna