Malbolge
Malbolge è un linguaggio di programmazione esoterico, creato da Ben Olmstead nel 1998, con lo scopo che fosse il codice più difficile possibile da utilizzare. Andrew Cooke riuscì a scrivere il primo "Hello, world!" solo con l'aiuto di un programma in Lisp.
Etimologia
[modifica | modifica wikitesto]Il nome Malbolge deriva dal nome dato all'ottavo cerchio dell'Inferno nella Divina Commedia di Dante Alighieri, dove si trovano i fraudolenti. Il nome modificato Malbolge fu poi anche utilizzato dai creatori del gioco di ruolo Dungeons and Dragons per il sesto inferno.
Caratteristiche del linguaggio
[modifica | modifica wikitesto]Malbolge è stato costruito per eseguire i programmi su una macchina virtuale basata su cifre ternarie (anche dette trit). Ogni dato (word) è formato da 10 trit, con un intervallo di valori da 0 a 2222222222 in base 3, cioè 59048 in formato decimale. Anche ciascun indirizzo di memoria occupa una word. I dati e il codice del programma sono inseriti nella stessa memoria. Il programma è posto nella memoria all'avvio a partire dalla locazione 0; ogni spazio bianco è ignorato, così come ogni eventuale ritorno a capo. Le locazioni di memoria restanti vengono inizializzate applicando il risultato dell'istruzione "pazza", come spiegato sotto, all'ultima e alla penultima word prima della cella da inizializzare. Ci sono tre registri, ognuno dei quali di dimensione 1 word: il registro C, detto code register (registro del codice), punta all'istruzione che deve essere eseguita; il registro D, data register, è utilizzato per manipolare i dati; il registro A è il registro accumulatore e viene usato da molte istruzioni come supporto per la manipolazione dei dati.
Istruzioni
[modifica | modifica wikitesto]L'indirizzo dell'istruzione da eseguire è contenuto nel registro C; se l'istruzione non è nell'intervallo 33-126, il programma termina. Altrimenti, per determinare la vera istruzione da eseguire, il valore puntato da C viene aggiunto allo stesso C, e il risultato è diviso per 94; il resto di questa divisione viene utilizzato per decidere l'operazione da eseguire:
(C+[C])%94 | Descrizione | Pseudocodice | Op[1] |
---|---|---|---|
4 | Assegna al registro C il valore puntato da D | C=[D] | i |
5 | Manda in output il carattere A modulo 256 | PRINT(A%256) | < |
23 | Legge un carattere dallo standard input e lo memorizza in A | READ(A)[2] | / |
39 | Ruota il valore puntato da D di una cifra ternaria verso destra e lo memorizza in [D] e in A | A=[D]=ROTR([D]) | * |
40 | Memorizza in D il valore puntato da D | D=[D] | j |
62 | Effettua l'operazione "pazza" sulle cifre ternarie di A e del numero puntato da D e memorizza il risultato in A e in [D] | A=[D]=CRAZY(A,[D]) | p |
68 | Operazione nulla | NOP | o |
81 | Termina l'esecuzione del programma | END | v |
Se il risultato non è nessuno di quelli elencati sopra, viene eseguita un'operazione nulla (NOP). In ogni caso nessuna NOP diversa da 68 viene accettata dal compilatore quando presente nel codice sorgente.
La crazy operation (operazione "pazza") opera su coppie di trits corrispondenti, considerando ciascun trit contenuto nelle due word sulle quali deve essere eseguita, secondo la seguente tabella:
A | ||||
0 | 1 | 2 | ||
B | 0 | 1 | 0 | 0 |
1 | 1 | 0 | 2 | |
2 | 2 | 2 | 1 |
Dopo l'esecuzione di ogni istruzione, se il valore puntato da C è compreso tra 33 e 126 inclusi, è modificato secondo la seguente tabella:
!"#$%&'()*+,-./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@
(per esempio, ! diventa 5, " diventa z e così via)
Dopo di ciò, sia C che D sono incrementati con modulo 310 (59049) e il ciclo viene ripetuto.
Programmi di esempio
[modifica | modifica wikitesto]Vi sono pochissimi programmi scritti fino ad ora in Malbolge, data la difficoltà di creare risultati accettabili.
Hello, World!
[modifica | modifica wikitesto]Questo fu il primo programma "Hello, World!" scritto in Malbolge. In realtà il suo output non è perfetto, in quanto non tiene conto delle maiuscole né della punteggiatura (stampa "HEllO WORld"); un programma in grado di scrivere "Hello, World!" correttamente è molto più difficile da creare.
(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@b=`{^Lx8%$Xmrkpohm-kNi;gsedcba`_^]\[ZYXWVUTSRQPONMLKJIHGFEDCBA@?>=<;:9876543s+O<oLm
Hello, World! corretto
[modifica | modifica wikitesto]Questo programma riesce a stampare "Hello, world!" con i caratteri e la punteggiatura corretti.
('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm-,jcL(I&%$#" `CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
Programma ECHO
[modifica | modifica wikitesto]Questo programma legge una stringa in ingresso dallo standard input e la manda allo standard output:
(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
Note
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]- Wikimedia Commons contiene immagini o altri file su Malbolge
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Programming in Malbolge, guida alla programmazione con documentazione originale del linguaggio, su lscheffer.com.
- (EN) Pubblicazione del primo programma "Hello, World!" in Malbolge, su acooke.org. URL consultato il 6 novembre 2008 (archiviato dall'url originale il 2 luglio 2017).
- (EN) Interpreti e programmi per Malbolge, su esoteric.sange.fi.
- (EN) Programma in Malbolge che stampa l'intero testo di "99 bottles of beer", su 99-bottles-of-beer.net.
- (EN) Esoteric File Archive, archivio di file di Malbolge, su esoteric.voxelperfect.net. URL consultato il 6 novembre 2008 (archiviato dall'url originale il 24 aprile 2013).