Malbolge
Malbolge | |
Paradigma | ezoterikus |
Megjelent | 1998 |
Tervező | Ben Olmstead |
Hatással volt rá |
|
A Malbolge egy ún. ezoterikus programozási nyelv. Ben Olmstead alkotta meg 1998-ban; nevét Dante Poklának nyolcadik köre (Malebolge) után 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]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é tétel érdekében.
Hello World!
[szerkesztés]Az „Helló, világ!” program program kódja:[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]Memória
[szerkesztés]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]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]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]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]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]A programnyelv jelenleg használt specifikációja eltér az eredetitől.
Jegyzetek
[szerkesztés]- ↑ Anthony Youas programjai
- ↑ Andrew Cook: Malebolge "Hello World!". [2008. május 21-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. január 5.)
További információk
[szerkesztés]- Az eredeti specifikáció
- Az első program Archiválva 2008. május 21-i dátummal a Wayback Machine-ben
- Malbolge-interpreter
- Leírás
- Az esolangs.org útmutatója
- Hisashi Iizawa 99 Bottles of Beer programja Archiválva 2020. május 14-i dátummal a Wayback Machine-ben