Vai al contenuto

Linguaggio di programmazione esoterico

Da Wikipedia, l'enciclopedia libera.
Schermata del linguaggio Orca

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.

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

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.

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<
  1. ^ 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).
  2. ^ 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).
  3. ^ ReMorse
  4. ^ THRAT

Voci correlate

[modifica | modifica wikitesto]

Altri progetti

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica