Un linguaggio di programmazione esoterico è un linguaggio di programmazione progettato per sfidare le norme della progettazione del linguaggio. È un linguaggio progettato per fare un punto. Il punto potrebbe essere qualsiasi cosa: la sfida stessa di creare qualcosa di insolito, fare uno scherzo elaborato, creare un linguaggio come espressione artistica, testare idee promettenti per la programmazione, ecc.
Questo dovrebbe chiarire che non esiste un modo semplice per classificare o organizzare correttamente tutti i diversi linguaggi di programmazione esoterici, poiché per definizione sfidano le regole. Ma potremmo usare alcuni concetti e principi organizzativi per ottenere un migliore senso della comunità che li circonda. In modo che potessimo capire per cosa le persone li usano, o usare queste informazioni come ispirazione per creare il tuo linguaggio esoterico.
Scarica la guida con 68 risorse sulla Creazione di Linguaggi di Programmazione
Ricevere la guida alla tua casella di posta per leggere su tutti i tuoi dispositivi quando hai tempo
Alcuni Concetti Utili
Turing Tarpit
Un Turing tarpit è un linguaggio di programmazione che è Turing-completo, ma praticamente inutilizzabile. Un linguaggio completo di Turing può simulare qualsiasi macchina di Turing. In termini pratici, puoi scrivere qualsiasi programma con esso. Quindi, in teoria, tutti questi linguaggi sono ugualmente potenti, ma quelli che sono anche un Tarpit di Turing rendono incredibilmente difficile scrivere qualsiasi tipo di programma. Un modo comune per farlo è ridurre il numero di simboli disponibili: prova a scrivere anche un programma Hello World con solo 8 caratteri.
Quine
Un quine è un programma che produce come output una copia del suo codice sorgente. Il programma non può essere il programma vuoto, anche se il programma vuoto è un programma valido nella lingua specifica. Leggere il codice sorgente dal disco o dalla memoria è anche considerato barare. Il nome” quine ” è stato coniato da Douglas Hofstadter, nel suo libro Gödel, Escher, Bach: An Eternal Golden Braid, in onore del filosofo Willard Van Orman Quine. Quindi il concetto di quine non è unico nei linguaggi di programmazione esoterici, ma è comunque una tipica prima sfida da superare quando si scrive uno.
Codice Golf
Un codice golf è un tipo di competizione in cui l’obiettivo è quello di scrivere il programma più breve possibile che implementano un determinato algoritmo. In questo contesto, più breve significa avere il codice sorgente più breve. Ciò non significa avere la dimensione più piccola del codice eseguibile binario. Giocare a golf codice si chiama “golf scripting”. Ci sono anche tutti gli altri tipi di competizioni legate alla programmazione, che, dato il pubblico, spesso incoraggiano l’imbroglio creativo. In generale una sfida è un fattore motivante per molti linguaggi di programmazione esoterici.
Offuscamento
Il concetto di offuscamento, vale a dire per nascondere il vero significato di un messaggio, non è ovviamente esclusivo dei linguaggi di programmazione esoterici o anche della programmazione in generale. Ma ha una grande rilevanza in molti linguaggi di programmazione esoterici. Soprattutto se si intende nel senso generale più ampio di fuorviante o confondere il destinatario. Non stai nascondendo il messaggio perché il messaggio stesso è importante, ma perché la forma nascosta è, di per sé, l’obiettivo. Un modo tipico per raggiungere questo obiettivo è riducendo al minimo il numero di simboli della lingua, ma si può anche camuffare un linguaggio di programmazione in quello che sembra un testo normale o un’immagine.
Non determinismo
In questo significato più ampio di fuorviante, o confondere il pubblico, il non determinismo può anche essere usato per raggiungere lo stesso obiettivo. Un linguaggio non deterministico è uno per il quale, dato lo stato corrente di un programma, lo stato successivo non può sempre essere previsto. Il concetto ha un certo uso nei normali linguaggi di programmazione, essenzialmente a causa di condizioni imprevedibili in fase di esecuzione. Ma è portato all’estremo da alcuni linguaggi di programmazione esoterici, randomizzando le variabili o anche randomizzando le istruzioni stesse.
Gruppi di linguaggi di programmazione Esoterici
Come abbiamo già detto non possiamo fornire un modo esaustivo di organizzare tutti i linguaggi di programmazione esoterici. E anche se qualcuno potesse trovarlo, presto qualcun altro inventerebbe un nuovo linguaggio di programmazione esoterico solo per renderlo non valido. Quindi quello che stiamo cercando di fare è semplicemente offrire alcuni gruppi, o categorie, per capire meglio ed esplorare il mondo dei linguaggi di programmazione esoterici.
- Lingue con un valore oggettivo, sebbene questo valore non sia necessariamente estrinseco o tipico. Un esempio di base è un linguaggio progettato per vincere una competizione di golf codice: il suo valore può essere misurato, ma non ha alcun significato al di fuori della comunità di linguaggi di programmazione esoterici. Ma il tipo più utile sono quelli progettati per raggiungere un obiettivo insolito, come ad esempio bypassare le misure di sicurezza (vedi JSFuck) o definire i linguaggi di tipo 0 della gerarchia di Chomsky (vedi Thue).
- Lingue inutilizzabili. Queste sono lingue che sono molto difficili da usare. Questo può essere un obiettivo esplicito del progettista o semplicemente un incidente del design stesso. Un utente può anche trovato divertente usarli per qualche tempo. Un modo tipico per ottenere un linguaggio inutilizzabile, sia per progettazione che per caso, è con il minimalismo (vedi Brainfuck). Ma se vuoi qualcosa di quasi impossibile da usare hai bisogno di qualcosa come un linguaggio che usi un sistema ternario e si auto-alteri intenzionalmente, tra le altre cose (vedi Malbolge).
- Lingue per testare un’idea o provare qualcosa. Queste sono lingue che potrebbero non essere direttamente utili, ma sono un buon banco di prova per un nuovo concetto o per dimostrare qualcosa. Ad esempio, un linguaggio in cui i programmi sono disposti in una griglia bidimensionale (vedi Befunge) o un linguaggio funzionale quasi puro (vedi Unlambda)
- Linguaggi artistici. Questi sono linguaggi progettati con l’idea di avere un certo valore artistico. Si potrebbe sostenere che fanno effettivamente parte del gruppo dei linguaggi di test o di quelli con un valore oggettivo. Li mettiamo in una categoria diversa, perché non sembrano programmazione, ma tendono a sembrare interessanti, anche se potresti non volerli usare. Per esempio, sembrano arte astratta (vedi Piet) o come un dramma Shakesperean (vedi Shakespeare).
- Scherzi lingue. Queste sono lingue inventate con persone con uno strano senso dell’umorismo. Come una persona che dice: “vuoi sentire uno scherzo? – poi si legge La guerra e la pace, prima di concludere-Tutta la nostra vita è uno scherzo!”. Un esempio è un linguaggio satirico, dove anche il manuale di riferimento è uno scherzo (vedi INTERCAL)
Alcuni notevoli linguaggi esoterici
Ovviamente questo non è un elenco esaustivo di notevoli linguaggi di programmazione esoterici, ma più modestamente un elenco di alcuni notevoli per il loro successo o peculiarità.
Befunge
La principale caratteristica esoterica di Befunge è che i programmi sono disposti in una griglia bidimensionale. È anche un linguaggio basato su stack e riflettente, quindi consente a un programma di modificarsi. L’obiettivo principale era progettare un linguaggio per il quale era il più difficile possibile creare un compilatore.
La versione originale, ora chiamata Befunge-93, non è Turing completa, perché mette un limite di 80×25 alla dimensione della griglia. Ma una nuova versione, chiamata Befunge-98, rimuove questo limite e dovrebbe essere Turing completo. Befunge ha generato un’intera classe di linguaggi multidimensionali, chiamati Fungeoid.
Befunge ha comandi che controllano la direzione su, giù, sinistra, destra e quindi possono anche creare un ciclo, insieme a comandi più tradizionali per output, operazioni binarie, ecc.
Un programma Hello Word è simile a questo.
> vv ,,,,,"Hello"<>48*, vv,,,,,,"World!"<>25*,@
Brainfuck
Probabilmente il più famoso di tutti i linguaggi di programmazione esoterici, si distingue per il suo minimalismo estremo. Sia nel numero di comandi disponibili che anche nell’avere un compilatore molto piccolo. In effetti la seconda condizione è la ragione della prima, perché l’autore voleva creare un linguaggio con il compilatore più piccolo possibile. L’autore ha creato un compilatore che utilizzava solo 240 byte. A volte in seguito qualcun altro ne ha creato uno con soli 100 byte. Una conseguenza naturale di questo obiettivo è che il linguaggio è difficile da usare, anche se è Turing completo. In breve, è un tarpit di Turing.
A volte viene indicato con un’ortografia censurata, come Brainf*ck o molte altre varianti.
Il linguaggio consiste in otto diversi comandi che manipolano un puntatore di dati e due flussi di byte per l’input e l’output. Supporta anche loop. Altri caratteri, oltre a quelli che rappresentano i comandi, sono considerati commenti e ignorati dal compilatore.
Questo è un esempio di come funziona il linguaggio (tratto dal wiki di Esolangs).
Code: Pseudo code:>> Move the pointer to cell2 Set cell2 to 0 << Move the pointer back to cell0 End while
Un programma Hello World è simile a questo.
++++++++>+>+>->>+<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.
Se vuoi saperne di più puoi vedere sulla pagina Wikipedia corrispondente o sulla pagina Esolangs.
INTERCAL
INTERCAL potrebbe non essere stato il primo linguaggio di programmazione esoterico, ma è certamente il primo famoso. Quanti anni ha? È stato creato nel 1972 e la prima implementazione è stata fatta con schede perforate. Il linguaggio era inteso come una parodia, ma anche per fare qualcosa di completamente nuovo, un alieno al mondo della programmazione. Il nome non è un acronimo, secondo gli autori:
Il nome completo del compilatore è “Linguaggio del compilatore senza acronimo pronunciabile”, che è, per ovvi motivi, abbreviato ” INTERCAL.”
Il resto del Manuale di riferimento INTERCAL (formato PS) è anche pieno di affermazioni senza senso o umoristiche. Questo è sia per la lingua che descrivono sia per come lo fanno. Ad esempio questa è una sezione sulle variabili
INTERCAL consente solo 2 diversi tipi di variabili, l’intero a 16 bit e l’intero a 32 bit. Questi
sono rappresentati da un punto ( . ) o a due punti (:), rispettivamente, seguito da un numero qualsiasi compreso tra 1 e 65535,
compreso. Queste variabili possono contenere solo numeri non negativi; quindi hanno i rispettivi intervalli di valori
: da 0 a 65535 e da 0 a 4294967295. Nota: .123 e :123 sono due variabili distinte. D’altra parte,
.1 e .0001 sono identici. Inoltre, quest’ultimo non può essere scritto come 1E-3 .
La lingua permette anche l’uso di un modificatore PLEASE
. Tuttavia, richiede anche l’uso della quantità corretta di questa parola chiave. Non può essere usato troppo poco o troppo, vale a dire che è necessario mostrare la giusta quantità di cortesia. La parte davvero poco divertente è che era una caratteristica non documentata nel manuale originale. Un manuale scherzo per un manuale scherzo può essere ok, ma uno che è incompleta è inaccettabile.
Questo è un Hello World in una versione di INTERCAL implementata con C: C-INTERCAL.
DO ,1 <- #13PLEASE DO ,1 SUB #1 <- #238DO ,1 SUB #2 <- #108DO ,1 SUB #3 <- #112DO ,1 SUB #4 <- #0DO ,1 SUB #5 <- #64DO ,1 SUB #6 <- #194DO ,1 SUB #7 <- #48PLEASE DO ,1 SUB #8 <- #22DO ,1 SUB #9 <- #248DO ,1 SUB #10 <- #168DO ,1 SUB #11 <- #24DO ,1 SUB #12 <- #16DO ,1 SUB #13 <- #162PLEASE READ OUT ,1PLEASE GIVE UP
In breve, INTERCAL è uno scherzo molto elaborato. Il tipo di scherzo che può portare ad ammirare il suo creatore per la sua perseveranza o di dubitare della sua sanità mentale, o forse entrambi.
JSFuck
Il successo di Brainfuck ha stimolato la creazione di molti linguaggi derivati, troppi per citarli tutti. Ma il più notevole è JSFuck.
JSFuck non un linguaggio proprio, ma pi di uno stile di programmazione esoterico di Javascript che richiede di usare solo 6 caratteri. I programmi risultanti sono programmi JavaScript validi e infatti è stato inventato per bypassare le tecniche di sicurezza come il rilevamento di malware. Le sue proprietà lo hanno reso utile anche per l’offuscamento del codice.
Funziona perché puoi valutare qualsiasi espressione in Javascript come qualsiasi tipo. Quindi rappresenta e svuota l’array, ma anteponendolo con un
+
puoi forzarlo a valutare come numero 0. Per ottenere una lettera come a
puoi manipolare il valore false
, ecc. Il risultato finale è un linguaggio estremamente prolisso: l’equivalente di alert("Hello World!")
è lungo 22948 caratteri.
Malbolge
Malbolge è un linguaggio specificamente progettato per essere quasi impossibile da utilizzare:
tramite un intuitivo ‘pazzo’ ” operazione, base-tre aritmetica, e di auto-alterare il codice
nelle parole del suo creatore.
In realtà anche l’autore non ha mai scritto un programma di lavoro con esso. Il primo programma è stato generato da un altro programma che ha implementato un algoritmo di ricerca euristica. Il linguaggio non è completo di Turing e si basa anche su un errore di ortografia di Malebolge, l’otto cerchio dell’inferno di Dante Alighieri. Quindi in realtà non ha alcuna qualità redentrice.
Non tenterò di descriverlo perché il tutto è esplicitamente un esercizio di frustrazione. Tuttavia c’è una notevole “operazione folle” che vale la pena menzionare: la crittografia. Il linguaggio dovrebbe funzionare su una macchina virtuale ternaria e ha tre registri, uno dei quali contiene un puntatore all’istruzione corrente e si chiama . Dopo l’esecuzione dell’istruzione, il modulo 94 del valore in
sostituisce tutto ciò che è in
, quindi il risultato viene crittografato in base a una tabella di crittografia. Benvenuto all’inferno, davvero.
Qualche anima coraggiosa ha creato un programma Hello World.
(=<`#9]~6ZY32Vx/4Rs+0No-&Jk)"Fh}|Bcy?`=*z]Kw%oG4UUS0/@-ejc(:'8dc
Piet
Piet è un linguaggio in cui i programmi sono rappresentati come dipinti di arte astratta, nello stile di Piet Mondrian. È basato su stack e Turing completo.
Ci sono 18 colori ordinati in base alla tonalità e alla luminosità, più bianco e nero. Questi ultimi due hanno un significato speciale e sono usati per il flusso di controllo. L’esecuzione del programma si basa su due “puntatori”: un puntatore di direzione e un selettore di blocchi di colore. Il DP può puntare su, giù, sinistra e destra, mentre CC può solo puntare a sinistra ea destra. La combinazione di questi due puntatori governa l’esecuzione del programma: fondamentalmente quale blocco di colore viene eseguito dopo. La dimensione di un blocco di colore rappresenta un numero intero. Quando la transizione del programma tra diversi blocchi di colore, la loro differenza di tonalità e luminosità determina il tipo di comando che viene eseguito. I comandi sono i soliti, come emettere un valore, moltiplicare, ecc.
Il programma Hello World ha una certa bellezza.
Shakespeare
Shakespeare è un linguaggio progettato per avere: “bellissimo codice sorgente che assomigliava a opere di Shakespeare”. Il linguaggio ha pochi comandi ed è funzionalmente simile al linguaggio assembly, ma non è sorprendentemente abbastanza dettagliato.
Le variabili devono essere dichiarate in una sezione iniziale e i loro nomi devono essere validi personaggi shakespeariani, come Romeo o Giulietta. Queste variabili sono pile su cui in seguito verranno eseguite operazioni come pop, push e input/output. Il nome di atti e scene funziona come goto etichette e la destinazione di alcune istruzioni condizionali. I personaggi, cioè le variabili, devono essere chiamati sul palco per essere manipolati e possono esserci solo due alla volta sul palco.
Le linee di solito rappresentano costanti numeriche: alcuni nomi e aggettivi vengono convertiti in valori numerici.
Hamlet: You lying stupid fatherless big smelly half-witted coward!Juliet: You are as villainous as the square root of Romeo!
Parole speciali, come “Ricorda”, o loro combinazioni, come “Parla la tua mente”, eseguono comandi. Questi sono comandi normali come spingere i valori sul carattere stack, emettere il valore della variabile corrente o il carattere ASCII corrispondente.
Un’istruzione condizionale è rappresentata da una domanda da un carattere e una risposta dall’altro carattere che determina dove andare, se la condizione della domanda valuta true.
Juliet: Am I better than you?Hamlet: If so, let us proceed to scene III.
Il mondo Ciao è lungo e produttivo come un dramma shakespeariano.
The Infamous Hello World Program.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.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! Scene II: The praising of Juliet.Hamlet: Thou art as sweet as the sum of the sum of Romeo and his horse and his black cat! Speak thy mind! Scene III: The praising of Ophelia.Hamlet: Thou art as lovely as the product of a large rural town and my amazing bottomless embroidered purse. Speak thy mind! Thou art as loving as the product of the bluest clearest sweetest sky and the sum of a squirrel and a white horse. Thou art as beautiful as the difference between Juliet and thyself. Speak thy mind! Act II: Behind Hamlet's back. Scene I: Romeo and Juliet's conversation.Romeo: Speak your mind. You are as worried as the sum of yourself and the difference between my small smooth hamster and my nose. Speak your mind!Juliet: Speak YOUR mind! You are as bad as Hamlet! You are as small as the difference between the square of the difference between my little pony and your big hairy hound and the cube of your sorry little codpiece. Speak your mind! Scene II: Juliet and Ophelia's conversation.Juliet: Thou art as good as the quotient between Romeo and the sum of a small furry animal and a leech. Speak your mind!Ophelia: Thou art as disgusting as the quotient between Romeo and twice the difference between a mistletoe and an oozing infected blister! Speak your mind!
Thue
Thue è un linguaggio di programmazione basato su un sistema di riscrittura delle stringhe, chiamato semi-Thue system. Non è deterministico e segue il paradigma di programmazione dei vincoli. Il che significa che le variabili sono definite in termini di vincolo (es. qualcosa è vero o falso). È un tarpit di Turing.
Nel caso di Thue i costraints sono rappresentati da un elenco di regole di sostituzione nella forma:
<string>::=<replacement>
I formati speciali di questo modulo rappresentano input, output o la fine dell’elenco di regole.
La natura non deterministica del linguaggio può essere mostrata indicando due possibili sostituzioni per la stessa stringa. Biru:
- si scrive una regola che dice che la stringa
a
può essere sostituito constupid
- si anche scrivere una regola che dice che la stringa
a
può essere sostituito conyou are
Quando un programma viene eseguito la stringa a
può essere sostituito da una delle due opzioni.
L’elenco delle regole è seguito da una stringa che rappresenta lo stato iniziale.
Mentre scrivere un programma utile può essere difficile, il tipico Hello World è abbastanza facile e comprensibile, almeno per lo standard dei linguaggi di programmazione esoterici.
a::=~Hello World!::=a
Unlambda
Unlambda è un linguaggio funzionale (quasi) puro progettato per mostrare un linguaggio puramente funzionale (e probabilmente quanto poco pratico sarebbe). Si basa sulla logica combinatoria. È Turing completo e il primo tarpit Turing funzionale. Si basa su alcune funzioni ,un operatore apply `
(il carattere backquote) e supporta anche input/output. Tecnicamente funziona solo su funzioni con un singolo argomento, ma le funzioni multi-argomento possono essere tradotte in una sequenza di funzioni.
Un programma Hello World sembra quasi leggibile.
`r```````````.H.e.l.l.o. .w.o.r.l.di
Altri interessanti linguaggi esoterici
Fugue è un linguaggio che utilizza file MIDI come codice sorgente. Gli intervalli tra ogni nota vengono tradotti in specifici comandi tradizionali, come input/output o addizione.
Beatnik è un linguaggio basato su stack che consiste in una serie di parole inglesi; spazi bianchi e punteggiatura vengono ignorati. Le parole vengono convertite in comandi tradizionali in base al loro valore nel gioco Scrabble.
Lo spazio bianco è un linguaggio scherzoso in cui solo i caratteri degli spazi bianchi, come tabulazioni e spazi, sono validi e qualsiasi altro carattere viene ignorato. Questo è, ovviamente, l’inverso del solito comportamento dei compilatori che ignorano gli spazi bianchi. Date queste caratteristiche, può essere utilizzato in un programma Poliglotta, vale a dire un programma che è valido per più di una lingua. Finché l’altra lingua non è Python, o qualsiasi lingua in cui gli spazi bianchi contano.
GolfScript è un linguaggio di programmazione concatenativo progettato per vincere gare di codice-golf, che è anche Turing completo.
Snowflake è un linguaggio reversibile auto-modificante in cui sia l’interprete che il programma vengono modificati ad ogni esecuzione.
FRACTRAN è un linguaggio in cui i programmi sono un elenco di frazioni e un numero iniziale. Non sono sicuro di cosa faccia, ma fa qualcosa, dal momento che ha una pagina di Wikipedia.
Iota e Jot sono due linguaggi formali, ognuno progettato per essere il sistema formale più semplice. Per loro natura possono anche essere considerati altrettanto minimalisti, Turing tarpit, linguaggi di programmazione. Entrambi usano solo due simboli ed eseguono due operazioni. Un successore, chiamato Zot, supporta anche input / output.
Entropia è un linguaggio di programmazione molto giustamente chiamato progettato per accettare l’idea di rinunciare al controllo. Qualsiasi output del programma sarà approssimato e ogni volta che si accede ai dati viene modificato in modo casuale. La lingua non modifica il programma originale, quindi ogni volta che viene eseguito l’output sarà diverso, ma lo stato iniziale verrà preservato. Un curioso effetto collaterale della randomizzazione dei dati è Drunk Eliza, una versione web del classico programma Eliza in cui il terapeuta sembra essere ubriaco.
Monicelli è un linguaggio scherzoso basato sul film commedia I miei amici. Un programma tipico sembra una serie di frasi italiane senza senso. Sorprendentemente questo ha senso dal momento che il film utilizzato come ispirazione dispongono anche frasi senza senso. È il cerchio della follia.
Sommario
Il mondo del linguaggio di programmazione esoterico è tanto eccitante quanto esasperante: non ci sono regole, ma molte cose interessanti. Spero di averti dato una finestra un po ‘ sana su ciò che potresti aspettarti.
Se vuoi saperne di più o partecipare a questa community ti suggerisco di guardare Esolangs. Questo sito web, insieme a Wikipedia, è la fonte della maggior parte degli esempi mostrati in questo articolo. Ci si può anche trovare qualche ispirazione in un elenco di idee per un linguaggio di programmazione esoterico.
Si può anche trovare interessante il blog di Marc C. Chu-Carroll nelle sue numerose incarnazioni nel corso degli anni. Come suggerisce il nome Good Math, Bad Math, è principalmente dedicato alla matematica. Tuttavia ha anche molte analisi dei linguaggi di programmazione esoterici in una serie chiamata Programmazione patologica (Linguaggio). Si può vedere, per esempio, uno dedicato al linguaggio di programmazione più piccolo.