title: Malbolge
text: # 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
  
  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
  
  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
  
  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 |
  | - | - | - | - |
  | 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) | / |
  | 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 | A | A |
  | - | - | - | - | - |
  | | | 0 | 1 | 2 |
  | B | 0 | 1 | 0 | 0 |
  | B | 1 | 1 | 0 | 2 |
  | B | 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:
  
  (per esempio, ! diventa 5, " diventa z e così via)
  
  Dopo di ciò, sia C che D sono incrementati con modulo $3^{10}$ (59049) e il ciclo viene ripetuto.
  
  ## Programmi di esempio
  
  Vi sono pochissimi programmi scritti fino ad ora in Malbolge, data la difficoltà di creare risultati accettabili.
  
  ### Hello, World!
  
  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
  
  Questo programma riesce a stampare "Hello, world!" con i caratteri e la punteggiatura corretti.
  
  ### Programma ECHO
  
  Questo programma legge una stringa in ingresso dallo standard input e la manda allo standard output:
  
  