Andrea Maietta - Il fascino della supercazzola: un breve viaggio nel mondo dei linguaggi esoterici -...

178
Il fascino della supercazzola Breve viaggio nel mondo dei linguaggi esoterici CODEMOTION MILAN - SPECIAL EDITION 10 – 11 NOVEMBER 2017 Andrea Maietta

Transcript of Andrea Maietta - Il fascino della supercazzola: un breve viaggio nel mondo dei linguaggi esoterici -...

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

Dicesi…

Monicelli

Monicelli

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

MainLei ha clacsonato

Il linguaggio

MainLei ha clacsonato

ReturningVaffanzum <espressione>!

Il linguaggio

MainLei ha clacsonato

ReturningVaffanzum <espressione>!

Vaffanzum!

Il linguaggio

EspressioniPiù, meno, per, maggiore di…

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

Variabili

Dichiarazione di una variabilevoglio antani, Necchi

Necchi: int

Mascetti: char

Perozzi: float

Melandri: bool

Sassaroli: double

Variabili

Assegnazione<variabile> come fosse <espressione>

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

Input/Output

Input/Output

Inputmi porga <variabile>

Input/Output

Inputmi porga <variabile>

Output<espressione> a posterdati

Cicli

Uno, equivalente a do {} while ();stuzzica

<istruzioni>

e brematura anche, se <condizione>

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

Eccezioni e asserzioni

Eccezioni e asserzioni

Eccezioniavvertite don ulrico

Eccezioni e asserzioni

Eccezioniavvertite don ulrico

Asserzioniho visto <espressione>!

Commenti

Commenti

Normalibituma

Commenti

Normalibituma

antani come se fosse 2 bituma, scusi

conte, noi siamo in 4 con rinforzino

Commenti

Normalibituma

antani come se fosse 2 bituma, scusi

conte, noi siamo in 4 con rinforzino

Meta# incrementa il valore di antani

Hello World

Hello World# Author: Alessandro Pellegrini <[email protected]>

# 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

brainf**k

Il linguaggio

Creato nel 1993 da Urban Müller

Il linguaggio

Creato nel 1993 da Urban Müller

Stile estremamente minimalista

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

L’architettura

Instruction pointer

Array di 30.000 celle da 8 byte a 0

Data pointer

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.

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?[-]

Il programma più semplice

Cosa fa?[-]

Blocchi di memoria e puntatore dati:[0][0][0][0][0]

^

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]

^

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?++>+++++[<+>-]

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++>+++++[<+>-]<.

[7][0][0][0][0]

^

Sommiamo due numeri

E ora aggiungiamo l’output++>+++++[<+>-]<.

Ti piacerebbe… ma non funziona!

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?

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

Hello World

Un esempio facile facile, per cominciare

Hello World

Un esempio facile facile, per cominciare

++++++++[>++++[>++>+++>+++>+<<<<-

]>+>+>->>+[<]<-]>>.>---

.+++++++..+++.>>.<-.<.+++.------.---

-----.>>+.>++.

The game of life

The game of life

Un esempio facile facile, per cominciare++++++++[>++++[>++>+++>+++>+<<<<-

]>+>+>->>+[<]<-]>>.>---

.+++++++..+++.>>.<-.<.+++.------.---

-----.>>+.>++.

99 bottles of beer on the wall

99 bottles of beer on the wall

Meta

Esiste un interprete per brainf**k scritto

in brainf**k

Ook!

Il linguaggio

Creato da David Morgan-Mar

Il linguaggio

Creato da David Morgan-Mar

Primo di una (fin troppo lunga) serie

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.

COW

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

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

Bodyf**k

Ma che avete capito?

Il linguaggio

Creato da Nik Hanselman nell’inverno del

2009/2010

Il linguaggio

Creato da Nik Hanselman nell’inverno del

2009/2010

Usa una videocamera come imput

,

Whitespace

Spaces or tabs?

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

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

Hello World

Hello World

Piet

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

Il linguaggio

Ci sono 20 colori, 18 dei quali in rapporto

ciclico per colore e luminosità

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)

Hello World

Fancy Hello World

Artistic Hello World

World Hello World

Tetris

99 bottles of beer

99 bottles of beer

Piet

Interprete brainf**k

Valentine’s card

Valentine’s card explained

Malbolge

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

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…

Riassumendo

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!

Esoterico?

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 ☺

Domande?

Il fascino della supercazzolaBreve viaggio nel mondo dei linguaggi esoterici

CODEMOTION MILAN - SPECIAL EDITION

10 – 11 NOVEMBER 2017

Andrea Maietta