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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]Turing Tarpit
[modifica | modifica wikitesto]È un linguaggio di programmazione Turing-completo il cui numero di comandi, operatori o oggetti è molto piccolo.
Stateful encoding
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]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
[modifica | modifica wikitesto]Di seguito alcuni esempi del classico programma hello world o di singole istruzioni scritte con linguaggi esoterici:
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.
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.
- Chef è stato sviluppato in modo che i suoi programmi sembrino ricette di cucina; per esempio, il seguente costrutto inserisce un valore in uno stack:
Put cinnamon into 2nd mixing bowl
- Cow è un linguaggio basato su comandi del tipo "moo" variando le maiuscole e l'ordine. Il seguente esempio genera la sequenza di Fibonacci:
MoO moO MoO mOo MOO OOM MMM moO moO MMM mOo mOo moO MMM mOo MMM moO moO MOO MOo mOo MoO moO moo mOo mOo moo
- FALSE è un linguaggio basato sugli stack, dotato di comandi a singolo carattere e variabili. Esempio di come visualizzare i numeri primi fino a 100:
99 9[1-$][\$@$@$@$@\/*=[1-$$[%\1-$@]?0=[\$.' ,\]?]?]#
- 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:
(=<`:9876Z4321UT.-Q+*)M'&%$H"!~}|Bzy?=|{z]KwZY44Eq0/{mlk** hKs_dG5[m_BA{?-Y;;Vb'rR5431M}/.zHGwEDCBA@98\6543W10/.R,+O<
Note
[modifica | modifica wikitesto]- ^ The A-Z of Programming Languages: INTERCAL, su techworld.com.au. URL consultato il 19 giugno 2011 (archiviato dall'url originale il 6 luglio 2011).
- ^ Brainfuck - An Eight-Instruction Turing-Complete Programming Language, su muppetlabs.com. URL consultato il 19 giugno 2011 (archiviato dall'url originale il 30 settembre 2007).
- ^ ReMorse
- ^ THRAT
Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]- Wikimedia Commons contiene immagini o altri file su linguaggio di programmazione esoterico
Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, esoteric programming language, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- (EN) Wiki dedicata ai linguaggi esoterici, su esolangs.org.
- (EN) DM's Esoteric Programming Languages, su dangermouse.net.