Malbolge
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ă
linkuri externe
- ( RO ) Programare în Malbolge, ghid de programare cu documentație în limba originală , pe lscheffer.com .
- ( RO ) Publicația primului „Hello, World!” în Malbolge , pe acooke.org . Adus la 6 noiembrie 2008 (arhivat din original la 2 iulie 2017) .
- ( RO ) Interpreti și programe pentru Malbolge , pe esoteric.sange.fi .
- ( EN ) Program în Malbolge care tipărește întregul text al „99 sticle de bere” , pe 99-bottles-of-beer.net .
- ( EN ) Esoteric File Archive , arhiva de fișiere a lui Malbolge , la esoteric.voxelperfect.net . Adus la 6 noiembrie 2008 (arhivat din original la 24 aprilie 2013) .