Malbolge

A Wikipédiából, a szabad enciklopédiából

A Malbolge egy ún. ezoterikus programozási nyelv. Ben Olmstead alkotta meg 1998-ban; nevét Dante poklának nyolcadik köre után (Malebolge) kapta. Olmstead szándéka az volt, hogy az addigi két egyeduralkodó „érthetetlen” nyelvet (INTERCAL, Brainfuck) letaszítsa trónjáról, ugyanis azokat túl könnyen tanulhatónak találta. A Malbolgét úgy tervezték, hogy kivételesen bonyolult és érthetetlen legyen.

Története[szerkesztés | forrásszöveg szerkesztése]

Az első programot (amely a Hello World! volt) a nyelv elkészülése után két évvel genetikus algoritmussal generálták. Ugyanebben az évben Anthony Youhas a weboldalán önmagát a Malbolge mesterének nevezte, és három programot tett közzé, amelyek egyszerű mondatokat írnak a képernyőre[1] (Youhas soha nem publikálta, hogyan sikerült megírnia a programokat). A nyelv a korlátozott memória miatt nem Turing-teljes, de történtek próbálkozások a Turing-teljessé tevés érdekében.

Hello World![szerkesztés | forrásszöveg szerkesztése]

Az első Hello World!:[2]

(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;
gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm

Futási környezete[szerkesztés | forrásszöveg szerkesztése]

Memória[szerkesztés | forrásszöveg szerkesztése]

A Malbolge egy egyszerű ternáris processzoron fut, amelyet egy virtuális gép, a Malbolge-interpreter reprezentál. A program kódja és adatai egyazon memóriaszegmensben helyezkednek el. A virtuális gépnek 59 049 (310) memóriacellája van, mindegyik cellában egy tízjegyű ternáris szám tárolható, így az egy rekeszben tárolható szám maximum 59 048 (minden szám előjel nélküli).

Regiszterek[szerkesztés | forrásszöveg szerkesztése]

Három regiszter van: a, c, d, amelyek megfelelnek a más programozási nyelvekben lévő változóknak. Alaphelyzetben mindhárom értéke nulla. A c regiszter helyzete speciális, a következő utasításra mutat. A d regiszterben egy memóriacímet tárolhatunk el, ekkor [d] a címen lévő értéket adja vissza (a [c] szintén).

A programok futtatása[szerkesztés | forrásszöveg szerkesztése]

Az interpreter karakterenként olvassa be a forrásfájlt. Az egyes karakterek ASCII-értékéből levon 33-at, hozzáadja a c által mutatott indexet, és maradékosan elosztja 94-gyel. Az így kapott értéket indexként használva kiválaszt egy karaktert az alábbi táblázatból:

+b(29e*j1VMEKLyC})8&m#~W>qxdRp0wkrUo[D7,XTcA\"lI
.v%{gJh4G\\-=O@5`_3i<?Z';FNQuY]szf$!BS/|t:Pn6^Ha

Ha a mutatott érték nem utasítás, akkor a program futása hibával megszakad, egyébként eltárolódik a memóriába. A whitespace karaktereket az interpreter nem veszi figyelembe. Minden egyes memóriacellába egy ASCII-karakter kerül. A felhasználatlan memória az ún. Crazy operation segítségével kap értéket, az előző két memóriacímen tárolt értékből képezve:
[mem_act] = crzop([mem_act−1], [mem_act−2])

crzop [mem_act-2]
0 1 2
[mem_act-1] 0 1 0 0
1 1 0 2
2 2 2 1

Legyen például a két előző érték 0120011201 és 0011120120, ekkor az eredmény: 1120021201.

Utasítások[szerkesztés | forrásszöveg szerkesztése]

Az interpreter először ellenőrzi, hogy a soron következő memóriacímen grafikus ASCII-karakter (33–126) van-e. Ha igen, kivon belőle 33 -at, hozzáadja c -t, és maradékosan elosztja 94-gyel. Az eredményt indexként használva kiválasztja a megfelelő értéket a fenti táblázatból. Ezután ismét megvizsgálja, hogy utasítás-e, ha nem, akkor üres utasításként értelmezi, egyébként végrehajtja a megfelelő parancsot:

j d értéke az általa mutatott érték lesz
i c értéke a d által mutatott érték lesz
* a és a d által mutatott memóriahely értéke a d által mutatott érték lesz jobbra forgatva
p a és a d által mutatott memóriahely értéke a kettőn elvégzett Crazy operation eredménye lesz
< Az a -ban tárolt értéket 256-tal maradékosan elosztva kiírja a standard outputra
/ Beolvas egy karaktert a standard outputról, és eltárolja a-ban
v Megállítja a program futását
o Üres utasítás

Miután végrehajtotta az utasítást, a c által mutatott értékből kivon 33-at, az eredményt indexként használva kiválasztja a megfelelő elemet az alábbi táblázatból, és eltárolja a c memóriacímén.

5z]&gqtyfr$(we4{WP)H-Zn,[%\\3dL+Q;>U!pJS72FhOA1C
B6v^=I_0/8|jsb9m<.TVac`uY*MK'X~xDl}REokN:#?G\"i@

Ha volt érvényes utasítás, ha nem, az interpreter megnöveli c és d értékét eggyel (ha valamelyik értéke 59 048, akkor nulla lesz).

Példaprogram[szerkesztés | forrásszöveg szerkesztése]

Az alábbi program kiírja a standard outputra a standard inputot:

(aBA@?>=<;:9876543210/.-,JH)('&%$#"!~}|{zy\J6utsrq
ponmlkjihgJ%dcba`_^]\[ZYXWVUTSRQPONMLKJIHGF('C%$$^
K~<;4987654321a/.-,\*)
j
!~%|{zya}|{zyxwvutsrqSonmlO
jLhg`edcba`_^]\[ZYXWV8TSRQ4
ONM/KJIBGFE>CBA@?>=<;{9876w
43210/.-m+*)('&%$#"!~}|{zy\
wvunslqponmlkjihgfedcEa`_^A
\>ZYXWPUTSRQPONMLKJIH*FEDC&
A@?>=<;:9876543210/.-m+*)(i
&%$#"!~}|{zyxwvutsrqpRnmlkN
ihgfedcba`_^]\[ZYXWVU7SRQP3
NMLKJIHGFEDCBA@?>=<;:z8765v
3210/.-,+*)('&%$#"!~}_{zyx[
vutsrqjonmlejihgfedcba`_^]@
[ZYXWVUTSRo

Megjegyzés[szerkesztés | forrásszöveg szerkesztése]

A programnyelv jelenleg használt specifikációja eltér az eredetitől.

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

További információk[szerkesztés | forrásszöveg szerkesztése]