Malbolge

linguaggio di programmazione

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

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

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

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

Vi sono pochissimi programmi scritti fino ad ora in Malbolge, data la difficoltà di creare risultati accettabili.

Hello, World!

modifica

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

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

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
  1. ^ Lettera associata all'istruzione secondo la documentazione originale.
  2. ^ I caratteri di Newline e Line feed sono considerati lo stesso carattere e hanno valore 10; il carattere EOF ha valore 59048.

Altri progetti

modifica

Collegamenti esterni

modifica