Malbolge
Wikipedia
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.
Sisällysluettelo |
[muokkaa] 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.
[muokkaa] 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.
[muokkaa] Osoitinnotaatio
d-rekisterissä voi olla muistiosoite; tällöin [d] on kyseisen osoitteen sisältämä arvo. [c] toimii vastaavasti.
[muokkaa] Muisti
Malborgen 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] = crz [m - 2], [m - 1].
[muokkaa] Käskyt
Malborge päättää suoritettavan käskyn kaavalla ([c]+c) mod 94. Lopputulos kertoo, mitä tulkki tekee:
([c] + c) % 94:n arvo | Esitetty käsky | Selitys |
---|---|---|
4 | jmp [d] + 1 | Ohjelman suoritus hyppää osoitteeseen [d] +1. |
5 | out a | Tulostaa a:n ASCII-koodia vastaavan merkin ruudulle. |
23 | in a | Lukee merkin ja sijoittaa sen ASCII-koodin a:han. Rivinvaihtomerkit (sekä CR että LF) ovat 10. Tiedostonlopetusarvo on 59048. |
39 | rotr [d] mov a, [d] |
Pyörittää [d]:n arvoa oikealle yhdellä kolmikantaisella numerolla (0002111112 muuttuu 2000211111:ksi). Tallettaa tuloksen sekä [d]:hen että a:han. |
40 | mov d, [d] | Kopioi arvon [d]:stä d:hen. |
62 | crz [d], a mov a, [d] |
Tekee "crazy operationin" arvoilla [d] ja a. Tallettaa tulokset sekä [d]:hen että a:han. |
68 | nop | Ei tee mitään. |
81 | end | Lopettaa ohjelman. |
Muut arvot eivät tee mitään. Niitä ei hyväksytä varsinaisessa ohjelmassa, mutta ne toimivat jos tulos syntyy ohjelman sisällä. |
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.
[muokkaa] 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 ---------------------------------------------------------------------------------------------- 9m<.TVac`uY*MK'X~xDl}REokN:#?G"i@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb
[muokkaa] Crazy operation
Jokaiselle syötteiden numeroparille suoritetaan seuraava kuvaus tuloksen ternaarinumeron saamiseksi. Esimerkiksi crz 0001112220, 0120120120 = 1001022211.
crz | Syöte 2 | |||
---|---|---|---|---|
0 | 1 | 2 | ||
Syöte 1 | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 2 | |
2 | 2 | 2 | 1 |
[muokkaa] Vaikeus
- Malbolge perustuu ternaariseen koodiin.
- Kaikki ohjelmat koostuvat pelkästään numerosekvenssistä.
- Opkoodien käyttö lähdekoorissa 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.
[muokkaa] 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<
[muokkaa] 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