I linguaggi di programmazione esoterici
Un bravo programmatore ben sa che quando scrive del codice, questo deve essere ben leggibile (almeno per se stesso!) in maniera tale che in futuro, quando dovrà rimetterci mano per aggiornarlo, integrarlo, correggere eventuali bug, sia più facile rientrare nel meccanismo di ragionamento instaurato tempo prima per risolvere un particolare problema. Questo concetto è ovviamente ancora più importante nei casi in cui il sorgente debba essere condiviso o lavorato con altre persone: la leggibilità deve essere un fattore essenziale. Un programma leggibile è inoltre più facile da debuggare e ampliare ma non starò qui a discutere dei concetti fondamentali che si studiano in ingegneria del software, alcuni dei quali sono ovviamente dettati anche dal buon senso.
Un buon programmatore è in genere una persona che ragiona in maniera ordinata, pulita, schematica e con un occhio rivolto al futuro e quindi i suoi programmi riflettono questo modo di ragionare.
Nel mondo dei linguaggi di programmazione siamo abituati a sentir parlare spesso di linguaggi come il C o derivati da esso, Java, Basic e Pascal nelle loro varie salse. Oltre a questo gruppo di linguaggi di programmazione piuttosto diffusi, ne esiste un altro, forse anche più folto ma sicuramente meno noto, del quale fanno parte i linguaggi di programmazione esoterici.
Il perchè di questa definizione è presto detto: si tratta difatti di linguaggi piuttosto oscuri, in un qualche modo misteriosi, volutamente studiati per essere minimalisti e quindi, conseguentemente, di difficile comprensione e il meno chiari possibile. Ma… Perchè ?
Non c’è un perchè… A volte questi linguaggi vengono creati per gioco, per sfida, per studio, per mettere alla prova sia gli umani che le macchine. Fatto sta che non si tratta di linguaggi utilizzati realmente: molto difficilmente troverete un software scritto con uno di questi linguaggi esoterici, ad ulteriore conferma del fatto che sono destinati solo ad una ristretta fascia di utenti che li utilizzano un po’ come se fosse un gioco di enigmistica o per esercizio mentale… ma a volte anche per divertirsi!
Figuratevi che questi linguaggi sono talmente complessi che uno di loro, Malbolge, ha visto il suo primo programma funzionante (un semplice “Hello World”) dopo ben due anni dal rilascio del compilatore!
Illustrerò qui i linguaggi di programmazione esoterici più “curiosi”.
Indice dei contenuti
BrainFuck
Il nome di questo linguaggio la dice ben lunga! Utilizza soltanto 8 istruzioni, in pratica solo quelle essenziali per poter svolgere qualsiasi funzione. E’ il linguaggio più minimalista in assoluto e anche il più seguito dalla comunità di programmatori esoterici. Le istruzioni, però, non sono in forma “letterale” come siamo abituati, bensì ognuna delle 8 istruzioni è rappresentata tramite un simbolo ASCII. Tanto per farvi capire, questo che segue è il listato di un programma che stampa a video “Hello World” :
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>. |
Penso che ora sia più chiaro il perchè del nome dato a tale linguaggio. Maggiori informazioni si possono trovare su Wikipedia.
Spoon
Derivato dal BrainFuck, ma utilizza sequenze di 0 e 1.
Ook!
Uguale al BrainFuck, con la sola differenza che i simboli sono sostituiti da “parole” (?). Il nome “Ook” dovrebbe rappresentare il verso dell’orangotango e le istruzioni sono tutte costituite dalla parola “Ook” seguita da un segno di punteggiatura. I programmi scritti con questo linguaggio, come afferma l’autore, dovrebbero somigliare ad un discorso tra orangotanghi (!!!). Il listato di Hello World in pratica è il seguente:
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook. |
Moo
Simile all’Ook: imita il verso della mucca e anzichè usare i segni di punteggiatura per distinguere le parole chiave, vengono alternate le maiuscole e le minuscole della parola “moo”:
MoO moO MoO mOo MOO OOM MMM moO moO MMM mOo mOo moO |
WhiteSpace
E’ forse uno di quelli di più difficile comprensione per il semplice fatto che i programmi scritti con questo linguaggio sono letteralmente invisibili. Le istruzioni difatti vengono scritte utilizzando spazi bianchi, tabulazioni e ritorni a capo. Si capisce, ovviamente, che un listato scritto con solo questi caratteri appare “bianco”, vuoto. Da qui il nome. In questo link, ad esempio, c’è il programma che scrive “Hello World”: a parte la prima riga, che è un commento, il programma vero e proprio può essere “visto” cliccando con il tasto sinistro del mouse sulla pagina e trascinando il puntatore (in pratica vengono evidenziati i caratteri “trasparenti”).
Oltre ai linguaggi esoterici appena esposti, estremamente minimalisti e di difficile comprensione, ce ne sono altri forse più “simpatici” e alcuni di loro sono anche leggermente più facili da interpretare:
LOLCODE
Il Lolcode è un linguaggio che ha una sintassi abbastanza comprensibile e utilizza parole chiave scritte in una sorta di slang inglese che si rifà al fenomeno internet dei LOLCATS.
Su questo sento la necessità di spenderci su due parole con la consapevolezza di andare OT, ma la trovo una cosa simpatica e la voglio esporre.
I Lolcats sono in pratica fotografie di gatti, generalmente in pose curiose, sulle quali vengono apposte delle scritte umoristiche in slang e grammaticamente scorrette. Un esempio di Lolcat è questa immagine:
Il LOLCODE utilizza quindi questo modo curioso di parlare. Il programma che stampa “Hello World” a video è il seguente:
HAI CAN HAS STDIO? VISIBLE "HAI WORLD!" KTHXBYE |
E’ visibile una certa similitudine con il C: L’istruzione “CAN HAS” rappresenta in pratica un “INCLUDE” e l’istruzione “VISIBLE” può essere assimilata alla “PRINTF”.
Chef
E’ abbastanza complicato ed è strutturato in maniera tale che il listato somigli ad una ricetta di cucina scritta in lingua inglese e comprende solo istruzioni per la manipolazione dello stack. Il programma Hello World è abbastanza lungo:
Hello World Souffle. Ingredients. 72 g haricot beans 101 eggs 108 g lard 111 cups oil 32 zucchinis 119 ml water 114 g red salmon 100 g dijon mustard 33 potatoes Method. Put potatoes into the mixing bowl. Put dijon mustard into the mixing bowl. Put lard into the mixing bowl. Put red salmon into the mixing bowl. Put oil into the mixing bowl. Put water into the mixing bowl. Put zucchinis into the mixing bowl. Put oil into the mixing bowl. Put lard into the mixing bowl. Put lard into the mixing bowl. Put eggs into the mixing bowl. Put haricot beans into the mixing bowl. Liquefy contents of the mixing bowl. Pour contents of the mixing bowl into the baking dish. Serves 1. |
Ad un colpo d’occhio attento è facile capire che le lettere che compongono la frase “Hello World!” sono scritte in testa al programma in formato numerico (rappresentante il codice ASCII delle lettere) come quantitativi degli “ingredienti” mentre il nome degli ingredienti (patate, salmone, acqua ecc) rappresentano i nomi delle variabili alle quali viene appunto associata ogni singola lettera. Da notare che gli “ingredienti” sono scelti in maniera tale che la prima lettera sia uguale alla lettera da stampare (così è più facile ricordarsene?!), questo non vale per gli spazi bianchi e i segni di punteggiatura. Le “unità di misura” vengono ignorate.
Shakespeare
I programmi scritti in questo linguaggio somigliano a commedie scritte dal famoso drammaturgo William Shakespeare. I programmi sono strutturati come in Assembler e fanno quindi uso di istruzioni di basso livello. La difficoltà di comprensione è molto elevata e i programmi appaiono lunghissimi. Qui vi illustro solo una minima parte del programma Hello World:
Romeo, a young man with a remarkable patience. Juliet, a likewise young woman of remarkable grace. Ophelia, a remarkable woman much in dispute with Hamlet. Hamlet, the flatterer of Andersen Insulting A/S. Act I: Hamlet's insults and flattery. Scene I: The insulting of Romeo. [Enter Hamlet and Romeo] Hamlet: You lying stupid fatherless big smelly half-witted coward! You are as stupid as the difference between a handsome rich brave hero and thyself! Speak your mind! You are as brave as the sum of your fat little stuffed misused dusty old rotten codpiece and a beautiful fair warm peaceful sunny summer's day. You are as healthy as the difference between the sum of the sweetest reddest rose and my father and yourself! Speak your mind! You are as cowardly as the sum of yourself and the difference between a big mighty proud kingdom and a horse. Speak your mind. Speak your mind! [Exit Romeo] Scene II: The praising of Juliet. [Enter Juliet] Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! [Exit Juliet] Scene III: The praising of Ophelia. [Enter Ophelia] Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! |
In pratica determinate frasi, come “Speak your mind”, hanno funzioni ben precise e molte istruzioni hanno dei sinonimi in maniera tale da rendere il programma una vero e proprio scritto teatrale! Il paradigma di tale linguaggio, come quello di Chef, vedete che è molto particolare e deriva dalla programmazione strutturale.
Monicelli
Ho lasciato per ultimo questo, che è tipicamente italiano. Il nome deriva dal noto regista italiano Mario Monicelli, direttore della famosissima saga Amici Miei. Adesso potete capire il perchè dell’immagine di copertina! Il linguaggio in questione fa infatti uso della Supercazzola. Ad esempio, questo programma scritto in Monicelli esegue il calcolo del fattoriale:
bituma un po' il calcolo del fattoriale come fosse un Sassaroli, o no? blinda la supercazzola Sassaroli antanizzata con pazienza bitumata, concorda Sassaroli o scherziamo? voglio il gruppo, Sassaroli il gruppo come fosse 1 che cos'è la pazienza? 1: il gruppo come fosse 2 con scappellamento a destra per 1 o tarapia tapioco: il gruppo come fosse prematurata la supercazzola antanizzata con pazienza meno 1 o scherziamo? per la pazienza e velocità di esecuzione bitumata! in fretta, e bitumando! se no il gruppo si spacca, e insomma, vaffanzum il gruppo! Lei ha clacsonato voglio il vicesindaco, Necchi voglio il numero, Necchi mi porga il numero bitumando il vicesindaco, dico, bitumando il vicesindaco come fosse un numero prematurata la supercazzola antanizzata con il vicesindaco o scherziamo? a posterdati bitumati, pure, o in questura? |
Meraviglia assoluta! Potete trovare più informazioni sul Monicelli nel repo Github.
Linguaggi di programmazione in altre lingue
L’elenco di linguaggi di programmazione esoterici potrebbe scorrere all’infinito: HQ9+, Byter, Befunge, FALSE, Velato (un linguaggio basato su sequenze di note musicali in un file MIDI!), Malbolge, Doublefuck, Brainfork, PATH, SNUSP, l33t, L00p, QUOTE, Aura ecc ecc
Senza annoverare, inoltre, altri linguaggi di programmazione incomprensibili che non vengono generalmente inclusi tra gli esoterici, come l’ APL che è basato su simboli anzichè su parole chiave.
I linguaggi di programmazione “canonici”, inoltre, avrete notato che hanno sempre le parole chiave scritte in lingua inglese: questa è una scelta ovvia in quanto l’inglese è una lingua universale. Esistono però tantissimi altri linguaggi di programmazione che non sono basati sull’inglese ma sulle più disparate lingue. Questi linguaggi, ovviamente, NON rientrano nella lista dei linguaggi di programmazione esoterici anche se alcuni linguaggi potrebbero sembrarlo in quanto utilizzanti gli ideogrammi e alfabeti propri delle lingue di appartenenza come il Jeem ج (arabo), Rapira (russo), Nadesiko (giapponese), Farsi.NET (persiano), Hindawi (lingue indiane), HPL (ebraico) ecc ecc