Malbolge

Malbolge
Paradigmaezoterikus
Megjelent1998
TervezőBen Olmstead
Hatással volt rá
  • Brainfuck
  • Befunge

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

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!

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

Memória

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

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

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

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

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

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

Jegyzetek

  1. Anthony Youas programjai
  2. 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

  • 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
  • Informatika Informatikai portál • összefoglaló, színes tartalomajánló lap