Malbolge

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

Malbolge este un limbaj de programare ezoteric , creat de Ben Olmstead în 1998 , cu scopul de a face codul cel mai greu de utilizat. Andrew Cooke a reușit să scrie primul „ Bună ziua, lume! ” Numai cu ajutorul unui program din Lisp .

Etimologie

Numele Malbolge derivă din numele dat celui de-al optulea cerc al Iadului în Divina Comedie a lui Dante Alighieri , unde se găsesc cele frauduloase. Numele modificat Malbolge a fost apoi folosit și de creatorii RPG Dungeons and Dragons pentru al șaselea iad.

Caracteristicile limbajului

Malbolge a fost construit pentru a rula programe pe o mașină virtuală bazată pe cifre ternare (numite și trit ). Fiecare dată (cuvânt) este alcătuită din 10 trit, cu o gamă de valori de la 0 la 2222222222 în baza 3, adică 59048 în format zecimal. Fiecare adresă de memorie ocupă, de asemenea, un cuvânt. Datele și codul programului sunt stocate în aceeași memorie. Programul este plasat în memorie la pornire pornind de la locația 0; orice spațiu alb este ignorat, precum și orice posibilă întoarcere a trăsurii. Locațiile de memorie rămase sunt inițializate prin aplicarea rezultatului instrucțiunii „nebunești”, așa cum se explică mai jos, la ultimul și penultimul cuvânt dinaintea celulei de inițializat. Există trei registre, fiecare având dimensiunea de 1 cuvânt: registrul C, numit registru de cod , indică instrucțiunea care trebuie executată; registrul D, registrul de date , este utilizat pentru manipularea datelor; registrul A este registrul acumulatorului și este utilizat de multe instrucțiuni ca suport pentru manipularea datelor.

Instrucțiuni

Adresa instrucțiunii de executat este conținută în registrul C; dacă instrucțiunea nu este în intervalul 33-126, programul se încheie. În caz contrar, pentru a determina instrucțiunea reală de executat, valoarea indicată de C este adăugată lui C în sine, iar rezultatul este împărțit la 94; restul acestei diviziuni este folosit pentru a decide operațiunea de efectuat:

(C + [C])% 94 Descriere Pseudo cod Op [1]
4 Atribuie valoarea indicată de D la înregistrarea C C = [D] the
5 Caracter de ieșire A modulo 256 PRINT (A% 256) <
23 Citește un caracter din intrarea standard și îl stochează în A. CITIȚI (A) [2] /
39 Rotește valoarea indicată de D cu o cifră ternară spre dreapta și o stochează în [D] și A A = [D] = ROTR ([D]) *
40 Stochează valoarea indicată de D în D D = [D] j
62 Efectuați operația „nebună” pe cifrele ternare ale lui A și numărul indicat de D și stocați rezultatul în A și în [D] A = [D] = CRAZY (A, [D]) p
68 Operațiunea nulă NOP sau
81 Încheiați execuția programului SFÂRȘIT v

Dacă rezultatul nu este nici unul dintre cele de mai sus, se efectuează o operație nulă (NOP). În orice caz, niciun NOP, altul decât 68, nu este acceptat de compilator atunci când este prezent în codul sursă.

Operația nebună operează pe perechi de trituri corespunzătoare, având în vedere fiecare trit conținut în cele două cuvinte pe care trebuie să fie efectuate, conform următorului tabel:

LA
0 1 2
B. 0 1 0 0
1 1 0 2
2 2 2 1

După executarea fiecărei instrucțiuni, dacă valoarea indicată de C este cuprinsă între 33 și 126 inclusiv, se modifică în conformitate cu următorul tabel:

 ! "# $% & '() * +, -. / 0123456789 :; <=>? @ ABCDEFGHIJKLMNO
5z] & gqtyfr $ (we4 {WP) H-Zn, [% \ 3dL + Q;> U! PJS72FhOA1C

PQRSTUVWXYZ [\] ^ _ `abcdefghijklmnopqrstuvwxyz {|} ~
B6v ^ = I_0 / 8 | jsb9m <.TVac`uY * MK'X ~ xDl} REokN: #? G "i @

(de exemplu,! devine 5, "devine z și așa mai departe)

După aceea, ambele C și D sunt incrementate cu modulul 3 10 (59049) și ciclul se repetă.

Exemple de programe

Până acum sunt foarte puține programe scrise în Malbolge, având în vedere dificultatea de a crea rezultate acceptabile.

Salut Lume!

Acesta a fost primul „Hello, World!” scris în Malbolge. În realitate, ieșirea sa nu este perfectă, deoarece nu ține cont de majuscule sau de punctuație (tipăriți "HEllO WORld"); un program capabil să scrie „Hello, World!” corect este mult mai dificil de creat.

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

Salut Lume! corect

Acest program reușește să tipărească „Bună ziua, lume!” cu caracterele și punctuația corecte.

 ('&%: 9]! ~} | Z2Vxwv-, POqponl $ Hjig% eB @@>} = <M: 9wv6WsU2T | nm-, jcL (I &% $ # "
`CB] V? Tx <uVtT`Rpo3NlF.Jh ++ FdbCBA @?]! ~ | 4XzyTT43Qsqq (Lnmkj" Fhg $ {z @>

Program CAT

Acest program citește un șir de intrare din intrarea standard și îl trimite la ieșirea standard:

 (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
(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

Notă

  1. ^ Scrisoare asociată cu instrucțiunea conform documentației originale.
  2. ^ Caracterele Newline și Line feed sunt considerate același caracter și au o valoare de 10; caracterul EOF are valoarea 59048.

linkuri externe