FRANCESCO AGATI
PROGRAMMATORE JAVASCRIPT E RUBY
LAVORO IN VEESPO
JAVASCRIPT
E'
SINGLE THREAD
UN UNICO THREAD
PER GESTIRE
EVENTI, ANIMAZIONI,
MANIPOLAZIONE DEL DOM
INPUT,OUTPUT
ESECUZIONE DEL CODICE
OGNI BROWSER HA UNA QUEUE
DOVE VENGONO ACCODATE
TUTTI GLI EVENTI E
LE OPERAZIONI CHE DEVONO ESSERE
ESEGUITE
(COMPRESO IL CODICE JAVASCRIPT)
TUTTE LE OPERAZIONI
DI I/O SINCRONO
E L'ESECUZIONE DI CODICE
BLOCCANO L'EVENT LOOP
RENDENDO IL BROWSER BLOCCATO
PER QUESTO TUTTE
LE OPERAZIONI
DI I/O
SONO SEMPRE
ASINCRONE
QUINDI
MAI BLOCCARE
L'EVENT LOOP
PER RENDERE LA NOSTRA INTERFACCIA
SEMPRE RESPONSIVA
(FRAME PER SECOND)
PERCHE' UN'INTERFACCIA
SIA SEMPRE FLUIDA
LE ANIMAZIONI DEVO ESSERE
DI 60 FPS
1 SECONDO = 1000 ms
1000ms / 60 = 16.6 ms
PER NON BLOCCARE L'EVENT LOOP
E RISPETTARE I 60 FPS
IL NOSTRO CODICE
JAVASCRIPT
NON DEVE MAI SUPERARE
I 16ms
DI ESECUZIONE
IL CODICE VA SPEZZETTATO
IN TANTE PICCOLE
FUNZIONI CHE VENGONO
ACCODATE
NELLA QUEUE DI ESECUZIONE
DEL BROWSER
TRADOTTO????????
COSA C'E' DI PEGGIO
DI DOVER SPEZZARE
IL NOSTRO CODICE
IN FUNZIONI ATOMICHE DI 16ms
E INSERIRLE IN UNA QUEUE
CHE VERRA
ESEGUITA DALL'EVENT LOOP?
DOVER GESTIRE
1000 CONNESSIONI AL SECONDO
CON UN LINGUAGGIO SERVER SIDE
SINGLE THREAD
CHE NON SUPPORTA
GREEN THREADS, FIBER, CORUTINES,
CONTINUATIONS
NELLA PROGRAMMAZIONE FUNZIONALE
LE FUNZIONI
VENGONO GESTITE COME OGGETTI
LE FUNZIONI POSSO ESSERE
- PASSATE COME ARGOMENTI DI ALTRE FUNZIONI
- GENERATE DA ALTRE FUNZIONI
- COMPOSTE IN FUNZIONI COMPLESSE
sum_gen = (a) -> (b) -> (c) -> (d) -> a + b + c + d
sum_6 = sum_gen (1)(2)(3)
sum_6(4) === 10
COME LE PIPE IN LINUX
process_data = compose(map, filter, sort, reverse)
process_data([1,2,3,4,5])
LE FUNCTION COMPOSITION
CREANO DELLE PIPELINE
PER TRASFORMARE
E FILTRARE
I DATI N INGRESSO
(FUNCTIONAL REACTIVE PROGRAMMING)
GESTIRE
VALORI CHE CAMBIANO NEL TEMPO
CON I PATTERN
DELLA PROGRAMMAZIONE
FUNZIONALE
ACCUMULARE E TRASFORMARE EVENTI
sum = (a,b) -> a + b
stream.scan(0,sum).onValue (value) -> console.log(value)
ACCUMULARE E TRASFORMARE EVENTI
FILTRARE GLI EVENTI
greater_than_six = (value) -> value > 6
stream.filter(greater_than_six)
CREARE UNA PIPELINE DI EVENTI ASINCRONI
team_id = Bacon.constant('inter')
players = team_id.flatMap (id) ->
Bacon.fromPromise($.get('/players/' + id + '.json'))
LA FRP E' UN ASTRAZIONE
CHE PERMETTE
DI GESTIRE GLI EVENTI
ALL'INTERNO DI PIPELINE
CON I PATTERN CLASSICI
DELLA PROGRAMMAZIONE FUNZIONALE
(map, filter,compose....)
?