Post on 21-Jan-2018
transcript
Il fascino della supercazzolaBreve viaggio nel mondo dei linguaggi esoterici
CODEMOTION MILAN - SPECIAL EDITION
10 – 11 NOVEMBER 2017
Andrea Maietta
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
Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
Comprensibile, stile C
Il linguaggio
Scritto da Stefano Sanfilippo, da un’idea
di Alessandro Barenghi, Michele Tartara e
Nicola Vitucci
Comprensibile, stile C
Scopo goliardico
Il linguaggio
EspressioniPiù, meno, per, maggiore di…
Shiftantani con scappellamento a sinistra per 2
Il linguaggio
EspressioniPiù, meno, per, maggiore di…
Shiftantani con scappellamento a sinistra per 2
antani << 2
Variabili
Dichiarazione di una variabilevoglio antani, Necchi
Necchi: int
Mascetti: char
Perozzi: float
Melandri: bool
Sassaroli: double
Variabili
Assegnazione<variabile> come fosse <espressione>
antani come fosse 2
antani come se fosse 2
Variabili
Assegnazione<variabile> come fosse <espressione>
antani come fosse 2
antani come se fosse 2
Dichiarazione e assegnazionevoglio <variabile> come fosse <espressione>
Variabili
Assegnazione<variabile> come fosse <espressione>
antani come fosse 2
antani come se fosse 2
Dichiarazione e assegnazionevoglio <variabile> come fosse <espressione>
voglio antani, Necchi come se fosse 4
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
Condizioni
Two costrutt is megl’ che uanche cos’è <variabile>?
<condizione>
<istruzioni>
o magari <condizione>:
<istruzioni>
o magari <condizione>:
<istruzioni>
o tarapia tapioco:
<istruzioni>
e velocità di esecuzione
Condizioni
Two costrutt is megl’ che uanche cos’è il genio?
maggiore di mobiletto:
genio come se fosse 2
o tarapia tapioco:
genio come se fosse 0
e velocità di esecuzione
Funzioni
Dichiarazioneblinda la supercazzola [<tipo>]
<nome> [con <parametro> <tipo>[,
<parametro> <tipo>…]] o scherziamo?
<istruzioni>
Funzioni
Dichiarazioneblinda la supercazzola Necchi
antanizzata con alfio Mascetti o
scherziamo?
vaffanzum alfio – 2!
Funzioni
Dichiarazioneblinda la supercazzola Necchi
antanizzata con alfio Mascetti o
scherziamo?
vaffanzum alfio – 2!
int antanizzata(char alfio) {
return alfio meno 2!
}
Funzioni
Dichiarazioneblinda 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
Funzioni
Invocazionebrematurata la supercazzola <nome>
[con <espressione>[, <espressione>…]
o scherziamo?
Funzioni
Invocazionebrematurata la supercazzola <nome>
[con <espressione>[, <espressione>…]
o scherziamo?
antani come se fosse brematurata la
supercazzola antanizzata con barilotto
diviso 3 o scherziamo? per 2
Funzioni
Invocazionebrematurata 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
Commenti
Normalibituma
antani come se fosse 2 bituma, scusi
conte, noi siamo in 4 con rinforzino
Meta# incrementa il valore di antani
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
FibonacciLei 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
Il linguaggio
Creato nel 1993 da Urban Müller
Stile estremamente minimalista
Turing-completo
Compilatore molto piccolo (100 byte)
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?
☺
L’architettura
Instruction pointer
Array di 30.000 celle da 8 byte a 0
Data pointer
Input stream di byte
Output stream di byte
I comandi
Ci sono solo 8 comandi, ciascuno dei quali
consiste in un solo carattere.
Tutto il resto è commento.
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 [
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) {
] }
Il programma più semplice
Cosa fa?[-]
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
…non fa nulla!
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
>>>>++
^
[0][0][0][0][0]
^
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
>>>>++
^
[0][0][0][0][0]
^
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
>>>>++
^
[0][0][0][0][0]
^
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
>>>>++
^
[0][0][0][0][0]
^
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
>>>>++
^
[0][0][0][0][1]
^
Qualcosa di più interessante
Cosa fa?>>>>++
Blocchi di memoria e puntatore dati:[0][0][0][0][1]
^
>>>>++
^
[0][0][0][0][2]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[0][0][0][0][0]
^
++>+++++[<+>-]
^
[2][0][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[2][0][0][0][0]
^
++>+++++[<+>-]
^
[2][0][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[2][0][0][0][0]
^
++>+++++[<+>-]
^
[2][5][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[2][5][0][0][0]
^
++>+++++[<+>-]
^
[2][5][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[2][5][0][0][0]
^
++>+++++[<+>-]
^
[2][5][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[2][5][0][0][0]
^
++>+++++[<+>-]
^
[3][5][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][5][0][0][0]
^
++>+++++[<+>-]
^
[3][5][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][5][0][0][0]
^
++>+++++[<+>-]
^
[3][4][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][4][0][0][0]
^
++>+++++[<+>-]
^
[3][4][0][0][]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][4][0][0][0]
^
++>+++++[<+>-]
^
[3][4][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][4][0][0][0]
^
++>+++++[<+>-]
^
[4][4][0][0][0]
^
Qualcosa di più utile
Cosa fa?++>+++++[<+>-]
Blocchi di memoria e puntatore dati:[3][4][0][0][0]
^
++>+++++[<+>-]
^
[7][0][0][0][0]
^
Sommiamo due numeri
E ora aggiungiamo l’output++>+++++[<+>-]<.
Ti piacerebbe… ma non funziona![7][0][0][0][0]
^
7 BEL
Suona un campanello?
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!
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
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?
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]
^
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]
^
<++++++++++++++++++++++++++++++
++++++++++
Sommiamo due numeri
Aggiungiamo 6x8
cioè aggiungiamo 6 per 8 volte
Come si fa?[7][0][0][0][0]
^
++++++++[<++++++>-]
Sommiamo due numeri
Aggiungiamo 6x8
cioè aggiungiamo 6 per 8 volte
Come si fa?[7][0][0][0][0]
^
++++++++[<++++++>-]
(oppure 6x4x2, o 3x2x2x2x2x2…)
Sommiamo due numeri
Aggiungiamo 6x8
cioè aggiungiamo 6 per 8 volte
Come si fa?[13][7][0][0][0]
^
++++++++[<++++++>-]
Sommiamo due numeri
Il codice completo++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
Sommiamo due numeri
Il codice completo++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
++>+++++[<+>] ++++++++[<++++++>-] <.
Sommiamo due numeri
Il codice completo++>+++++[<+>-] somma 5 e 2
++++++++[<++++++>-] aggiunge 48
<. stampa
++>+++++[<+>] ++++++++[<++++++>-] <.
++>+++++[<+>]++++++++[<++++++>-]<.
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
Hello World
Un esempio facile facile, per cominciare
++++++++[>++++[>++>+++>+++>+<<<<-
]>+>+>->>+[<]<-]>>.>---
.+++++++..+++.>>.<-.<.+++.------.---
-----.>>+.>++.
The game of life
Un esempio facile facile, per cominciare++++++++[>++++[>++>+++>+++>+<<<<-
]>+>+>->>+[<]<-]>>.>---
.+++++++..+++.>>.<-.<.+++.------.---
-----.>>+.>++.
Principi di design
1. Un linguaggio di programmazione
dovrebbe essere facilmente leggibile e
scrivibile da un orango
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»
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
I comandi corrispondenti in Brainf**kIstruzione Significato
Ook. Ook? >
Ook? Ook. <
Ook. Ook. +
Ook! Ook! -
Ook! Ook. .
Ook. Ook! ,
Ook! Ook? [
Ook? Ook! ]
Hello WorldOok. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook?
Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook. Ook. Ook! Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook!
Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook. Ook. Ook? Ook. Ook?
Ook. Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook? Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Ook. Ook? Ook.
Ook? Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook! Ook? Ook? Ook. Ook. Ook. Ook. Ook. Ook.
Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook. Ook?
Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook. Ook?
Ook. Ook? Ook. Ook? Ook. Ook? Ook. Ook! Ook. Ook. Ook. Ook. Ook. Ook. Ook.
Ook! Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook. Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook! Ook!
Ook! Ook! Ook! Ook. Ook. Ook? Ook. Ook? Ook. Ook. Ook! Ook.
Il linguaggio
Creato da Sean Heber nel 2003, descritto
in un paper da Alex van Oostenrijk e
Martijn van Beek nel 2004
Il linguaggio
Creato da Sean Heber nel 2003, descritto
in un paper da Alex van Oostenrijk e
Martijn van Beek nel 2004
Turing-completo
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!
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
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…
Hello WorldMoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO Moo Moo MoO MoO
MoO Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo
MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo MOo Moo MOo MOo
MOo MOo MOo MOo MOo MOo Moo MoO MoO MoO Moo MOo MOo MOo MOo MOo MOo Moo MOo
MOo MOo MOo MOo MOo MOo MOo Moo OOO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO MoO
MoO MoO MoO MoO Moo
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.
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.
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.
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.
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
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
Il linguaggio
Creato da David Morgan-Mar, ispirato ai
dipinti di Piet Mondrian, da cui prende il
nome
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 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
Esecuzione
DP: Direction Pointer
CC: Codel ChooserDP CC Codel chosen
rightleft uppermost
right lowermost
downleft rightmost
right leftmost
leftleft lowermost
right uppermost
upleft leftmost
right rightmost
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)
Il linguaggio
Creato da Ben Olmstead nel 1998, con lo
scopo di creare un linguaggio che fosse il
più difficile possibile da utilizzare.
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
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!
Il linguaggio
L’effetto di ciascuna istruzione dipende
da dove si trova in memoria
Dati e codice sono nella stessa memoria
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
Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
Il linguaggio
Tutte le istruzioni sono automodificanti
secondo una tabella di permutazione (ma
non i jump)
Non ci sono operatori LOAD o STORE
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)
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…
Hello World
(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@
b=`{^Lx8%$Xmrkpohm-
kNi;gsedcba`_^]\[ZYXWVUTSRQPONMLKJIH
GFEDCBA@?>=<;:9876543s+O<oLm
Hello World
(=<`$9]7<5YXz7wT.3,+O/o'K%$H"'~D|#z@
b=`{^Lx8%$Xmrkpohm-
kNi;gsedcba`_^]\[ZYXWVUTSRQPONMLKJIH
GFEDCBA@?>=<;:9876543s+O<oLm
Output non perfetto…
HEllO WORld
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@>
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!
Cos’è questo?/^(?!(?:(?:\x22?\x5C[\x00-
\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-
\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-
\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-
\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-
\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-
\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-
\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--
)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--
)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-
f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-
9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-
9]))){3}))\]))$/iD
Cos’è questo?/^(?!(?:(?:\x22?\x5C[\x00-
\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-
\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-
\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-
\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-
\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-
\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-
\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--
)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--
)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-
f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-
9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-
9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-
9]))){3}))\]))$/iD
Think again! Regexp per email in php ☺