Un linguaggio di programmazione esoterico è una tipologia di linguaggi di programmazione particolarmente complessi e volutamente meno chiari possibile. Questi linguaggi, popolari fra gli hacker e gli utenti più che abili, non hanno una vera utilità nel mondo reale, ma sono generalmente concepiti per mettere alla prova i limiti della programmazione su computer, come proof of concept per dimostrare una teoria o per semplice divertimento. Alcuni, invece, sono concepiti come esercizio per comprendere meglio il funzionamento di un calcolatore.
Storia
Il primo esempio di linguaggio esoterico è stato INTERCAL, scritto nel 1972 da James M. Lyon e Don Woods, col tentativo di creare un linguaggio totalmente differente da quelli esistenti all'epoca, parodiando elementi di Fortran, COBOL, e assembly.[1]
Venti anni più tardi Wouter van Oortmerssen ha creato FALSE, un linguaggio basato sul concetto di macchina a stack dotato di una sintassi confusa, illeggibile ed estremamente concisa: il compilatore occupa solamente 1024 byte. Questo ha in seguito ispirato Urban Müller a creare un linguaggio ancora più conciso, il Brainfuck, composto da soli otto caratteri riconosciuti.[2] Insieme al Befunge creato da Chris Pressey, sono i due linguaggi esoterici più noti.
Termini del linguaggio di programmazione esoterico
Turing Tarpit
È un linguaggio di programmazione Turing-completo il cui numero di comandi, operatori o oggetti è molto piccolo.
Stateful encoding
In questo metodo di programmazione, le istruzioni che il linguaggio di programmazione mette a disposizione sono in un elenco predefinito, e per eseguire un comando sono necessari due passaggi:
localizzarne la posizione nell'elenco (ad esempio in reMorse il salvataggio sullo stack è l'istruzione "1" dell'elenco);
lanciarlo, in modo da applicarne gli effetti.
L'elenco delle operazioni può essere sia statico - come in reMorse[3] e THRAT[4] o dinamico, come in reMorse4ever.
Ecco un esempio sulla base di reMorse o THRAT:
Select Next Operation in list
Perform Operation
Funge
Una funge è un programma le cui istruzioni sono disposte a formare una figura che si sviluppa bidimensionalmente, e la sequenza delle istruzioni è stabilita dalla direzione di movimento di un "puntatore" su tale figura. Il programmatore ha a disposizione, oltre che istruzioni sui dati, anche comandi per modificare posizione e direzione di movimento del puntatore.
Non determinismo
In un linguaggio non deterministico, l'esecuzione delle istruzioni non è garantita con certezza, ma solo con una certa probabilità. In linguaggi come questi, anche tentare di ottenere un risultato è un compito arduo, dato che non si ha la certezza che un'istruzione sia eseguita o meno, e quindi non è possibile prevederne il funzionamento.
Esempi
Di seguito alcuni esempi del classico programma hello world o di singole istruzioni scritte con linguaggi esoterici:
LOLCODE è stato creato per imitare il linguaggio dei "lolcat".
HAI
CAN HAS STDIO?
VISIBLE "HAI WORLD!"
KTHXBYE
Befunge è un linguaggio nel quale i programmi sono "distesi" in un array bidimensionale, nel quale il puntatore viene fatto scorrere.
"dlroW olleH">:v
^,_@
Brainfuck è uno dei linguaggi esoterici più estremi, nel quale minimalismo e offuscazione del codice sono portati a livelli molto elevati.
In Shakespeare le istruzioni ricalcano gli scritti dell'omonimo drammaturgo. Ad esempio, la frase seguente indica un punto nel listato che può essere raggiunto tramite un'istruzione simile a GOTO:
Act I: Hamlet's insults and flattery.
Malbolge è talmente complesso che il primo programma "Hello world" funzionante è arrivato due anni dopo il suo rilascio: