# Linguaggio di programmazione esoterico

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.
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. 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 e THRAT o dinamico, come in reMorse4ever.
Ecco un esempio sulla base di reMorse o THRAT:

### 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".
* Befunge è un linguaggio nel quale i programmi sono "distesi" in un array bidimensionale, nel quale il puntatore viene fatto scorrere.
* Brainfuck è uno dei linguaggi esoterici più estremi, nel quale minimalismo e offuscazione del codice sono portati a livelli molto elevati.
* Chef è stato sviluppato in modo che i suoi programmi sembrino ricette di cucina; per esempio, il seguente costrutto inserisce un valore in uno stack:
* Cow è un linguaggio basato su comandi del tipo "moo" variando le maiuscole e l'ordine. Il seguente esempio genera la sequenza di Fibonacci:
* FALSE è un linguaggio basato sugli stack, dotato di comandi a singolo carattere e variabili. Esempio di come visualizzare i numeri primi fino a 100:
* 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:
* Malbolge è talmente complesso che il primo programma "Hello world" funzionante è arrivato due anni dopo il suo rilascio: