Malbolge

programovací jazyk

Malbolge je volný ezoterický programovací jazyk, který vytvořil Ben Olmstead v roce 1998 a byl pojmenován po osmém kruhu pekla v dramatu Dante Alighieriho, Malbolge.

Malbolge byl navržen tak, aby bylo téměř nemožné ho používat kvůli neintuitivním „šíleným operacím“ a samo modifikujícímu se kódu. Navazuje na obtížnost časnějších, náročných ezoterických jazyků (jako je Brainfuck a Befunge), ale bere tento aspekt do extrému, pohrává si se spletitou minulostí počítačové vědy a šifrování. Navzdory tomuto návrhu je možné (i když velmi náročné) psát užitečné Malbolge programy.

Programování v Malbolge editovat

Malbolge bylo tak těžké pochopit, že trvalo dva roky než se objevil první Malbolge program. Sám autor nenapsal ani jeden program v Malbolge. První program nebyl napsán člověkem, byl vytvořen paprskovým prohledávacím algoritmem, navrženým Andrewem Cookem a uplatňovaným v Lispu.[1]

Později, Lou Scheffer zaslal dešifrování k Malbolge a poskytl program pro kopírování jeho vstupu na jeho výstup.[2] Také vložil interpretaci a specifikaci poté, co původní stránky přestaly fungovat a nabídl obecnou strategii pro psaní programů v Malbolge.

Olmstead věřil, že Malbolge bude lineárně ohraničený Turingův stroj. Diskutuje o tom, zda je možné realizovat smysluplné smyčky v Malbolge. Program 99 Lahví Piva, který se zabývá netriviálními smyčkami a podmínkami, nebyl oznámen po dobu sedmi let; první správný byl od Hisashiho Lizawana v roce 2005.[3] Hisashi Lizawa také navrhl průvodce pro programování v Malbolge.

Příklad Programu editovat

Ahoj světe! editovat

Tento program zobrazuje „Hello World!“, obě slova začínají velkým písmenem a věta končí vykřičníkem.

(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc.

CAT Program editovat

Tento program čte řetězec od uživatele a vypíše tento řetězec.

(=BA#9"=<;:3y7x54-21q/p-,+*)"!h%B0/.
~P<8
<:(8&
66#"!~}|{zyxwvu
gJ%

Design editovat

Malbolge je programovací jazyk pro ternární virtuální stroj.

Standardní interpretace a oficiální specifikace neodpovídají dokonale.[4] Jeden rozdíl je, že kompilátor zastaví provádění s daty v rozsahu 33–126. I když to bylo zpočátku považováno za chybu v kompilátoru. Ben Olmstead uvedl, že to bylo zamýšleno a ve skutečnosti byla chyba ve specifikaci.

Registry editovat

Malbolge má tři registry a, c a d. Když program začíná, hodnota všech tří registrů je nulová.

a je zkratka pro „akumulátor“, který se používá pro Standardní I/O. c je ukazatel kódu, je to zvláštní čítač instrukcí.[5] d je ukazatel dat. Ten se automaticky zvýší po každé instrukci, ale umístění bodů se používá pro příkazy k manipulaci s daty.

Ukazatel notace editovat

d může držet adresu paměti, [d] je hodnota uložená na této adrese, [c] je podobná.

Paměť editovat

Virtuální stroj má 59049 (310) paměťových míst. Každé místo v paměti má adresu od 0 do 59048 a může mít hodnotu od 0 do 59048.

Jazyk používá stejný paměťový prostor pro data i instrukce.

Instrukce editovat

Malbolge má osm pokynů. Jakou instrukci provést zjistí tím, že vezme hodnotu [c], přidá k ní hodnotu c a vezme zbytek je-li to děleno 94. Konečný výsledek říká interpretovi, co má dělat:

Instrukce
Hodnota

([c] + c) % 94

Instrukce Vysvětlení
4 jmp [q] Hodnota [q] přeskočí a spustí provádění pokynů.
5 out a Vytisknutím na hodnotu a se zobrazí na obrazovce, jako ASCII znak.
23 in a Vstupy mají charakter jako ASCII kód. Nový řádek má kód 10. Konečný stav souboru je kód 59048.
39 rotr [s]

mov a, [s]

Otáčí hodnotu [d] (0002111069 se stává 2000211169). Výsledek uloží jak na [d] tak na a.
40 mov d, [c] Zkopíruje hodnotu [d] na c.
62 crz [d], a

mov a, [d]

Dělá šílený provoz (viz níže) s hodnotou [d] a hodnota a. Výsledek uloží jak na [d] tak na a.
68 nop Nic nedělá.
81 end Končí Malbolge program.
Jakékoli jiné hodnoty dělá to samé jako 68: nic. Tyto jiné hodnoty nejsou povoleny v programu.

Šílený provoz editovat

U každé dvojice ternárních číslic z obou vstupů provede operaci dle následující tabulky. Například crz 0001112220, 0120120120 dává 1001022211.

Šílený provoz[6][7]
crz Vstup 2
0 1 2
Vstup 1 0 1 0 0
1 1 0 2
2 2 2 1

Šifrování editovat

Po instrukci hodnota [c] bude nahrazena samotným kódem 94. Poté je výsledek šifrován jednou ze dvou rovnocenných metod.

Metoda 1
Níže najdete výsledek. Uložení ASCII kódu na znak a poté na [c].
0000000000111111111122222222223333333333444444444455555555556666666666777777777788888888889999
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
----------------------------------------------------------------------------------------------
9m<.TVac'uY*MK X~xDl}REokN:#?G"jsem@5z]&gqtyfr$(we4{WP)H-Zn,[%\3dL+Q;>U!pJS72FhOA1CB6v^=I_0/8|jsb
Metoda 2
Níže najdete výsledek. Uložení šifrované verze na [c].
Šifrování tabulky
Hodnota Šífrované Hodnota Šifrované Hodnota Šifrované Hodnota Šifrované Hodnota Šifrované
0 57 19 108 38 113 57 91 76 79
1 109 20 125 39 116 58 37 77 65
2 60 21 82 40 121 59 92 78 49
3 46 22 69 41 102 60 51 79 67
4 84 23 111 42 114 61 100 80 66
5 86 24 107 43 36 62 76 81 54
6 97 25 78 44 40 63 43 82 118
7 99 26 58 45 119 64 81 83 94
8 96 27 35 46 101 65 59 84 61
9 117 28 63 47 52 66 62 85 73
10 89 29 71 48 123 67 85 86 95
11 42 30 34 49 87 68 33 87 48
12 77 31 105 50 80 69 112 88 47
13 75 32 64 51 41 70 74 89 56
14 39 33 53 52 72 71 83 90 124
15 88 34 122 53 45 72 55 91 106
16 126 35 93 54 90 73 50 92 115
17 120 36 38 55 110 74 70 93 98
18 68 37 103 56 44 75 104

Odkazy editovat

Externí odkazy editovat

Reference editovat

V tomto článku byl použit překlad textu z článku Malbolge na anglické Wikipedii.

  1. Archivovaná kopie [online]. [cit. 2017-01-09]. Dostupné v archivu pořízeném dne 2017-07-02. 
  2. Programming in Malbolge.
  3. Dostupné online. 
  4. Dostupné online. 
  5. Dostupné online. 
  6. TEMKIN, Daniel. Interview with Ben Olmstead [online]. 3 November 2014 [cit. 2015-06-21]. Dostupné v archivu pořízeném dne 2016-10-18. 
  7. IIZAWA, Hisashi. Programming Method in Obfuscated Language Malbolge [online]. Graduate School of Information Science, Nagoya University Furo-cho, Chikusa-ku, Nagoya City, Aichi, 464–8603 Japan: [cit. 2015-06-21]. Dostupné online. (Japanese)