"Lei ha clacsonato" è l'incipit di un programma scritto in Monicelli, un linguaggio che usa come istruzioni le supercazzole rese famose nei vari film "Amici miei". Monicelli è uno dei tanti linguaggi esoterici, nati un po' per gioco e un po' come sfida; alcuni hanno lo scopo di divertire, altri sono pensati per mucche e oranghi, altri ancora per essere estremamente difficili da usare, al punto di meritarsi il nome di un cerchio dell'inferno dantesco. Pensate che il vostro collega scriva codice incomprensibile? Think again.
Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Andrea Maietta - Il fascino della supercazzola: un breve viaggio nel mondo dei linguaggi esoterici - Codemotion Milan 2017
1. Il fascino della supercazzola
Breve viaggio nel mondo dei linguaggi esoterici
CODEMOTION MILAN - SPECIAL EDITION
10 – 11 NOVEMBER 2017
Andrea Maietta
2. Esoterico
In ambito filosofico e religioso, si dicono
esoterici le dottrine e gli insegnamenti
segreti, che non devono essere divulgati
perché destinati a pochi
Treccani, enciclopedie online
7. Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
8. Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
Comprensibile, stile C
9. Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
Comprensibile, stile C
Scopo goliardico
21. Variabili
Assegnazione
<variabile> come fosse <espressione>
antani come fosse 2
antani come se fosse 2
Dichiarazione e assegnazione
voglio <variabile> come fosse <espressione>
voglio antani, Necchi come se fosse 4
25. Cicli
Uno, equivalente a do {} while ();
stuzzica
<istruzioni>
e brematura anche, se <condizione>
26. Cicli
Uno, equivalente a do {} while ();
stuzzica
<istruzioni>
e brematura anche, se <condizione>
voglio antani, Necchi come fosse 10
stuzzica
antani a posterdati
antani come fosse antani meno 1
e brematura anche, se antani
maggiore uguale a 0
27. Condizioni
Two costrutt is megl’ che uan
che cos’è <variabile>?
<condizione>
<istruzioni>
o magari <condizione>:
<istruzioni>
o magari <condizione>:
<istruzioni>
o tarapia tapioco:
<istruzioni>
e velocità di esecuzione
28. Condizioni
Two costrutt is megl’ che uan
che cos’è il genio?
maggiore di mobiletto:
genio come se fosse 2
o tarapia tapioco:
genio come se fosse 0
e velocità di esecuzione
32. Funzioni
Dichiarazione
blinda la supercazzola Necchi
antanizzata con alfio Mascetti,
genio Perozzi o scherziamo?
cos’è il genio?
maggiore di alfio
vaffanzum genio!
o tarapia tapioco:
vaffanzum alfio!
e velocità di esecuzione
34. Funzioni
Invocazione
brematurata la supercazzola <nome>
[con <espressione>[, <espressione>…]
o scherziamo?
antani come se fosse brematurata la
supercazzola antanizzata con barilotto
diviso 3 o scherziamo? per 2
35. Funzioni
Invocazione
brematurata la supercazzola <nome>
[con <espressione>[, <espressione>…]
o scherziamo?
antani come se fosse brematurata la
supercazzola antanizzata con barilotto
diviso 3 o scherziamo? per 2
antani = antanizzata(barilotto / 3) * 2
44. Hello World
# Author: Alessandro Pellegrini <alessandro@pellegrini.tk>
# Released under GPLv3
Lei ha clacsonato
voglio una bucaiola, Necchi come se fosse 0 voglio prematurata, Mascetti come
se fosse 72
prematurata a posterdati voglio antifurto, Mascetti come se fosse 87.
voglio una cofandina, Mascetti come se fosse prematurata con scappellamento a
sinistra per 1
cofandina come fosse cofandina meno 33 brematurata la supercazzola antanizzata
con antifurto,
cofandina o scherziamo? vaffanzum! bituma scusi, noi siamo in quattro.
blinda la supercazzola antanizzata con Alfio Mascetti, tarapia Mascetti o
scherziamo?
voglio vicesindaco, Mascetti come se fosse 101 vicesindaco a posterdati voglio
pastene,
Mascetti come se fosse vicesindaco più 7 pastene a posterdati bituma in un
certo senso.
pastene a posterdati tarapia a posterdati Alfio a posterdati tarapia a
posterdati
voglio scappellamento, Mascetti come se fosse 114 scappellamento a posterdati
pastene a posterdati voglio Antani, Mascetti come se fosse pastene meno 8
Antani a posterdati
45. Fibonacci
Lei ha clacsonato
voglio antani, Necchi come se fosse 0
voglio pastene, Necchi come se fosse 1
voglio un barilotto, Necchi
mi porga il barilotto
stuzzica
pastene a posterdati
voglio un passaggio, Necchi come fosse antani
antani come fosse pastene
pastene come fosse il pastene più il
passaggio
barilotto come fosse il barilotto meno 1
e brematura anche, se il barilotto maggiore di 0
49. Il linguaggio
Creato nel 1993 da Urban Müller
Stile estremamente minimalista
Turing-completo
Compilatore molto piccolo (100 byte)
50. Il linguaggio
Creato nel 1993 da Urban Müller
Stile estremamente minimalista
Turing completo
Compilatore molto piccolo (100 byte)
Non pensato per utilizzi pratici
Who can program anything useful with it?
☺
54. I comandi
Ci sono solo 8 comandi, ciascuno dei quali
consiste in un solo carattere.
55. I comandi
Ci sono solo 8 comandi, ciascuno dei quali
consiste in un solo carattere.
Tutto il resto è commento.
56. I comandi
Istruzione Significato
> Sposta il puntatore dati nella cella successiva a destra
< Sposta il puntatore dati nella cella precedente a sinistra
+ Incrementa il byte indirizzato dal puntatore dati
- Decrementa il byte indirizzato dal puntatore dati
. Output del byte indirizzato dal puntatore dati
, Accetta un input di un byte e lo memorizza nel byte
indirizzato dal puntatore dati
[ Se il byte indirizzato dal puntatore dati è zero salta in avanti
all’istruzione dopo il corrispondente ]
] Se il byte indirizzato dal puntatore dati è diverso da zero
salta all’indietro all’istruzione dopo il corrispondente [
57. I comandi corrispondenti in C
Istruzione Significato
(inizio) char array[INFINITELY_LARGE_SIZE] = {0};
char *ptr=array;
> ++ptr;
< --ptr;
+ ++*ptr;
- --*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ While (*ptr) {
] }
83. Sommiamo due numeri
E ora aggiungiamo l’output
++>+++++[<+>-]<.
Ti piacerebbe… ma non funziona!
84. Sommiamo due numeri
E ora aggiungiamo l’output
++>+++++[<+>-]<.
Ti piacerebbe… ma non funziona!
[7][0][0][0][0]
^
7 BEL
Suona un campanello?
85. Sommiamo due numeri
E ora aggiungiamo l’output
++>+++++[<+>-]<.
Ti piacerebbe… ma non funziona!
[7][0][0][0][0]
^
7 BEL
Suona un campanello?
ASCII Encoded!
86. Sommiamo due numeri
In ASCII lo 0 vale 48, quindi per stampare
il glifo che rappresenta il 7 devo
aggiungere 48 al valore che ho nella cella
indirizzata dal puntatore
87. Sommiamo due numeri
In ASCII lo 0 vale 48, quindi per stampare
il glifo che rappresenta il 7 devo
aggiungere 48 al valore che ho nella cella
indirizzata dal puntatore
Come si fa?
88. Sommiamo due numeri
In ASCII lo 0 vale 48, quindi per stampare
il glifo che rappresenta il 7 devo
aggiungere 48 al valore che ho nella cella
indirizzata dal puntatore
Come si fa?
[7][0][0][0][0]
^
89. Sommiamo due numeri
In ASCII lo 0 vale 48, quindi per stampare
il glifo che rappresenta il 7 devo
aggiungere 48 al valore che ho nella cella
indirizzata dal puntatore
Come si fa?
[7][0][0][0][0]
^
<++++++++++++++++++++++++++++++
++++++++++
92. Sommiamo due numeri
Aggiungiamo 6x8
cioè aggiungiamo 6 per 8 volte
Come si fa?
[7][0][0][0][0]
^
++++++++[<++++++>-]
(oppure 6x4x2, o 3x2x2x2x2x2…)
94. Sommiamo due numeri
Il codice completo
++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
95. Sommiamo due numeri
Il codice completo
++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
++>+++++[<+>] ++++++++[<++++++>-] <.
96. Sommiamo due numeri
Il codice completo
++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
++>+++++[<+>] ++++++++[<++++++>-] <.
++>+++++[<+>]++++++++[<++++++>-]<.
98. Sommiamo due numeri
E se vogliamo usare l’input per inserire gli
addendi?
Dobbiamo fare lo stesso giochino, ma al
contrario: se digitiamo 2 non stiamo
memorizzando il numero 2, ma la sua
rappresentazione ASCII che è il numero
decimale 50
101. Hello World
Un esempio facile facile, per cominciare
++++++++[>++++[>++>+++>+++>+<<<<-
]>+>+>->>+[<]<-]>>.>---
.+++++++..+++.>>.<-.<.+++.------.---
-----.>>+.>++.
103. The game of life
Un esempio facile facile, per cominciare
++++++++[>++++[>++>+++>+++>+<<<<-
]>+>+>->>+[<]<-]>>.>---
.+++++++..+++.>>.<-.<.+++.------.---
-----.>>+.>++.
110. Principi di design
1. Un linguaggio di programmazione
dovrebbe essere facilmente leggibile e
scrivibile da un orango
111. Principi di design
1. Un linguaggio di programmazione
dovrebbe essere facilmente leggibile e
scrivibile da un orango
2. La sintassi dovrebbe essere semplice,
facile da ricordare, e non deve usare la
parola «scimmia»
112. Principi di design
1. Un linguaggio di programmazione
dovrebbe essere facilmente leggibile e
scrivibile da un orango
2. La sintassi dovrebbe essere semplice,
facile da ricordare, e non deve usare la
parola «scimmia»
3. Le banane sono buone
113. I comandi corrispondenti in
Brainf**k
Istruzione Significato
Ook. Ook? >
Ook? Ook. <
Ook. Ook. +
Ook! Ook! -
Ook! Ook. .
Ook. Ook! ,
Ook! Ook? [
Ook? Ook! ]
114. Hello World
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook?
Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook?
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook?
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.
116. Il linguaggio
Creato da Sean Heber nel 2003, descritto
in un paper da Alex van Oostenrijk e
Martijn van Beek nel 2004
117. Il linguaggio
Creato da Sean Heber nel 2003, descritto
in un paper da Alex van Oostenrijk e
Martijn van Beek nel 2004
Turing-completo
118. Il linguaggio
Creato da Sean Heber nel 2003, descritto
in un paper da Alex van Oostenrijk e
Martijn van Beek nel 2004
Turing-completo
Più potente di brainf**k: ha ben 12
comandi!
120. Principi di design
1. Linguaggio pensato per i bovini
2. Visto che i bovini hanno un linguaggio
piuttosto limitato, si usano solo le
parole che questi utilizzano
normalmente
121. Principi di design
1. Linguaggio pensato per i bovini
2. Visto che i bovini hanno un linguaggio
piuttosto limitato, si usano solo le
parole che questi utilizzano
normalmente
3. In realtà l’unica parola che sembrano
comprendere è «moo», con le sue
variazioni. Di conseguenza…
130. Il linguaggio
Creato nel 2003 da Edwin Brady e Chris
Morris per ridare dignità a spazi,
tabulazioni e ritorni a capo, troppo spesso
bistrattati o ignorati dagli altri linguaggi.
131. Il linguaggio
Creato nel 2003 da Edwin Brady e Chris
Morris per ridare dignità a spazi,
tabulazioni e ritorni a capo, troppo spesso
bistrattati o ignorati dagli altri linguaggi.
Pubblicato su Slashdot il primo di aprile.
132. Il linguaggio
Creato nel 2003 da Edwin Brady e Chris
Morris per ridare dignità a spazi,
tabulazioni e ritorni a capo, troppo spesso
bistrattati o ignorati dagli altri linguaggi.
Pubblicato su Slashdot il primo di aprile.
Tutti hanno pensato che fosse un pesce.
133. Il linguaggio
Creato nel 2003 da Edwin Brady e Chris
Morris per ridare dignità a spazi,
tabulazioni e ritorni a capo, troppo spesso
bistrattati o ignorati dagli altri linguaggi.
Pubblicato su Slashdot il primo di aprile.
Tutti hanno pensato che fosse un pesce.
Non lo era.
135. Principi di design
29 istruzioni, suddivise in 5 categorie
Prima delle istruzioni si deve inserire un
IMP (Instruction Modification Parameter)
che specifica a quale categoria appartiene
l’istruzione
136. Qualche esempio
IMP Significato
[Spazio] Manipolazione dello stack
[Tab][Spazio] Operazioni aritmetiche
[Tab][Tab] Accesso casuale alla memoria
[Ritorno a capo] Controllo di flusso
[Tab][Ritorno a capo] I/O di periferiche
141. Il linguaggio
Creato da David Morgan-Mar, ispirato ai
dipinti di Piet Mondrian, da cui prende il
nome
142. Il linguaggio
Creato da David Morgan-Mar, ispirato ai
dipinti di Piet Mondrian, da cui prende il
nome
Non esiste un compilatore «ufficiale»:
fate quello che credete abbia più senso
143. Il linguaggio
Creato da David Morgan-Mar, ispirato ai
dipinti di Piet Mondrian, da cui prende il
nome
Non esiste un compilatore «ufficiale»:
fate quello che credete abbia più senso
Il codice appare come arte astratta
144. Il linguaggio
Ci sono 20 colori, 18 dei quali in rapporto
ciclico per colore e luminosità
145. Esecuzione
DP: Direction Pointer
CC: Codel Chooser
DP CC Codel chosen
right
left uppermost
right lowermost
down
left rightmost
right leftmost
left
left lowermost
right uppermost
up
left leftmost
right rightmost
146. Comandi
I comandi sono basati sulle transizioni di
colore
Lightness change
Hue change None 1 Darker 2 Darker
None push pop
1 Step add subtract multiply
2 Steps divide mod not
3 Steps greater Pointer switch
4 Steps duplicate Roll in(number)
5 Steps in(char) out(number) out(char)
159. Il linguaggio
Creato da Ben Olmstead nel 1998, con lo
scopo di creare un linguaggio che fosse il
più difficile possibile da utilizzare.
160. Il linguaggio
Creato da Ben Olmstead nel 1998, con lo
scopo di creare un linguaggio che fosse il
più difficile possibile da utilizzare.
Andrew Cooke riuscì a scrivere il primo
"Hello, world!" solo con l'aiuto di un
programma in Lisp
161. Il linguaggio
Creato da Ben Olmstead nel 1998, con lo
scopo di creare un linguaggio che fosse il
più difficile possibile da utilizzare.
Andrew Cooke riuscì a scrivere il primo
"Hello, world!" solo con l'aiuto di un
programma in Lisp
…ma solo più di due anni dopo!
163. Il linguaggio
L’effetto di ciascuna istruzione dipende
da dove si trova in memoria
Dati e codice sono nella stessa memoria
164. Il linguaggio
L’effetto di ciascuna istruzione dipende
da dove si trova in memoria
Dati e codice sono nella stessa memoria
Dopo ogni istruzione vengono
incrementati sia il data pointer sia
l’instruction pointer
165. Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
166. Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
Non ci sono operatori LOAD o STORE
167. Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
Non ci sono operatori LOAD o STORE
Funziona con cifre ternarie (in base 3)
168. Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
Non ci sono operatori LOAD o STORE
Funziona con cifre ternarie (in base 3)
E molto, molto altro…
172. A better Hello World
('&%:9]!~}|z2Vxwv-
,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm
-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!
~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
173. A better Hello World
('&%:9]!~}|z2Vxwv-
,POqponl$Hjig%eB@@>}=<M:9wv6WsU2T|nm
-,jcL(I&%$#"
`CB]V?Tx<uVtT`Rpo3NlF.Jh++FdbCBA@?]!
~|4XzyTT43Qsqq(Lnmkj"Fhg${z@>
Output perfetto ☺
Hello, World!
178. Il fascino della supercazzola
Breve viaggio nel mondo dei linguaggi esoterici
CODEMOTION MILAN - SPECIAL EDITION
10 – 11 NOVEMBER 2017
Andrea Maietta