
quindi questo è un discorso su come traduciamo
JavaScript scura ed efficiente e spero
voi ragazzi siete interessati a entrambi i javascript
o compilatori perché questo è un due
argomenti di cui parlerò
corso più un po ‘di freccette e così prima
di tutto e come ho detto il mio nome è Emma
Casper lavoro come ingegnere software presso
Google e ho fatto un sacco di
progetti linguistici di programmazione che ero solito fare
fare piccoli discorsi integrati che erano molto
di divertimento ma a quanto pare nessuno davvero
adora il linguaggio di programmazione
non ha parentesi graffe quindi siamo finiti
facendo invece una v8 che è una java
motore e abbiamo costruito su Google e quello
è stato incluso in Google Chrome che noi
spedito in come quattro anni fa e noi
ha avuto molto successo con questo
piccolo progetto ed è ora in uso
non solo in chrome ma anche in note j / s
e altre configurazioni e penso che abbiamo
ha contribuito a spingere i limiti su ciò che è possibile
fare con javascript che porta davvero
io al prossimo proiettile laggiù dardo
è un è un linguaggio che aiuto il
co.design è una nuova struttura
linguaggio di programmazione per il web e uno
le caratteristiche principali di esso è che
compila su JavaScript così è
compatibile con il con il web aperto
ma puoi usarlo in qualsiasi moderno
browser oggi, quindi ti darò un ultra
introduzione rapida a dart e ma lo farò
concentrarsi principalmente sulla compilazione sotto
e la compilazione di dardo a
JavaScript è così sorprendente
linguaggio di programmazione orientato all’opzione
ha classi con ereditarietà singola
ha un’interfaccia implicita per quelle classi
quindi hai qualcosa che assomiglia
interfaccia da altre lingue e it
ha una sintassi molto familiare la familiarità
della sintassi è molto importante per noi
ed è molto difficile trovare un nuovo
programmare il linguaggio e renderlo un successo
quindi devi renderlo attraente
le persone e una grande parte di ciò sta facendo
sembra familiare e ce ne sono alcuni
novità in là e alcune cose
che siamo davvero molto felici di come
annotazioni di tipo statico facoltativo
ti permettono di e nel posto dove
ha senso per te documentare l’intento
di campi e variabili dando loro un
tipo statico non devi farlo ma
puoi ed è una cosa molto potente
Non ho intenzione di passare la tonnellata di
Ci sto lavorando in questo e in questo
presentazione ma è molto potente
caratteristica della piattaforma che dovresti
probabilmente provalo se non l’hai fatto
già c’è un pezzettino di codice
qui su questa diapositiva quello giusto
ti dà un’idea di cosa sia il dardo
questo è in realtà senza classe o
qualsiasi cosa usi solo un metodo di alto livello
chiamato principale e ha la sede familiare
strutture di controllo basate come quattro anelli
variabili introdotte con un prefisso
digita come int I uguale a 99 e un po ‘di stampa
dichiarazioni con una stringa
espressioni di interpolazione che fanno appena
è più facile lavorare con stringhe e
spero che questo non sembri troppo spaventoso
voi ragazzi peggiorerete nel
presentazione in corso ma, si spera
questo è un po ‘familiare a
la maggior parte di voi quindi questo è come noi
eseguire e distribuire il codice dardo in modo da voi
scrivi il tuo codice dart nel tuo preferito
editore e tu lo scrivi come fonte
codice quindi hai due opzioni
vieni, lo esegui direttamente sul
macchina virtuale e questo è il giusto
la maggior parte parte la macchina virtuale del dardo che
è incorporato in un browser che abbiamo
configurazioni personalizzate di cromo morbido
base per per Chrome che ha il presente
nativo vm abilitato in esso così non c’è
passo della compilazione è sufficiente eseguirlo lì
che è davvero bello, puoi persino eseguirlo
stand alone come script sul lato server
lingua ed è una caratteristica molto bella
e d’altra parte se sei in un
situazione in cui essere compatibile con
i browser esistenti là fuori sono davvero
importante per te e puoi anche usarlo
il freccette gel dovrebbe compilare che abbiamo
costruito per tradurre il tuo codice dardo in
JavaScript che funziona su qualsiasi moderno
browser questa è un’immagine molto semplice
e ci sono anche altri strumenti coinvolti
ma hai anche queste due opzioni
compilare a JavaScript ed eseguirlo
in un assistente browser o esegui il
codice senza compilarlo direttamente
su un vm nativo quindi scorri su JavaScript
la compilazione è molto importante per noi è
molto importante per noi sostenere che
attraverso tutti i browser moderni e così noi
test regolarmente su Chrome Firefox I
e Safari su
è dietro l’angolo per noi e
quindi vogliamo essere sicuri che non importa
che tipo di utente di browser moderno è
usando puoi eseguire il codice dardo in questo
browser attraverso la traduzione quindi questo
in realtà significa che il dardo VM è un
componente opzionale che non devi usare
è molto bello ed è molto veloce e
ma non devi usarlo, non lo siamo
cercando di costringerti a usarlo
pezzo di tecnologia in modo da poterlo fare
compilare il codice JavaScript è molto importante
ovviamente è anche importante che noi
può generare efficiente e compatto
JavaScript e questo dovrebbe andare senza
dicendo che sono la squadra di cui sono membro
noi siamo molto orgogliosi delle prestazioni
e davvero ciò che ci spinge a essere in grado
compilare a qualcosa che è efficiente
correre ed è abbastanza compatto questo è
certamente qualcosa ci preoccupiamo molto su
e la terza cosa è che vogliamo
questa traduzione per implementare il corretto
semantica dei doc e un bambino in
JavaScript ci sono certe cose
potresti decidere di non farlo
JavaScript ti consente di passare qualsiasi numero
di documenti alle tue funzioni che puoi
passa attraverso pochi ne puoi passare troppi
il buio non lo consente, quindi dobbiamo
assicurati che traduciamo la freccia
JavaScript manteniamo la stessa semantica
che non puoi passare troppi o troppo pochi
argomenti di una funzione e lo vogliamo
essere più severi e meno bene
non c’è una coercizione implicita ai numeri
e archi nel buio così ogni volta che il
la piattaforma JavaScript sottostante farebbe
quelle cose per te che dobbiamo fare
sicuro che non influisce sul
semantica Ti darò alcuni esempi su
cosa fa veramente questo al codice
e di cosa dobbiamo guardarci
essenzialmente in pochi istanti l’altro
la grande cosa è JavaScript come lingua
non ha la nozione di controllo e
indici quando si accede agli elenchi di cancellazione così
è praticamente tutto va se tu
passare un indice che non è nel raggio d’azione
sei appena diventato indefinito e non lo è
la semantica oscura che ti vogliamo davvero
ottenere un’eccezione se provi ad andare
fuori dai limiti di una lista e un
schieramento
quindi ecco un piccolo esempio più codice dardo
ha un metodo principale e ne crea due
punti in questo caso ho deciso di non mettere
annotazioni di tipo statico su P e Q
variabili così questo sembra molto simile
Codice JavaScript calcola due punti
e imposta P e Q chiamando il
Costruttori di quelle cose e poi esso
calcola la distanza da P a Q così
come appare se lo traduciamo
a JavaScript bene è abbastanza vicino
questo è in realtà il Java, quindi generiamo
per quello quindi c’è un metodo principale bene
in questo caso è una funzione gelatinosa
assegnato alla proprietà principale di a
dollaro ottico che io ti racconto
più tardi e all’interno di quella funzione, il corpo
il codice è più o meno quello che vorresti
aspetto che ci siano due chiamate al costruttore
in questo caso non stiamo usando un nuovo diritto
qui è in realtà nascosto dietro questo
chiamata di fabbrica fino al punto
fabbrica e ma la distanza da chiamare è
anche un po ‘speciale in quanto ha un
un suffisso di dollaro uno alla fine che è
il nostro modo di assicurarci che la distanza
al metodo ottiene esattamente vuole un argomento
ma se fai un passo indietro e
forse hanno quattro anni fa esplodere i tuoi occhi
sembrerà più o meno come lo splash
lì prima è molto molto vicino ad un io
posso volere una traduzione così io
accennato che queste schede poco
funzioni e in questo caso il principale
il metodo è messo su questo oggetto dollaro perché
lo facciamo così Java ha una nozione di
funzioni globali in modo che tu possa tutto giusto
riempirli invece sull’oggetto globale
bene si scopre che mettendo troppo
roba sull’oggetto globale è una specie di
fastidioso se vuoi qualsiasi tipo di
modularità nel tuo codice quindi se mai
vuoi fare il codice di invio da qualche altro
posto e potresti avere conflitti su questo
un oggetto globale quindi invece di lanciare
cose nell’oggetto globale in realtà
andare per metterli in a in un più piccolo
e oggetto e abbiamo appena questo
notazione abbreviata per X in quel chiamato
la cosa del dollaro è in realtà parte di
la nostra storia isolata e isolati sono
il nostro modo di eseguire più indipendenti
unità sulla stessa Java VM e quindi lì
ogni singolo occhio che avrebbe il suo
proprio
e una sorta di mi trovavo oggetto rappresentato
da questo dollaro cosa così di alto livello
funzioni costruisce tutte quelle cose
loro entrano in quell’unico spazio dei nomi
invece il compilatore lo emette per noi
quindi le chiamate al metodo erano semplici
lavori di chiamate di funzione tranne che noi
tradurre e codificare l’ era del
chiamare in nel nome del metodo
che stiamo chiamando e anche questo è fatto
per aiutarci a sostenere qualcosa come un
argomenti opzionali nominati che sono a
funzionalità della piattaforma e e
essenzialmente stiamo solo cercando di fare
sicuro che la semantica più severa noi
avere un inizio e viene mantenuto quando noi
compila il codice JavaScript in modo oscuro
il compilatore è una specie di sofisticato
il pezzo di codice a questo punto e noi
iniziato con un po ‘più semplice
implementazione del buio
compilatore e ha generato un bel po ‘ di
codice e ci è voluto molto tempo per generare
quella quantità di codice e si è scoperto
che stavamo davvero compilando molto
molti pezzi del codice che non erano
usato a tutti quindi abbiamo deciso di provare a
affrontare quello da zero
e attraverso un meccanismo che chiamiamo albero
scuotere pensa a tutto il tuo codice come tipo
di un albero e il nostro grafico strano sondaggio
di dipendenze tra i diversi
funzioni e le classi e pensare
l’albero delle dipendenze che puoi ottenere
fuori come afferrare il principale
metodo che l’entrata ti indica
notare che sono solo eccitati solo gocce
è questo che pensiamo quando diciamo
albero che si agita è in realtà un termine da
almeno i vecchi sistemi Smalltalk che
ci siamo appena tenuti nel mix qui
ha tre fasi in cui questo albero lo scuote
inizia alla fine proprio quello
è la sinistra e leggendo nel
file principale che può avere importazioni di
altri file e potrebbe avere il file sorgente
che deve essere letto da entrambi
web o un file system locale che abbiamo appena letto
li dentro e facciamo una specie molto veloce di a
un po ‘di un’analisi hacky di questa cosa noi
non guardare i corpi dei metodi che non abbiamo
guarda tutte le carte che non abbiamo
davvero bisogno di guardare noi solo
voglio capire quali sono tutti i bit
e pezzi che dobbiamo portare
tutti i pezzi di fonte una volta che abbiamo quello
portato in realtà inizierà il
fase centrale che è la risoluzione
fase in cui scopriamo cosa ogni
il nome si riferisce e il modo in cui lo iniziamo
è in realtà solo mettendo questo principale
metodo del punto di ingresso in a
risoluzione della coda del resolver e poi noi
fare una parte completa di ciò quando abbiamo un
a pieno titolo ne sapremo di più
a proposito del poi il corpo del metodo lì così
se principale si riferisce a qualcosa come il
costruttore di punti in realtà andrà
torna dal resolver e dai da mangiare
nel risolutore Q e dillo
in realtà hanno bisogno di quei costruttori per e
perché non hai un sistema di tipo completo
in un assistente come se fosse sfrecciato non è così
un approccio conservativo qui così se tu
vedi una chiamata a un metodo chiamato foo on
qualcosa che non sai veramente cosa sia
devi solo assicurarti di averlo messo
in tutto il messaggio di cibo che potrebbe
potenzialmente essere chiamato quindi questo è un
approssimazione dell’insieme di cose che
hai bisogno e si scopre che è in realtà
funziona abbastanza bene, c’è molto
cose che non abbiamo a che fare con e dentro
il caso comune e ma tendiamo a
ottenere un po ‘troppe informazioni o un po’
troppi metodi coinvolti in questo modo così
questa coda conosce davvero le classi
sappiamo che sono a San Shi
sa su quali sono i nomi dei metodi
usa e conosce un po ‘di tipo
le informazioni per i ricevitori più tipicamente
perché hai chiamato i metodi solo su
l’oggetto dis dove sai qualcosa
riguardo alla classe che racchiude una volta che abbiamo
fatto la risoluzione sappiamo qualcosa
su quali nomi si legano a quali cose
in realtà lo inseriamo in un’altra coda
che è la coda della compilazione e noi
ricominciamo inseriamo il metodo principale
lì e l’abbiamo costruito essenzialmente
di nuovo quella stessa coda la ragione per cui noi
fai questo è il generatore di codice
in realtà ha una faccia di ottimizzazione che
diffonde informazioni sul tipo attraverso questo
attraverso le posizioni intermedie noi
sono in gioco così a volte ne abbiamo di più
digitare le informazioni lì così mentre nel
risolutore potresti sapere che è foo
ha invitato qualcosa nella zona di Cochin
in realtà potremmo sapere qualcosa
quello che è chiamato su questo è molto
astratto e ma il risultato finale è quello
finiamo con la dieta parsing un sacco e
risolviamo e parti
essere meno di quello e noi in realtà
compilare e generare il codice JavaScript per
un sottoinsieme di ciò è il risultato netto
qualcosa come un esempio di ciao mondo
compila per una quantità molto molto breve di
Codice JavaScript e, naturalmente, il
più dipendenze e più cose
importa da altre librerie e tu
includere in questo modo il più grande il
l’applicazione otterrà così è più
come una paga come si va in giro
qualsiasi altra cosa così quando compili il dardo
in JavaScript ci sono alcune lingue
sfide che ho brevemente menzionato
prima voglio solo tuffarmi in alcuni di
quelli uno dei più grandi è quel dardo
ha il supporto per gli operatori definibili dall’utente
quindi potresti dire che nella mia classe il mio
classe di vettori che ho inventato voglio
supporta l’operazione plus in modo che tu possa
aggiungi questi vettori insieme per esempio
javascript ha questa nozione implicitamente
conversione più ingressi a numeri che facciamo
un plus da qualche parte è convertito
a un numero o stringa i due ingressi
a seconda degli input ma c’è
in nessun modo puoi rendere quel plus come il
JavaScript plus ed essenzialmente io
dare un più alto livello più l’operazione su
vettori per te quindi non puoi usare Java
con plus per implementare dark plus in
nel caso generale non funziona
l’altro modo per farlo è come il semplice
modi solo per dire ogni volta che vediamo un vantaggio
e il codice dardo chiameremo solo un metodo
sul lato sinistro e noi
in realtà ho provato a farlo solo un giusto
aggiungi le chiamate al metodo per tutta la nostra aritmetica
le operazioni risultano essere troppo lente
presso il tipo della parte più bassa di
la diapositiva qui ho mostrato come è possibile
fallo semplicemente aggiungendo un’atmosfera a
messaggio doorstop al prototipo numero
e che in realtà ti permette di chiamare il
aggiungi metodo a tutti i metodi sup sui numeri
quindi funziona davvero il problema è questo
il metodo è molto lento e il motivo per cui
è molto lento, uno dei motivi
perché è molto lento è dentro questo
Funzione JavaScript che questo riferimento
in là è in realtà un oggetto scatola così
quando chiami quando chiami l’add
metodo su dire sull’intero 1
JavaScript DJ out – in realtà deve andare
testa e avvolgere che assicurano uno in un nuovo
oggetto e legalo a quell’oggetto
prima può chiamare quel metodo che dà
tu il sovraccarico di allocare su ogni
operazione aritmetica singola che è
solo dolorosamente lento in modalità rigorosa
non è così, ma non è così
vuoi usare la modalità rigorosa per loro
questo davvero non volevo fare affidamento
modalità rigorosa per far funzionare le nostre cose
ed essere efficienti, quindi la nostra soluzione è
in realtà per capire quando possiamo
usa JavaScript plus quando è sicuro
usalo quando deve scrivere semantica
per noi e lo facciamo monitorando i tipi
nel compilatore quindi se sappiamo qualcosa
sugli operandi se sappiamo che lo sei
operare su numeri è sicuro da usare
un javascript plus per questo l’altro grande
la cosa è il controllo dell’intervallo così ha Java
no nozione di asse fuori limite e tutto
tutte le chiavi sono essenzialmente trattate come
archi Non sono sicuro che tutte le persone
che in realtà funzionano con i peccati java
una specie di amaris che stanno effettivamente lavorando
nella lingua che permette loro di stare bene
che in realtà non li aiuta davvero
nel definire una gara di una certa dimensione e
controllando che tu sia roba eccellente
all’interno di quello in cui abbiamo deciso di dart
per risolvere questo problema che javis passivo
una sorta di tenere la mentalità da camionista
che tutto va e basta
affrontarlo successivamente inserendo questi
espliciti controlli indice a meno che non siamo in grado di
dimostrare che non abbiamo bisogno di loro in modo che
significa che ogni volta che accedi a
elemento di un array nel codice dardo nel
codice java arenato da quello che farai
vedi i controlli espliciti che sei all’interno
la gamma di ciò che è qualcosa
come confrontare contro zero e il
link e cose che ti faccio vedere
codice in un attimo quindi ecco un bel pezzo
di codice di partenza che poi mi permetterà di
per parlarvi di queste ottimizzazioni
qui così tutti possono vedere questo codice
la schiena per il contrario devi venire
più vicino quindi questo è di nuovo il codice dardo come a
metodo principale crea una lista c’è a
alcune variabili e basta scorrere il
elementi dell’elenco degli ufficiali da zero
ai due quasi fino alle lunghezze
e basta aggiungerli insieme e stampare il
risultato codice abbastanza semplice quando possiamo
pubblicare in codice JavaScript non è un
traduzione one-to-one così tu
posso probabilmente riconoscere alcune cose in
lì e il
è invariato il ciclo for guarda un po ‘
più grande ma la cosa più grande è davvero
prima di accedere alla lista
elementi in realtà inseriamo un esplicito
controlla quale è il se ho meno di zero
o I maggiore della lunghezza della lista
maggiore di uguale lancia questo indice
di eccezione di gamma è il modo in cui il
Pooh mi riferisco all’ordine quando abbiamo finito
che controlla che sia perfettamente sicuro accedere
l’elenco come elenco come array JavaScript
in realtà ciò lo rende ragionevolmente veloce
ma è un po ‘fastidioso quello che abbiamo
per inserire questo controllo solo perché javis
non era farlo per noi ma per preservare
la giusta semantica oscura che abbiamo deciso
per farlo l’ altra grande cosa qui è
che ogni volta che aggiungi cose
insieme per essere in grado di utilizzare Java con
in più devi assicurarti che il
il materiale su cui stai operando è in realtà
numeri così in realtà controlliamo quella roba
abbiamo letto dalla lista è un numero
prima di operare su di esso se non è un
numero in realtà butteremo un illegale
invece l’eccezione degli occupanti e tu puoi
vediamo che abbiamo fatto un po ‘di
accorciare il codice qui usando
nomi di spalline troppo buoni per uno
cosa lo rende in forma sulla diapositiva e il
l’altra cosa è, naturalmente, quella gente
cura delle dimensioni del codice, quindi se inseriamo
questi controlli ovunque nel loro codice
e dobbiamo assicurarci che poi
non occupa troppo spazio
una cosa che probabilmente dovrei menzionare qui
è che in realtà non ne abbiamo mai abbastanza
rendersi conto che la lista di quella lunghezza
non cambia in questo ciclo, quindi portiamo
fuori dal giro e leggerlo prima
inserendo il ciclo solo una volta e in realtà
se dovessi ricompilare questo oggi il
il controllo della lunghezza sarebbe andato via
perché abbiamo implementato alcuni array
i limiti controllano l’eliminazione perché in questo
caso è abbastanza semplice che in realtà
sapere dove si trova entro i limiti quindi questo è
in realtà un po ‘sbagliato per mostrarti ragazzi
ma è bello mostrarti cosa
potresti vedere cose come questa nella tua
codice se compilate e guardate il
uscita un’altra cosa che è abbastanza
comune e dardo è scrivere classi e
quindi vediamo un sacco di persone in JavaScript
usando qualcosa che assomiglia alle classi
da avendo questi modelli che loro
utilizzare per la configurazione
funzione costruttore e aggiunta di un mazzo
di metodi per il prototipo spento e
hanno modelli diversi e alcuni
struttura di supporto diversi modelli e
ed è certamente il caso
anche quando si programma in JavaScript
c’è un sacco di classi ad hoc
definizioni che fluttuano nel dardo è
ancora di più le persone scrivono molto
classi e questo significa che hai un
Molto della Bibbia è in vigore e per
creando istanze di classe e
accedere ai campi di classi che tu
bisogno di capire come e devono
produrre così abbiamo deciso di andare per un
come usare una semplice funzione di supporto per
configurare il sistema e solo generare
la maggior parte di questo testo standard in modo dinamico in
runtime usando il fatto che javis lì
è una piattaforma dinamica che può realmente
puoi iniettare e generare nuovo codice
in runtime così sembra
il punto è che ti ho mostrato prima e
bene, ho usato prima di compilare effettivamente
qualcosa di questo è JavaScript
codice sembra un po ‘straniero ce l’ha
ha un incarico su una proprietà punto su
sul ghiaccio per l’oggetto e ha
ha un metodo e ha una super classe
definizione, quindi modifichiamo tutto in uno
oggetto letterale e che è equo
compattare la stringa vuota lassù
denota i campi che abbiamo così
diciamo che tutti i punti hanno una X su a
campo filo non siamo qui dobbiamo
scrivere la funzione di costruzione effettiva
per il punto perché questo è in realtà
calcolato in runtime da questo elenco di
definizioni dei campi e la super classe
definizione che è oggetto i metodi
comunque sono appena messi qui come
proprietà ordinarie su questo oggetto così
la distanza dal metodo con il dollaro
una roba di codifica arity e guarda di più
o meno come la funzione giostra di te
ci si aspetterebbe ma la roba intorno è
in realtà un modo compatto di introdurre
classi così prendiamo questa lista di campi
come X virgola Y e lo trasformiamo in
codice come funzione punto X virgola Y questo
compito statico tutto ciò che tutto
quel boilerplate lo generiamo per
tu in runtime, certo che hai solo tu
per farlo una volta con la point class
una volta che è in gioco non devi farlo
qualunque
di più ma significa che il codice te
il trasferimento ai tuoi clienti è più piccolo e
è solo una sorta di espansione quando
in realtà è in una corsa sulla sulla
lato client così otteniamo questi aiutanti
generato per noi dal sistema noi
in realtà ti permettono anche di avere sentimenti
liste che ne hanno un po ‘di più
annotazioni avanzate in modo da poter avere un
punto interrogativo o un incarico e cosa
nel nome del campo e solo quello è
solo il nostro modo di capire se hai bisogno
per introdurre un setter o ottenere il nostro
combinazione dei due per quei campi
quindi questo è solo un modo compatto di fare
è bello se guardi il
Uscita JavaScript che noi generiamo
sembra che preserviamo la classe
struttura abbastanza bene quindi spero che tu sia
tutti familiari con chiusure in Java a
meno e così in dardo che abbiamo
supporto di chiusura in modo da poter avere questi
espressioni di funzione che fluttuano intorno
che prende argomenti e produce valori
e la nostra chiusura è in realtà un nome di supporto
documenti e devono anche essere
controllato nel senso che se passi
troppi argomenti per loro o per vedere noi
voglio prenderlo così inizialmente
volevo provare a compilare una chiusura a dardo
a un Java così vicino si scopre che
è un po ‘ doloroso perché il
JavaScript, certo, è qualcosa che puoi
invoca e non ha idea di
controllando quanti argomenti lo passi
almeno non è un modo economico per farlo e basta
solo in qualche modo è difficile capire a
modo di adattarlo davvero bene
insieme così ad un certo punto ci siamo resi conto
è questo che alloca un piccolo oggetto Java
in realtà molto economico è più veloce di
allocando chiusure e in molti casi a
almeno su alcune macchine virtuali e l’abbiamo trovato
anche con il massimo di sei o sette
campi in cui puoi creare un oggetto
semplice oggetto Java nella stessa quantità di
tempo in cui è possibile creare una quantità folle
di spazio in quanto è possibile creare una chiusura così
abbiamo parlato in realtà solo usando
oggetti per rappresentare il
le chiusure oscure quindi in realtà
implementato questo e si è scoperto così
bello che questo è quello che abbiamo tenuto nel
sistema in modo da trattare le chiusure come esempi
delle classi di chiusura così essenzialmente nella nostra
modellare una chiusura è solo un oggetto
ha il supporto per essere invocato che ha
questi metodi di chiamata e usiamo istanza
campi in questi e questi chiusure
classi per rappresentare le variabili
tu catturi dal tuo campo di applicazione e usiamo
metodi su queste classi di chiusura a
implementare le convenzioni di chiamata che
abbiamo bisogno che questo sia un po ‘astratto, lo farò
mostrarti qui il codice dell’arte c’è un
lista e corro attraverso la lista e per
ogni elemento nella lista e otterrò
l’indice e questo è in realtà un po ‘
codice strano ma comunque quello che hai dentro
il mezzo qui è in realtà a
chiusura che prende un parametro ciascuno e
produce il risultato della lista di chiamate che
indicizziamo con quello ogni cosa e a
Alla fine stampiamo tutto così questo è
sintassi concisa molto breve per fare
mappe mappano le operazioni su una lista e
ciò a cui lo compiliamo è in realtà questo
in basso puoi vedere questa chiusura
classe è che è una classe come le altre
è come la cosa che ti ho mostrato
prima che abbia un campo a istanza singola
chiamato lista e ha un metodo
chiamato chiamata dollaro uno che è ciò che noi
bisogno dell’azione che dobbiamo invocare
quando invochiamo questa chiusura con
un argomento così là dentro in realtà
vedi il codice per la chiusura al
sito giovanile dove assegniamo un nuovo nuovo
chiusura e passarlo all’operazione mappa
quello che tu hai lì è in realtà
un’allocazione standard chiamata per creare a
nuova nuova chiusura quindi è abbastanza
semplice in questo modo il più grande svantaggio
è che strappa davvero il
corpo della chiusura e lo mette
in un posto diverso nel codice così
essenzialmente questo è dividere e
due diversi pop e l’ output è
a volte un po ‘più difficile quando ne hai due
in profondità perché finisci per saltare
tra posti diversi ma è molto
bello per compilare e avere un
modello unificato di come ci occupiamo
scarafaggi e classi
quindi una cosa che probabilmente vale la pena
menzionare qui è che potrebbe essere un
piccoli dettagli di alcuni ma in realtà
tipo di importante che al ritorno
indice di dollaro spento non stiamo chiamando indice
fuori dalla lista in cui ci stiamo effettivamente passando
questo è il primo documento e questo è un
cosa generale e nel nostro sistema che abbiamo
deciso di non fare ciò che la gente di solito
fare riferimento a come patch della scimmia di
le classi di base quindi numeri array e
e stringhe di JavaScript non lo siamo
aggiungendo un sacco di nuove funzionalità su
in realtà preferiamo tenerlo attivo
il lato in questo ghiaccio all’oggetto e
abbiamo appena invochiamo questo ho sinottico con questo
è il primo parametro invece perché
quindi non devi in realtà aggiungere
cose a queste cose di nuovo questo è un
modo di cercare di evitare uno scontro e
nome scontri in questi questi comuni
oggetti così ho mostrato il tuo codice d’amore
già e ora voglio raccontarti un po ‘
su come effettivamente andiamo in giro
generare questo codice così e come ho detto
il compilatore oscuro è una specie di
bestie sofisticate ed è abbastanza
compilatore classico tranne che per l’albero
scuotendo forse e inizia con
costruzione di alberi di sintassi per la freccetta del dardo
gli alberi di sintassi del codice sono molto semplici
rappresentazione del tuo codice sorgente
e potrebbe sembrare qualcosa del genere
per a per una semplice espressione positiva I
avere una nota positiva e avete due e a
tre e fuori appeso sotto così andiamo
attraverso uno stadio che chiamiamo SS a
costruzione del grafico che effettivamente costruisce
una rappresentazione intermedia basata su
una forma di saggio se questa è una forma
probabilmente non familiare a tutti voi così
Ti darò solo una breve testa
su ciò che è così la forma del saggio è
modulo statico assegnazione singola quindi è a
è un intermediario di compilatori classico
forma di rappresentazione che le persone vedono
negli ultimi forse 20 anni con
con buoni risultati per per trattare con
l’ analisi del flusso di dati parte del del
compilatore quindi ciò che effettivamente traduciamo a
albero di sintassi come quello sopra a a
rappresentazione appiattita che solo
hanno essenzialmente istruzioni su cosa
La la
il codice risultante deve fare e solo
allineato in una sequenza in modo da avere a
costante a costantemente e quindi una chiamata
questo chiede a queste due cose insieme così
questo è un insieme di un tipo di alto livello
rappresentazione intermedia che usiamo
e la cosa bella è che permette
per certe ottimizzazioni che farò
coprire più tardi una volta che abbiamo costruito questa cosa noi
passa attraverso un generatore di codice e finiamo
con un albero di sintassi che rappresenta
il codice JavaScript invece che può
quindi essere piuttosto stampato e animato e
questo è quello che vedi così il
rappresentazione intermedia che abbiamo
quattro per gli SS un modulo è che è un a
grafico dei blocchi di base essenzialmente se tu
prendi il codice sulla sinistra che ha
e se con un altro in là così ha
due diversi rami che sono possibili
e come alcuni lo stanno emergendo
in realtà compila qualcosa che
sembra più o meno come quello che ho
il giusto là ha quattro fondamentalmente
blocchi c’è quello di entrata che
tutto passa e ad alcuni
punto all’interno di quel blog di base c’è a
c’è una divisione o vai al
a sinistra o vai a destra a seconda di
il valore di xey per la base
il blocco a sinistra chiamerà la stampa
di X e il blocco di base sul sul
a destra chiamerà la stampa di Y e quindi
essi uniranno le forze di nuovo a
al lato di ritorno e finirà
restituendo X o Y a seconda di se
abbiamo eseguito b1 o b2 quindi il trucco con
la forma statica di assegnazione singola è quella
finisci per avere queste chiamate Phi
note nel grafico ci sono i nodi
servono esplicitamente unendo due
possibili valori da due diversi
indica nel codice il singolo statico
proprietà di assegnazione che ogni è quella
ogni singolo valore che produce questa cosa
è prodotto solo in un posto così così per
istanza quando tu e quando andate ad essere
tre dobbiamo capire se il
valore di ritorno che dobbiamo produrre è
da T 0 o T 1 e questo è un
ottimizzazione classica per
e ci permette di fare ottimizzazioni
e, naturalmente, la parte difficile è
qui sta trovando un buon modo di andare da
questa forma piuttosto astratta torna in
JavaScript che sembra ragionevole quando noi
ottimizzare è spesso molto importante per
noi per avere una nozione di albero dominato
dove un albero dominante è veramente ed è
a è un albero dei blocchi di base che
hai nel grafico dove sai
qualcosa su e quali blocchi sono
sempre garantito per essere eseguito prima
dei blocchi quindi in questo caso non lo sei
garantito che b1 sia eseguito prima di essere
tre non si è garantito che essere quello di
viene eseguito prima di essere tre ma sai
per tutti i blocchi lassù che non lo sono
essere 0 che essere 0 sarà stato eseguito
e corri al completamento prima di iniziare
in esecuzione ma b1 b2 o b3 questo in realtà
ti permette di iniziare a propagare
informazioni che trovi in b 0 al
nodi in b1 b2 e b3, quindi usiamo molto
inversioni di trattamento dominante nel
fase di ottimizzazione del compilatore in modo che il
il tipo di tentazione che facciamo è
elencato qui che facciamo un sacco di tag
propagazione quindi dovremo saprà che in
che possiamo generare un codice molto migliore se
sappiamo qualcosa sui tipi di
operandi coinvolti quindi propagiamo i tipi
attraverso questo questo modulo di saggio e
che ci dà un sacco di informazioni che
ci aiuta fino a topi facciamo anche un sacco di
funzione di inlining e quando sappiamo
abbastanza per il messaggio che noi siamo
chiamandoci possiamo effettivamente allineare il
corpi di loro al cartello di chiamata
che rendono certe cose molto più veloci
un’altra ottimizzazione che facciamo è globale
numerazione dei valori che coprirò di più
dettaglio e ma ti ho già mostrato un
loop invariante codice movimento faccia che
sposta questa lunghezza dall’accessorio da
dall’asse della lista fuori dal ciclo
quindi queste sono tutte ottimizzazioni classiche
non è qualcosa per cui abbiamo inventato
per dr js ma ce l’abbiamo fatta
sicuro che il compilatore ha abbastanza
struttura per supportare questo tipo di
ottimizzazioni quindi voglio darti un
sentirsi per quale tipo di trucchi di compilazione
suoniamo qui, quindi voglio spendere un po ‘
tempo su una delle ottimizzazioni
numerazione del valore globale quindi valore globale
la numerazione è un modo di
di sostituire sostanzialmente le istruzioni
con altre istruzioni quando lo sappiamo
faranno la stessa cosa così
sbarazzarsi di sotto-espressioni comuni
è un altro modo di formularlo così per
numerazione del valore globale diciamo i due
le istruzioni sono le stesse se loro
eseguire la stessa operazione sullo stesso
input così chiaramente a volte il
eseguire un’istruzione può avere un lato
effetti che possono influenzare gli altri
istruzioni ma in generale se tu
ho già calcolato il valore e tu
non sono stati influenzati da nessuna parte
effetti in corso non devi
ricalcola quel valore che è essenzialmente
numerazione del valore globale, quindi ecco a
semplice esempio di questo qui è un piccolo
metodo oscuro chiamato bagnato che produce il
risultato dell’aggiunta di 1 a X e e
qualcosa che con l’aggiunta di 1 a X
c’è qualche refactoring che dovrebbe essere
avrebbe dovuto essere fatto a quel livello di codice
già allora e ma se non l’hai fatto
che hai di nuovo ricevuto un modulo di prova
quello sembra qualcosa come questo ci sono
nessun ramo lì quindi è molto semplice
avere t0 che è il perimetro x te
avere t1 che è costante e quindi
tu li aggiungi insieme a una chiamata
che aggiunge t1 e T t0 e t1 usano il
valore e poi tu di più facciamo il
stessa cosa in seguito, come si può dire di vedere
qui e abbiamo diverse chiamate a più
abbiamo tre chiamate diverse il vantaggio
e siamo lieti di ridurlo un po ‘così
la numerazione del valore globale sarà effettivamente
scorre attraverso questo codice e capire
che il costante al
introdurre che t3 è in realtà qualcosa
abbiamo visto prima, quindi possiamo sbarazzarci di
quello e sostituirlo così a questo punto
il mio punto era che il t3 che possiamo ottenere
liberarsi di e possiamo sostituire e possiamo
sostituire l’uso di t3 con un t1 e in
il nella chiamata a più là in modo che
significa che il T3 si spegne completamente
questo era il punto che ci consente
in realtà per continuare a spingere su questo e
riutilizzare il fatto che t4 e t2 sono ora
lo stesso fanno la stessa operazione su
lo stesso input in modo da poterne sostituire uno
con l’ altro e finiamo per avere un
grafico più semplice che assomiglia
questo dove stai facendo di meno
calcoli e alla fine possiamo
generare codice che assomigli a qualcosa
questo invece è roba molto semplice
ti mostra solo come corri
il grafico scorre attraverso il codice e
rendersi conto che certe cose sono le stesse loro
sono uguali e ti sbarazzi del
versione ridondante di esso così il
algoritmo utilizzato per implementare effettivamente
questa cosa è è piuttosto semplice a
l’alto livello a cui basta camminare
Dominator tree e tu mantieni un set di
valori di valori live che hai già
calcolato e se trovi un
istruzione e hai già un live
valore nel tuo set lo scegli
valore reale invece e sostituire il
istruzione corrente con quello vivo
invece e, naturalmente, tu
registra queste istruzioni nel set
come andate e la cosa più grande è
che devi assicurarti che se tu
vedere qualcosa che ha un effetto collaterale
questo potrebbe influenzare qualcosa in questo set
di valori che è necessario rimuovere da
questo da questo set quindi è davvero solo un
attraversare quell’albero del Dominator
dove si tiene traccia di quali valori sono
già calcolato e può essere riutilizzato così
il grafico del flusso di controllo associato a
l’albero Dominator come questo è ancora
necessario quando fai queste operazioni
perché quando cammini l’albero Dominator
e potresti dover uccidere e puoi farlo
sbarazzarsi del valore live calcolato
per un’informazione basata su un ramo in
la fotografia di controllo quindi l’esempio
ecco che se arrivi al b2 e
blocco di base che devi effettivamente
lasciare che questo abbia effetto e la vita
valore impostato per l’analisi b3
perché b 3 può essere raggiunto attraverso essere a
nel flusso di controllo quindi è un po ‘
complicato ma il risultato netto è quello
generiamo codice più piccolo e altro ancora
codice efficiente una delle cose più grandi
che abbiamo ancora problemi con questo
abbiamo una mancanza di conoscenza in
nell’output generato e così anche
quando probabilmente avevamo un sacco di tipi in
il sistema e abbiamo ancora questo
problema che il codice che possiamo
generare noi quando non abbiamo alcun tipo
l’informazione è
molto peggio del codice sarà
generalmente lo abbiamo così a volte noi
senti come possiamo davvero fare una bella
buona ipotesi come se tu stia usando
forse qualcosa come una lista dovremmo
appena trattato come una lista se stai usando
qualcosa come un numero se stai aggiungendo
loro insieme per esempio forse noi
potrei trattarli come numeri
l’unico problema è che potremmo sbagliare
quindi proviamo a indovinare sulla base di input e
e come le cose vengono usate se loro
sono per esempio numeri ma quando siamo
facendo ciò che chiamiamo speculativo
ottimizzazioni dobbiamo essere consapevoli di questo
stiamo solo indovinando e non siamo del tutto
certo se abbiamo ragione quindi lascia che ti mostri
come sembra se hai il codice come
questo poi passa attraverso un array che usa il
X a lungo la proprietà aggiunge tutto
in questo e sarebbe davvero bello se
potremmo ottimizzare l’accesso di
elementi di array di FX e fare uso di
primitivi veloci per quello il problema è
non sappiamo se X è un array che potrebbe
essere una stringa potrebbe essere qualcosa di strano
solo che non sappiamo che cosa è e ma
il compilatore che abbiamo abbiamo leggermente
ci permette di speculare e dire che lo farebbe
essere fantastico con un vantaggio in più rispetto a un at
questo punto quindi perché non proviamo solo a
compilalo come se fosse così finiamo
generare codice come questo il primo
cosa che facciamo è che abbiamo controllato se X è un
javis della pioggia se non è con te
o quello, ma se è geloso di
array che è il caso dal primo
line down essenzialmente possiamo andare
avanti e fare tutte le operazioni su questo
javis berretto sapendo che è geloso
del raggio e possiamo accedere alle lunghezze
e possiamo accedere agli elementi dell’array
in un modo davvero veloce, dobbiamo ancora
controlla che le cose che leggiamo siano
i nostri numeri e dobbiamo controllare che
siamo nei limiti ma è ancora molto
meglio di dover chiamare arbitrario
i metodi a questo punto il problema è
questa prima riga che controlla se X
è una schiera di gioghi che sarebbe una specie di
pulito se gettiamo un’eccezione lì
e dire che sembrava che stavi usando
questo come un array JavaScript e davvero
non è così forse questo è un bug nel tuo
codice il problema è che bene in realtà
non è un problema è una caratteristica il bello
la cosa è che le persone possono scrivere le loro
codice dardo e hanno l’ottica che si comportano
proprio come le liste di costruzione
e e anche questo deve funzionare così noi
devo generare una versione di questo alcuni
metodo che funziona senza supposizione
che X è un lavoro così grande e quindi noi
generare è in realtà questo un separato
metodo chiamato la versione di salvataggio che
ha uno stato che usiamo effettivamente
inserire il metodo in luoghi diversi se
è necessario e ha il
ambiente le variabili live che noi
bisogno di trasferire da uno all’altro
in questo caso è solo X e qui tu
avere la versione lenta del codice
che è quello che saremmo stati costretti
generare se non lo facessimo se non lo facessi
avere la speculazione speculativa
ottimizzazioni in gioco, quindi quello che vedi
ecco molte altre chiamate al metodo
messaggio che prova a confrontare se le cose
sono meno di quanto si prova a ottenere le lunghezze
chiamando un accessor si tenta di indicizzare
in qualcosa chiamando l’indice
operatore o lat alla fine tranne per in
il metodo di indice quindi questo è solo molto
più in basso quindi preferiremmo molto correre in
nella versione ottimizzata di così noi
devo mettere questo per avere un dardo appropriato
semantica ma noi crediamo che noi
non useremo mai questo metodo così davvero
devi provare a tagliare il distributore
tentazioni nel sistema in modo diverso
genereremmo troppo codice che noi
non avrà mai bisogno ed è davvero difficile da
trovare il giusto equilibrio tra
ottimizzando troppo e troppo poco noi
non ho abbastanza informazioni in questo
indica che si tratta di un’analisi statica statica
cosa che pensiamo possa essere usata
in un modo o nell’altro così adesso
lo abbiamo ridotto al punto in cui siamo
speculando solo sui tipi per
valori utilizzati da loop interni
dove possiamo effettivamente spostarci certi
controlli fuori dal giro di conseguenza
quindi se lo speculativo è uno stinco
possiamo dimostrare che è abbastanza buono
per spostare effettivamente le cose dai loop
lo farò altrimenti proveremo a non farlo
facciamo questo abbiamo alcune idee su come
in realtà migliorare un po ‘così e se
in realtà siamo solo andati avanti e
generato ottimizzazioni speculative
su tutti i tipi che vorremmo
ottimizzare in base a e poi preso quello
risultando in codice grande ma ma
proprio come metterlo là fuori e correre
attraverso di esso e profilato e quello
ci darebbe qualche informazione in merito
come viene utilizzato il programma
allora ci permetterà di guardare effettivamente
a quale di questi metodi di salvataggio sono
anche essere chiamato lo permetterà
noi a guardare quale delle ottimizzate
messaggio che viene chiamato e
quali sono caldi così un modo pulito di
fare questo sarebbe in realtà 22
ottimizzare speculativamente tutto e
quindi ricompila con meno speculazioni
dove permetti solo speculazioni
limitazioni nei metodi che erano
in realtà sono davvero hot e in
la loro versione ottimizzata è così
qualcosa che abbiamo già implementato
perché la toolchain intorno a avere un
il passo di ottimizzazione del gadget di profilo è
tipo di complicato per i nostri utenti così e
ma sembra promettente in termini di
ottenere maggiori informazioni su ciò che il
il programma lo fa effettivamente in runtime così uno
cosa voglio dire di trattare
controllare così nel codice sì, noi allora
genereremmo questo come è una forma e
è un po ‘difficile per noi da prendere
quella forma e compilarlo anche voi
JavaScript di bell’aspetto l’esempio che ho
mostrato che spero non guardi troppo
straniero e ma in realtà è un po ‘
difficile da tradurre un grafico generico che
ha salti arbitrari tra blocchi di base
a qualcosa che somiglia a javascript
quindi quello che abbiamo fatto è in realtà che abbiamo
ho cercato di mantenere la struttura del codice da
freccia nel modulo SSA che abbiamo costruito senza problemi
troppo con esso e basta compilare quello
allo stesso JavaScript corrispondente
dichiarazioni di flusso di controllo non è il
soluzione ideale, forse, ma è così
funziona davvero molto bene ed è giusto
ci sono alcune ottimizzazioni sul
campo di controllo che non possiamo fare in questo modo
ma funziona bene per il flusso di dati in modo giusto
per darti un’idea di quello che sembra
come il tipo di posto in cui abbiamo
i problemi con questo è dove siamo
introdurre controlli nei luoghi in cui il
La sintassi JavaScript consente solo
espressioni essenzialmente così in questo caso
si dispone di un controllo di indice che si desidera
iniettare nella condizione di un ciclo for
è un po ‘difficile da fare in modo efficiente
così che ciò che finiamo per comporre anche questo
è qualcosa in cui non possiamo compilare il
per ciclo ad un ciclo for lo compiliamo a
un ciclo di tempo
con alcune pause in là per provare a
sfuggire quel confine non è così
piuttosto è il codice baker risolve il
problema in questo caso e in generale
essere in grado di compilare un ciclo for ad a
per loop e un ciclo while per un po ‘di tempo
era solo più bello quindi spero che questo
ti ha dato alcune informazioni su come
il compilatore è scritto e cosa può
ottimizzare gli asiatici che fa e ciò che noi
incentrato principalmente è in aggiunta a
è la prestazione di runtime e la correttezza
nel vero sito di codice di Victor che ha
migliorato di più dal nostro primo
rilascio e quello che stiamo vedendo in questo momento
è che piccoli esempi e in realtà fanno
compila con un piccolo pezzo di JavaScript
uscita e quindi non è più il caso
che otterrai megabyte di
JavaScript ammesso per un piccolo
ciao esempio del mondo e una cosa che
a volte vediamo se è così
le persone scrivono un’applicazione che dipende
su un sacco di librerie che tira in
attraverso le importazioni quindi se la tua applicazione
si traduce in pezzi di dimensioni considerevoli di
JavaScript potrebbe essere perché tu sei
importazione e utilizzo di molto codice di
transitivamente abbiamo ancora più lavoro da fare
fare in questa zona e continuerà a
spingere su questo, ma sta diventando molto
meglio ed è gentile ora e uno
cosa che non abbiamo implementato completamente
Eppure è il supporto per la generazione di minified
uscita che è molto comune nel
Il mondo JavaScript in cui ottieni questo
leggermente su di te skated e minified
versione di javis dell’output
questo è molto ben progettato per trans
trasmettendo attraverso il filo
essenzialmente solo una riscrittura che faccia
si abbassa sull’uso identifica
nel tuo codice e li rende piccoli e
il più breve possibile in modo da poter già utilizzare
e sperimentare ora
l’opzione minify ma dovresti aspettarti
ad cominci molto meglio nel corso
le prossime settimane e mesi quindi non lo faccio
sapere se questo è in realtà qualcosa di te
posso vedere qui dietro questo è un questo
è una diapositiva che ti mostra il nostro interno
sito di tracciamento delle prestazioni quindi questo è un
sottoinsieme del benchmark che eseguiamo e
voglio solo dimostrare che ci interessa
sulle prestazioni e le seguiamo
rintracciarlo ogni giorno se lo vuoi davvero
rendere il sistema veloce noi
per misurare le prestazioni in ogni check in
essenzialmente e lo facciamo noi
misurarci contro v8 perché noi
avere molta dimestichezza con il codice
genera e quindi quello che vedi qui è
in realtà sul giusto te
vedere per tutti i parametri che ho
elencato qui vedi quanto siamo veloci
rispetto a v8 quindi l’ultima colonna
la colonna più a destra inizia così
è quanto siamo veloci o veloci
il codice Java generatore che emettiamo
rispetto al solo JavaScript scritto a mano
codice e abbiamo ancora del lavoro da fare
siamo intorno al settantotto percento di
le prestazioni del puro codice JavaScript
ma devi pagare o tenere a mente
che questo in realtà include tutto il
controlli extra che abbiamo inserito lì
potrebbe aiutarti a prendere la tua scatola
prima che vadano in produzione, così siamo
generare codice che non è altrettanto efficiente
come JavaScript scritto a mano nativo in tutto
casi ancora, ma stiamo migliorando molto voi
può anche vedere che il dardo nativo
VM che è la penultima colonna qui
sta già facendo meglio di v8 già
e qualcosa su cui continueremo ad andare avanti
e ma è bello vederlo a causa di
l’ inizio semantico è più semplice
linguaggio per implementare in modo efficiente siamo
già ora anche prima del primo è un
il vero buio crede che abbiamo già vent’anni
percentuale più veloce di e v8 e noi
certamente si aspettano di migliorarlo
numero andando avanti quindi aspettatevi di più
il fronte delle prestazioni sempre così
le conclusioni sono molto semplici dovresti
scrivi le tue app web e dardeggia
dovrebbe essere compilato in JavaScript se tu
bisogno di una storia di compatibilità con il
browser moderni e tu puoi essere di più
produttivo se hai una buona catena di strumenti
e passa dal montaggio e un bene
compilatore per generare queste cose per
voi e potete farci preoccupare un po ‘
dell’ottimizzazione di piombo basso così tu
non devi discutere con i tuoi colleghi di lavoro
su tutti questi trucchi di basso livello e
cose di cui devi preoccuparti
JavaScript quindi l’ultima cosa è che noi
voglio davvero continuare a migliorare il web
piattaforma crediamo davvero che il web
è in
bisogno di un migliore supporto per la programmazione
nel grande e in particolare sul cellulare
vediamo che l’avvio dell’applicazione per grande
le app Web sono ancora un problema, qualcosa che noi
certamente voglio risolvere e vogliamo
darti più prevedibile e migliore
prestazioni di runtime e come già
visto che stiamo diventando molto vicino
dart2js front con JavaScript nativo
performance e sul fronte vm è
è già meglio così è stato tutto me stesso
avevo quindi sono molto molto aperto a qualsiasi tipo di
Domande che i ragazzi possono avere sulla
tecnologia o o dark ok così il primo
la domanda riguarda il debug e l’uso
le librerie javascript sono quindi in fase di debug
per prima cosa lo è anche la nostra storia di debug
davvero questo quando stai correndo con il
dardo VM è abbastanza semplice che tu abbia un
API debugger per il vm e puoi usare
è come se tu fossi in esecuzione in qualsiasi
altra soluzione nativa vm per il
generare codice javascript ciò che produciamo
è una mappa sorgente sul lato che racconta
gli strumenti di sviluppo che stai collegando
fino a dove e in sostanza ti dà
una mappatura dal retro del generatore
nel tuo codice sorgente in modo da poter fare come
unico passaggio attraverso il codice sorgente
anche se stai eseguendo il
Codice JavaScript, quindi stiamo ricevendo molto
di aiuto dal fatto che gli altri hanno
ha già generato questo mapping sorgente
formatta in modo che usiamo quello il secondo
parte della domanda era in giro
Integrazione JavaScript e a
interoperabilità con esistente
Le librerie JavaScript sono davvero difficili
problema ed è qualcosa che
abbiamo parlato molto del diverso
approcci ae e il più grande
il problema che abbiamo è davvero quello che vogliamo
qualcosa che funziona bene sul nativo
dardo VM e sulla versione tradotta
ciò si traduce in JavaScript, quindi vogliamo
una soluzione dove puoi prendere un pezzo di
Codice Java e interagire con esso nel
allo stesso modo, non importa se finisci in esecuzione
sul dardo VM o se sei in un
versione tradotta quindi cosa ci viene in mente
con finora è una sorta di modo limitato di
chiamare in modo sincrono essenzialmente
funzioni esterne lavori esterni e
poi facendo un po ‘di civiltà attraverso il
confine tra questi il JavaScript
mondo e mondo oscuro quindi significa
questo essenzialmente facendo questa integrazione
è un po ‘più ingombrante e giusto
chiamando java spunctional–
roba indietro ma dobbiamo fare un po ‘
controllandoli sul confine da fare
certo che i due mondi sono in a
formato coerente e non si ottiene un
molti puntatori per il rollback nativo di Java
testi di incorporato in tutti i tuoi dati
oggetti quindi è fattibile è un it’s
diventando sempre più facile ma è ancora
qualcosa dove ce ne vuole un mio
quantità di lavoro da integrare con quello
biblioteca esterna una cosa che ho sempre
piace chiederci che tipo di librerie
ti piacerebbe integrare con perché?
di solito c’è un sacco di cose
librerie Java molto importanti che
la gente vorrebbe davvero vedere come
jQuery e jQuery Mobile e quant’altro, ma
la lista è molto breve quindi se tu
avere qualcosa che vorresti c
integrati di cui vorrebbero sapere
e così la domanda è data che noi
chiedere a Google il controllo di v8 che abbiamo
ceduto alla tentazione di aggiungere
roba a v8 che ci permetterà di
generare meglio JavaScript e grassi e
corri più veloce su v8 sì, finora siamo noi
non ho aggiunto nulla a v8 come a
risultato delle nostre cose oscure tranne che per alcuni
mancano le ottimizzazioni per le quali abbiamo trovato
l’istanza v8 non era particolarmente brava in
occuparsi di valori a 32 bit senza segno e
ha affrontato solo 31 pozzi e abbiamo avuto
alcuni benchmark ma davvero davvero
importava quindi c’è un feedback
venendo dalla squadra oscura alla squadra v8
su cose particolari che non lo sono
esibirsi bene e in v8 come alcuni
essere un altro motore java in modo che lo facciano
opportunità di ottimizzazione ma siamo davvero
voglio solo mettere cose in v8 che
generalmente ha senso per JavaScript
programmi così il nostro stile qui è davvero
per provare a generare il codice Java che viene eseguito
bene su tutti i browser moderni e questo
non compra davvero tanto per farlo
eseguire il dieci percento più veloce e v8 da solo e
quindi finora non è stato qualcosa di simile
ha senso per noi capisco che sono io
significa che potresti essere tentato di farlo ma
non vinceremo nulla facendolo
essenzialmente e, a dire il vero, il
anche i posti in cui abbiamo mangiato sono
anche i luoghi in cui siamo più probabili
avere il dardo VM quindi non lo penso
in realtà è una pessima buona idea e
tranne per la ricerca di colli di bottiglia e
cose esistenti che possono essere prestazioni
fisso
e quindi la domanda è che consideriamo
aggiungendo un flag per far rispettare più rigorosamente
digitando per essere in grado di generare meglio
codice e quindi in realtà non abbiamo
considerato questo perché noi davvero
sentire come il dardo è una piattaforma dinamica e
volevamo davvero essere usati come
piattaforma dinamica quindi questa nozione
che non devi scrivere tipi
ovunque per ottenere un corretto e
programma efficiente è molto
importante per noi così no che non ha davvero
venire come qualcosa che volevamo
e alcune persone ci hanno chiesto se noi
volevo fidarmi forse delle annotazioni di tipo
quando sono lì per generare codice solo
basato sul tipo di notazione giusto
Supponiamo che siano corretti finora
non l’ho fatto e chiaramente in alcuni
casi che consentirebbero ai programmatori di
esprimici che certe cose sono
probabilmente è probabile che sia il numero così o
ma non l’abbiamo davvero preso
questo passo soprattutto perché è giusto
ora ci piacerebbe avere quel qualcosa in più
la pressione ci ha messo in alto
prestazioni senza cambiare il significato
delle annotazioni di tipo statico che
le persone hanno messo dentro vogliamo davvero
tieni questo come documentazione di
l’intento del programma non sono alcuni
trucco di basso livello di ottimizzazione in modo che il
la domanda è di avere un altro browser
i fornitori hanno mostrato interesse in
implementando un dardo VM e io in realtà
non so se qualcuno ha dimostrato di no
penso che abbiamo visto alcun sostegno pubblico per
il dardo VM attraverso altri browser I
penso sia ancora molto presto e il dardo
VM sta maturando come puoi vedere
la performance sta arrivando e c’è
possiamo ancora fare molto
meglio penso che sia sul nostro tavolo per provare
per dimostrare come quanto quanto
influisce su ciò che puoi costruire sul web
quando si tratta di avvio dell’applicazione e
prestazioni di punta e una volta che abbiamo che io
penso che sia la prima volta per noi
molto difficile da controllare cosa accadrà
da quel punto in avanti e ma noi di
Certo, speriamo che le persone trovino
che la tecnologia sia così avvincente e
interessante che vogliono usarlo anche
quindi la domanda è se, quando si passa
isolati che stai solo assegnando a questo
questa è la variabile del dollaro e e se
c’è qualche condivisione di codice dietro il
scene tra le diverse fessure dell’occhio così
in questo momento ce ne sono in realtà due
diverse versioni di creare un occhio
taglia o stai facendo funzionare la tua deposizione delle uova
altri occhi che in base al proprio
codice sorgente nel qual caso facciamo il codice
compartecipazione
e ma la vostra è anche possibile per deporre le uova
e io taglio da un URI dove non lo fai
sapere che cosa la tua deposizione delle uova nel qual caso noi
in realtà non proviamo a fare alcun codice
condividendo quindi è in realtà fino al
programma per richiedere uno o l’altro e
e chiaramente se si sta generando in base a
il tuo codice sorgente lo rende perfetto
senso di fare più code sharing e lì
non ci sono versioni strane in conflitti
può sorgere perché sai che sei
garantito che sia in esecuzione la stessa fonte
codice quindi è un bel posto dove stare e
questo è il posto dove la gente di solito
finiscono per essere quando vogliono solo usare
isolati per la loro applicazione
in più pezzi, ma anche in entrambi
ottenere alcuni dei benefici per la sicurezza o
è appena trapelato un po ‘incoraggiato
benefici di avere così effettivamente ciò che noi
facciamo è un bel piccolo oggetto che
è in realtà creato tramite un JavaScript
funzione che ha tonnellate di proprietà così
usiamo solo lo stesso costruttore per
creando il prossimo così essenzialmente
è un oggetto JavaScript che ce l’ha
sembra più o meno come se avessi un Java
classe così solo una volta per istanziare
ogni volta che scivolo è abbastanza leggero
in quel modo e l’idea è che noi
voglio permettere alle persone di eseguirle
come web worker o meno a seconda di cosa
hanno davvero bisogno a volte se ne hanno
una necessità per l’accesso Dom da più occhi
fessure e l’unica cosa che guadagni davvero
da aver moltiplica è questo
presentando la tua domanda in più
pezzi e anche tu guadagni l’an
essenzialmente uno spazio dei nomi globale in più
per tutto lo stato statico si ottiene un nuovo
copia di tutto ciò che è statico
le variabili sono semplicemente divise in questo modo
va bene per alcune cose che penso che abbiamo
tempo per un’altra domanda, ma penso
stiamo finendo il tempo sì, uno di più
domanda quindi la domanda è che abbiamo
librerie per l’accesso al ghiaccio Dom API
e poi database e cose simili
che così chiaramente queste cose stanno vivendo
costruito mentre parliamo dal lato server
ci sono molti diversi database che
puoi accedere e ne abbiamo alcuni
interfaccia per alcuni di loro costruita da
persone nella comunità oscura sul quando
incorporato nel browser abbiamo il
la gamma completa di dom ed e HTML è
disponibile per noi e abbiamo accesso a
loro attraverso la libreria HTML del dardo del colon
che è solo un modo semplice per te
scrivere il codice che accede al dom attraverso
dard quindi sì, c’è pieno supporto per
così
questo vale per tutti gli indici DBS e tutti
quelle cose che sono nel browser così
stiamo cercando di limitare il tuo accesso a
l’ ap basato su Dom è che vogliamo solo volerlo
dargli un nuovo linguaggio più sano
scrivere in quello ed essere ancora in grado di farlo
usa la tecnologia Browse così siamo
a corto di tempo grazie mille per
passare del tempo con me oggi e loro
spero di vedere più di voi qui per il
per i restanti discorsi in un Java
sottrarre
tu
JavaScript scura ed efficiente e spero
voi ragazzi siete interessati a entrambi i javascript
o compilatori perché questo è un due
argomenti di cui parlerò
corso più un po ‘di freccette e così prima
di tutto e come ho detto il mio nome è Emma
Casper lavoro come ingegnere software presso
Google e ho fatto un sacco di
progetti linguistici di programmazione che ero solito fare
fare piccoli discorsi integrati che erano molto
di divertimento ma a quanto pare nessuno davvero
adora il linguaggio di programmazione
non ha parentesi graffe quindi siamo finiti
facendo invece una v8 che è una java
motore e abbiamo costruito su Google e quello
è stato incluso in Google Chrome che noi
spedito in come quattro anni fa e noi
ha avuto molto successo con questo
piccolo progetto ed è ora in uso
non solo in chrome ma anche in note j / s
e altre configurazioni e penso che abbiamo
ha contribuito a spingere i limiti su ciò che è possibile
fare con javascript che porta davvero
io al prossimo proiettile laggiù dardo
è un è un linguaggio che aiuto il
co.design è una nuova struttura
linguaggio di programmazione per il web e uno
le caratteristiche principali di esso è che
compila su JavaScript così è
compatibile con il con il web aperto
ma puoi usarlo in qualsiasi moderno
browser oggi, quindi ti darò un ultra
introduzione rapida a dart e ma lo farò
concentrarsi principalmente sulla compilazione sotto
e la compilazione di dardo a
JavaScript è così sorprendente
linguaggio di programmazione orientato all’opzione
ha classi con ereditarietà singola
ha un’interfaccia implicita per quelle classi
quindi hai qualcosa che assomiglia
interfaccia da altre lingue e it
ha una sintassi molto familiare la familiarità
della sintassi è molto importante per noi
ed è molto difficile trovare un nuovo
programmare il linguaggio e renderlo un successo
quindi devi renderlo attraente
le persone e una grande parte di ciò sta facendo
sembra familiare e ce ne sono alcuni
novità in là e alcune cose
che siamo davvero molto felici di come
annotazioni di tipo statico facoltativo
ti permettono di e nel posto dove
ha senso per te documentare l’intento
di campi e variabili dando loro un
tipo statico non devi farlo ma
puoi ed è una cosa molto potente
Non ho intenzione di passare la tonnellata di
Ci sto lavorando in questo e in questo
presentazione ma è molto potente
caratteristica della piattaforma che dovresti
probabilmente provalo se non l’hai fatto
già c’è un pezzettino di codice
qui su questa diapositiva quello giusto
ti dà un’idea di cosa sia il dardo
questo è in realtà senza classe o
qualsiasi cosa usi solo un metodo di alto livello
chiamato principale e ha la sede familiare
strutture di controllo basate come quattro anelli
variabili introdotte con un prefisso
digita come int I uguale a 99 e un po ‘di stampa
dichiarazioni con una stringa
espressioni di interpolazione che fanno appena
è più facile lavorare con stringhe e
spero che questo non sembri troppo spaventoso
voi ragazzi peggiorerete nel
presentazione in corso ma, si spera
questo è un po ‘familiare a
la maggior parte di voi quindi questo è come noi
eseguire e distribuire il codice dardo in modo da voi
scrivi il tuo codice dart nel tuo preferito
editore e tu lo scrivi come fonte
codice quindi hai due opzioni
vieni, lo esegui direttamente sul
macchina virtuale e questo è il giusto
la maggior parte parte la macchina virtuale del dardo che
è incorporato in un browser che abbiamo
configurazioni personalizzate di cromo morbido
base per per Chrome che ha il presente
nativo vm abilitato in esso così non c’è
passo della compilazione è sufficiente eseguirlo lì
che è davvero bello, puoi persino eseguirlo
stand alone come script sul lato server
lingua ed è una caratteristica molto bella
e d’altra parte se sei in un
situazione in cui essere compatibile con
i browser esistenti là fuori sono davvero
importante per te e puoi anche usarlo
il freccette gel dovrebbe compilare che abbiamo
costruito per tradurre il tuo codice dardo in
JavaScript che funziona su qualsiasi moderno
browser questa è un’immagine molto semplice
e ci sono anche altri strumenti coinvolti
ma hai anche queste due opzioni
compilare a JavaScript ed eseguirlo
in un assistente browser o esegui il
codice senza compilarlo direttamente
su un vm nativo quindi scorri su JavaScript
la compilazione è molto importante per noi è
molto importante per noi sostenere che
attraverso tutti i browser moderni e così noi
test regolarmente su Chrome Firefox I
e Safari su
è dietro l’angolo per noi e
quindi vogliamo essere sicuri che non importa
che tipo di utente di browser moderno è
usando puoi eseguire il codice dardo in questo
browser attraverso la traduzione quindi questo
in realtà significa che il dardo VM è un
componente opzionale che non devi usare
è molto bello ed è molto veloce e
ma non devi usarlo, non lo siamo
cercando di costringerti a usarlo
pezzo di tecnologia in modo da poterlo fare
compilare il codice JavaScript è molto importante
ovviamente è anche importante che noi
può generare efficiente e compatto
JavaScript e questo dovrebbe andare senza
dicendo che sono la squadra di cui sono membro
noi siamo molto orgogliosi delle prestazioni
e davvero ciò che ci spinge a essere in grado
compilare a qualcosa che è efficiente
correre ed è abbastanza compatto questo è
certamente qualcosa ci preoccupiamo molto su
e la terza cosa è che vogliamo
questa traduzione per implementare il corretto
semantica dei doc e un bambino in
JavaScript ci sono certe cose
potresti decidere di non farlo
JavaScript ti consente di passare qualsiasi numero
di documenti alle tue funzioni che puoi
passa attraverso pochi ne puoi passare troppi
il buio non lo consente, quindi dobbiamo
assicurati che traduciamo la freccia
JavaScript manteniamo la stessa semantica
che non puoi passare troppi o troppo pochi
argomenti di una funzione e lo vogliamo
essere più severi e meno bene
non c’è una coercizione implicita ai numeri
e archi nel buio così ogni volta che il
la piattaforma JavaScript sottostante farebbe
quelle cose per te che dobbiamo fare
sicuro che non influisce sul
semantica Ti darò alcuni esempi su
cosa fa veramente questo al codice
e di cosa dobbiamo guardarci
essenzialmente in pochi istanti l’altro
la grande cosa è JavaScript come lingua
non ha la nozione di controllo e
indici quando si accede agli elenchi di cancellazione così
è praticamente tutto va se tu
passare un indice che non è nel raggio d’azione
sei appena diventato indefinito e non lo è
la semantica oscura che ti vogliamo davvero
ottenere un’eccezione se provi ad andare
fuori dai limiti di una lista e un
schieramento
quindi ecco un piccolo esempio più codice dardo
ha un metodo principale e ne crea due
punti in questo caso ho deciso di non mettere
annotazioni di tipo statico su P e Q
variabili così questo sembra molto simile
Codice JavaScript calcola due punti
e imposta P e Q chiamando il
Costruttori di quelle cose e poi esso
calcola la distanza da P a Q così
come appare se lo traduciamo
a JavaScript bene è abbastanza vicino
questo è in realtà il Java, quindi generiamo
per quello quindi c’è un metodo principale bene
in questo caso è una funzione gelatinosa
assegnato alla proprietà principale di a
dollaro ottico che io ti racconto
più tardi e all’interno di quella funzione, il corpo
il codice è più o meno quello che vorresti
aspetto che ci siano due chiamate al costruttore
in questo caso non stiamo usando un nuovo diritto
qui è in realtà nascosto dietro questo
chiamata di fabbrica fino al punto
fabbrica e ma la distanza da chiamare è
anche un po ‘speciale in quanto ha un
un suffisso di dollaro uno alla fine che è
il nostro modo di assicurarci che la distanza
al metodo ottiene esattamente vuole un argomento
ma se fai un passo indietro e
forse hanno quattro anni fa esplodere i tuoi occhi
sembrerà più o meno come lo splash
lì prima è molto molto vicino ad un io
posso volere una traduzione così io
accennato che queste schede poco
funzioni e in questo caso il principale
il metodo è messo su questo oggetto dollaro perché
lo facciamo così Java ha una nozione di
funzioni globali in modo che tu possa tutto giusto
riempirli invece sull’oggetto globale
bene si scopre che mettendo troppo
roba sull’oggetto globale è una specie di
fastidioso se vuoi qualsiasi tipo di
modularità nel tuo codice quindi se mai
vuoi fare il codice di invio da qualche altro
posto e potresti avere conflitti su questo
un oggetto globale quindi invece di lanciare
cose nell’oggetto globale in realtà
andare per metterli in a in un più piccolo
e oggetto e abbiamo appena questo
notazione abbreviata per X in quel chiamato
la cosa del dollaro è in realtà parte di
la nostra storia isolata e isolati sono
il nostro modo di eseguire più indipendenti
unità sulla stessa Java VM e quindi lì
ogni singolo occhio che avrebbe il suo
proprio
e una sorta di mi trovavo oggetto rappresentato
da questo dollaro cosa così di alto livello
funzioni costruisce tutte quelle cose
loro entrano in quell’unico spazio dei nomi
invece il compilatore lo emette per noi
quindi le chiamate al metodo erano semplici
lavori di chiamate di funzione tranne che noi
tradurre e codificare l’ era del
chiamare in nel nome del metodo
che stiamo chiamando e anche questo è fatto
per aiutarci a sostenere qualcosa come un
argomenti opzionali nominati che sono a
funzionalità della piattaforma e e
essenzialmente stiamo solo cercando di fare
sicuro che la semantica più severa noi
avere un inizio e viene mantenuto quando noi
compila il codice JavaScript in modo oscuro
il compilatore è una specie di sofisticato
il pezzo di codice a questo punto e noi
iniziato con un po ‘più semplice
implementazione del buio
compilatore e ha generato un bel po ‘ di
codice e ci è voluto molto tempo per generare
quella quantità di codice e si è scoperto
che stavamo davvero compilando molto
molti pezzi del codice che non erano
usato a tutti quindi abbiamo deciso di provare a
affrontare quello da zero
e attraverso un meccanismo che chiamiamo albero
scuotere pensa a tutto il tuo codice come tipo
di un albero e il nostro grafico strano sondaggio
di dipendenze tra i diversi
funzioni e le classi e pensare
l’albero delle dipendenze che puoi ottenere
fuori come afferrare il principale
metodo che l’entrata ti indica
notare che sono solo eccitati solo gocce
è questo che pensiamo quando diciamo
albero che si agita è in realtà un termine da
almeno i vecchi sistemi Smalltalk che
ci siamo appena tenuti nel mix qui
ha tre fasi in cui questo albero lo scuote
inizia alla fine proprio quello
è la sinistra e leggendo nel
file principale che può avere importazioni di
altri file e potrebbe avere il file sorgente
che deve essere letto da entrambi
web o un file system locale che abbiamo appena letto
li dentro e facciamo una specie molto veloce di a
un po ‘di un’analisi hacky di questa cosa noi
non guardare i corpi dei metodi che non abbiamo
guarda tutte le carte che non abbiamo
davvero bisogno di guardare noi solo
voglio capire quali sono tutti i bit
e pezzi che dobbiamo portare
tutti i pezzi di fonte una volta che abbiamo quello
portato in realtà inizierà il
fase centrale che è la risoluzione
fase in cui scopriamo cosa ogni
il nome si riferisce e il modo in cui lo iniziamo
è in realtà solo mettendo questo principale
metodo del punto di ingresso in a
risoluzione della coda del resolver e poi noi
fare una parte completa di ciò quando abbiamo un
a pieno titolo ne sapremo di più
a proposito del poi il corpo del metodo lì così
se principale si riferisce a qualcosa come il
costruttore di punti in realtà andrà
torna dal resolver e dai da mangiare
nel risolutore Q e dillo
in realtà hanno bisogno di quei costruttori per e
perché non hai un sistema di tipo completo
in un assistente come se fosse sfrecciato non è così
un approccio conservativo qui così se tu
vedi una chiamata a un metodo chiamato foo on
qualcosa che non sai veramente cosa sia
devi solo assicurarti di averlo messo
in tutto il messaggio di cibo che potrebbe
potenzialmente essere chiamato quindi questo è un
approssimazione dell’insieme di cose che
hai bisogno e si scopre che è in realtà
funziona abbastanza bene, c’è molto
cose che non abbiamo a che fare con e dentro
il caso comune e ma tendiamo a
ottenere un po ‘troppe informazioni o un po’
troppi metodi coinvolti in questo modo così
questa coda conosce davvero le classi
sappiamo che sono a San Shi
sa su quali sono i nomi dei metodi
usa e conosce un po ‘di tipo
le informazioni per i ricevitori più tipicamente
perché hai chiamato i metodi solo su
l’oggetto dis dove sai qualcosa
riguardo alla classe che racchiude una volta che abbiamo
fatto la risoluzione sappiamo qualcosa
su quali nomi si legano a quali cose
in realtà lo inseriamo in un’altra coda
che è la coda della compilazione e noi
ricominciamo inseriamo il metodo principale
lì e l’abbiamo costruito essenzialmente
di nuovo quella stessa coda la ragione per cui noi
fai questo è il generatore di codice
in realtà ha una faccia di ottimizzazione che
diffonde informazioni sul tipo attraverso questo
attraverso le posizioni intermedie noi
sono in gioco così a volte ne abbiamo di più
digitare le informazioni lì così mentre nel
risolutore potresti sapere che è foo
ha invitato qualcosa nella zona di Cochin
in realtà potremmo sapere qualcosa
quello che è chiamato su questo è molto
astratto e ma il risultato finale è quello
finiamo con la dieta parsing un sacco e
risolviamo e parti
essere meno di quello e noi in realtà
compilare e generare il codice JavaScript per
un sottoinsieme di ciò è il risultato netto
qualcosa come un esempio di ciao mondo
compila per una quantità molto molto breve di
Codice JavaScript e, naturalmente, il
più dipendenze e più cose
importa da altre librerie e tu
includere in questo modo il più grande il
l’applicazione otterrà così è più
come una paga come si va in giro
qualsiasi altra cosa così quando compili il dardo
in JavaScript ci sono alcune lingue
sfide che ho brevemente menzionato
prima voglio solo tuffarmi in alcuni di
quelli uno dei più grandi è quel dardo
ha il supporto per gli operatori definibili dall’utente
quindi potresti dire che nella mia classe il mio
classe di vettori che ho inventato voglio
supporta l’operazione plus in modo che tu possa
aggiungi questi vettori insieme per esempio
javascript ha questa nozione implicitamente
conversione più ingressi a numeri che facciamo
un plus da qualche parte è convertito
a un numero o stringa i due ingressi
a seconda degli input ma c’è
in nessun modo puoi rendere quel plus come il
JavaScript plus ed essenzialmente io
dare un più alto livello più l’operazione su
vettori per te quindi non puoi usare Java
con plus per implementare dark plus in
nel caso generale non funziona
l’altro modo per farlo è come il semplice
modi solo per dire ogni volta che vediamo un vantaggio
e il codice dardo chiameremo solo un metodo
sul lato sinistro e noi
in realtà ho provato a farlo solo un giusto
aggiungi le chiamate al metodo per tutta la nostra aritmetica
le operazioni risultano essere troppo lente
presso il tipo della parte più bassa di
la diapositiva qui ho mostrato come è possibile
fallo semplicemente aggiungendo un’atmosfera a
messaggio doorstop al prototipo numero
e che in realtà ti permette di chiamare il
aggiungi metodo a tutti i metodi sup sui numeri
quindi funziona davvero il problema è questo
il metodo è molto lento e il motivo per cui
è molto lento, uno dei motivi
perché è molto lento è dentro questo
Funzione JavaScript che questo riferimento
in là è in realtà un oggetto scatola così
quando chiami quando chiami l’add
metodo su dire sull’intero 1
JavaScript DJ out – in realtà deve andare
testa e avvolgere che assicurano uno in un nuovo
oggetto e legalo a quell’oggetto
prima può chiamare quel metodo che dà
tu il sovraccarico di allocare su ogni
operazione aritmetica singola che è
solo dolorosamente lento in modalità rigorosa
non è così, ma non è così
vuoi usare la modalità rigorosa per loro
questo davvero non volevo fare affidamento
modalità rigorosa per far funzionare le nostre cose
ed essere efficienti, quindi la nostra soluzione è
in realtà per capire quando possiamo
usa JavaScript plus quando è sicuro
usalo quando deve scrivere semantica
per noi e lo facciamo monitorando i tipi
nel compilatore quindi se sappiamo qualcosa
sugli operandi se sappiamo che lo sei
operare su numeri è sicuro da usare
un javascript plus per questo l’altro grande
la cosa è il controllo dell’intervallo così ha Java
no nozione di asse fuori limite e tutto
tutte le chiavi sono essenzialmente trattate come
archi Non sono sicuro che tutte le persone
che in realtà funzionano con i peccati java
una specie di amaris che stanno effettivamente lavorando
nella lingua che permette loro di stare bene
che in realtà non li aiuta davvero
nel definire una gara di una certa dimensione e
controllando che tu sia roba eccellente
all’interno di quello in cui abbiamo deciso di dart
per risolvere questo problema che javis passivo
una sorta di tenere la mentalità da camionista
che tutto va e basta
affrontarlo successivamente inserendo questi
espliciti controlli indice a meno che non siamo in grado di
dimostrare che non abbiamo bisogno di loro in modo che
significa che ogni volta che accedi a
elemento di un array nel codice dardo nel
codice java arenato da quello che farai
vedi i controlli espliciti che sei all’interno
la gamma di ciò che è qualcosa
come confrontare contro zero e il
link e cose che ti faccio vedere
codice in un attimo quindi ecco un bel pezzo
di codice di partenza che poi mi permetterà di
per parlarvi di queste ottimizzazioni
qui così tutti possono vedere questo codice
la schiena per il contrario devi venire
più vicino quindi questo è di nuovo il codice dardo come a
metodo principale crea una lista c’è a
alcune variabili e basta scorrere il
elementi dell’elenco degli ufficiali da zero
ai due quasi fino alle lunghezze
e basta aggiungerli insieme e stampare il
risultato codice abbastanza semplice quando possiamo
pubblicare in codice JavaScript non è un
traduzione one-to-one così tu
posso probabilmente riconoscere alcune cose in
lì e il
è invariato il ciclo for guarda un po ‘
più grande ma la cosa più grande è davvero
prima di accedere alla lista
elementi in realtà inseriamo un esplicito
controlla quale è il se ho meno di zero
o I maggiore della lunghezza della lista
maggiore di uguale lancia questo indice
di eccezione di gamma è il modo in cui il
Pooh mi riferisco all’ordine quando abbiamo finito
che controlla che sia perfettamente sicuro accedere
l’elenco come elenco come array JavaScript
in realtà ciò lo rende ragionevolmente veloce
ma è un po ‘fastidioso quello che abbiamo
per inserire questo controllo solo perché javis
non era farlo per noi ma per preservare
la giusta semantica oscura che abbiamo deciso
per farlo l’ altra grande cosa qui è
che ogni volta che aggiungi cose
insieme per essere in grado di utilizzare Java con
in più devi assicurarti che il
il materiale su cui stai operando è in realtà
numeri così in realtà controlliamo quella roba
abbiamo letto dalla lista è un numero
prima di operare su di esso se non è un
numero in realtà butteremo un illegale
invece l’eccezione degli occupanti e tu puoi
vediamo che abbiamo fatto un po ‘di
accorciare il codice qui usando
nomi di spalline troppo buoni per uno
cosa lo rende in forma sulla diapositiva e il
l’altra cosa è, naturalmente, quella gente
cura delle dimensioni del codice, quindi se inseriamo
questi controlli ovunque nel loro codice
e dobbiamo assicurarci che poi
non occupa troppo spazio
una cosa che probabilmente dovrei menzionare qui
è che in realtà non ne abbiamo mai abbastanza
rendersi conto che la lista di quella lunghezza
non cambia in questo ciclo, quindi portiamo
fuori dal giro e leggerlo prima
inserendo il ciclo solo una volta e in realtà
se dovessi ricompilare questo oggi il
il controllo della lunghezza sarebbe andato via
perché abbiamo implementato alcuni array
i limiti controllano l’eliminazione perché in questo
caso è abbastanza semplice che in realtà
sapere dove si trova entro i limiti quindi questo è
in realtà un po ‘sbagliato per mostrarti ragazzi
ma è bello mostrarti cosa
potresti vedere cose come questa nella tua
codice se compilate e guardate il
uscita un’altra cosa che è abbastanza
comune e dardo è scrivere classi e
quindi vediamo un sacco di persone in JavaScript
usando qualcosa che assomiglia alle classi
da avendo questi modelli che loro
utilizzare per la configurazione
funzione costruttore e aggiunta di un mazzo
di metodi per il prototipo spento e
hanno modelli diversi e alcuni
struttura di supporto diversi modelli e
ed è certamente il caso
anche quando si programma in JavaScript
c’è un sacco di classi ad hoc
definizioni che fluttuano nel dardo è
ancora di più le persone scrivono molto
classi e questo significa che hai un
Molto della Bibbia è in vigore e per
creando istanze di classe e
accedere ai campi di classi che tu
bisogno di capire come e devono
produrre così abbiamo deciso di andare per un
come usare una semplice funzione di supporto per
configurare il sistema e solo generare
la maggior parte di questo testo standard in modo dinamico in
runtime usando il fatto che javis lì
è una piattaforma dinamica che può realmente
puoi iniettare e generare nuovo codice
in runtime così sembra
il punto è che ti ho mostrato prima e
bene, ho usato prima di compilare effettivamente
qualcosa di questo è JavaScript
codice sembra un po ‘straniero ce l’ha
ha un incarico su una proprietà punto su
sul ghiaccio per l’oggetto e ha
ha un metodo e ha una super classe
definizione, quindi modifichiamo tutto in uno
oggetto letterale e che è equo
compattare la stringa vuota lassù
denota i campi che abbiamo così
diciamo che tutti i punti hanno una X su a
campo filo non siamo qui dobbiamo
scrivere la funzione di costruzione effettiva
per il punto perché questo è in realtà
calcolato in runtime da questo elenco di
definizioni dei campi e la super classe
definizione che è oggetto i metodi
comunque sono appena messi qui come
proprietà ordinarie su questo oggetto così
la distanza dal metodo con il dollaro
una roba di codifica arity e guarda di più
o meno come la funzione giostra di te
ci si aspetterebbe ma la roba intorno è
in realtà un modo compatto di introdurre
classi così prendiamo questa lista di campi
come X virgola Y e lo trasformiamo in
codice come funzione punto X virgola Y questo
compito statico tutto ciò che tutto
quel boilerplate lo generiamo per
tu in runtime, certo che hai solo tu
per farlo una volta con la point class
una volta che è in gioco non devi farlo
qualunque
di più ma significa che il codice te
il trasferimento ai tuoi clienti è più piccolo e
è solo una sorta di espansione quando
in realtà è in una corsa sulla sulla
lato client così otteniamo questi aiutanti
generato per noi dal sistema noi
in realtà ti permettono anche di avere sentimenti
liste che ne hanno un po ‘di più
annotazioni avanzate in modo da poter avere un
punto interrogativo o un incarico e cosa
nel nome del campo e solo quello è
solo il nostro modo di capire se hai bisogno
per introdurre un setter o ottenere il nostro
combinazione dei due per quei campi
quindi questo è solo un modo compatto di fare
è bello se guardi il
Uscita JavaScript che noi generiamo
sembra che preserviamo la classe
struttura abbastanza bene quindi spero che tu sia
tutti familiari con chiusure in Java a
meno e così in dardo che abbiamo
supporto di chiusura in modo da poter avere questi
espressioni di funzione che fluttuano intorno
che prende argomenti e produce valori
e la nostra chiusura è in realtà un nome di supporto
documenti e devono anche essere
controllato nel senso che se passi
troppi argomenti per loro o per vedere noi
voglio prenderlo così inizialmente
volevo provare a compilare una chiusura a dardo
a un Java così vicino si scopre che
è un po ‘ doloroso perché il
JavaScript, certo, è qualcosa che puoi
invoca e non ha idea di
controllando quanti argomenti lo passi
almeno non è un modo economico per farlo e basta
solo in qualche modo è difficile capire a
modo di adattarlo davvero bene
insieme così ad un certo punto ci siamo resi conto
è questo che alloca un piccolo oggetto Java
in realtà molto economico è più veloce di
allocando chiusure e in molti casi a
almeno su alcune macchine virtuali e l’abbiamo trovato
anche con il massimo di sei o sette
campi in cui puoi creare un oggetto
semplice oggetto Java nella stessa quantità di
tempo in cui è possibile creare una quantità folle
di spazio in quanto è possibile creare una chiusura così
abbiamo parlato in realtà solo usando
oggetti per rappresentare il
le chiusure oscure quindi in realtà
implementato questo e si è scoperto così
bello che questo è quello che abbiamo tenuto nel
sistema in modo da trattare le chiusure come esempi
delle classi di chiusura così essenzialmente nella nostra
modellare una chiusura è solo un oggetto
ha il supporto per essere invocato che ha
questi metodi di chiamata e usiamo istanza
campi in questi e questi chiusure
classi per rappresentare le variabili
tu catturi dal tuo campo di applicazione e usiamo
metodi su queste classi di chiusura a
implementare le convenzioni di chiamata che
abbiamo bisogno che questo sia un po ‘astratto, lo farò
mostrarti qui il codice dell’arte c’è un
lista e corro attraverso la lista e per
ogni elemento nella lista e otterrò
l’indice e questo è in realtà un po ‘
codice strano ma comunque quello che hai dentro
il mezzo qui è in realtà a
chiusura che prende un parametro ciascuno e
produce il risultato della lista di chiamate che
indicizziamo con quello ogni cosa e a
Alla fine stampiamo tutto così questo è
sintassi concisa molto breve per fare
mappe mappano le operazioni su una lista e
ciò a cui lo compiliamo è in realtà questo
in basso puoi vedere questa chiusura
classe è che è una classe come le altre
è come la cosa che ti ho mostrato
prima che abbia un campo a istanza singola
chiamato lista e ha un metodo
chiamato chiamata dollaro uno che è ciò che noi
bisogno dell’azione che dobbiamo invocare
quando invochiamo questa chiusura con
un argomento così là dentro in realtà
vedi il codice per la chiusura al
sito giovanile dove assegniamo un nuovo nuovo
chiusura e passarlo all’operazione mappa
quello che tu hai lì è in realtà
un’allocazione standard chiamata per creare a
nuova nuova chiusura quindi è abbastanza
semplice in questo modo il più grande svantaggio
è che strappa davvero il
corpo della chiusura e lo mette
in un posto diverso nel codice così
essenzialmente questo è dividere e
due diversi pop e l’ output è
a volte un po ‘più difficile quando ne hai due
in profondità perché finisci per saltare
tra posti diversi ma è molto
bello per compilare e avere un
modello unificato di come ci occupiamo
scarafaggi e classi
quindi una cosa che probabilmente vale la pena
menzionare qui è che potrebbe essere un
piccoli dettagli di alcuni ma in realtà
tipo di importante che al ritorno
indice di dollaro spento non stiamo chiamando indice
fuori dalla lista in cui ci stiamo effettivamente passando
questo è il primo documento e questo è un
cosa generale e nel nostro sistema che abbiamo
deciso di non fare ciò che la gente di solito
fare riferimento a come patch della scimmia di
le classi di base quindi numeri array e
e stringhe di JavaScript non lo siamo
aggiungendo un sacco di nuove funzionalità su
in realtà preferiamo tenerlo attivo
il lato in questo ghiaccio all’oggetto e
abbiamo appena invochiamo questo ho sinottico con questo
è il primo parametro invece perché
quindi non devi in realtà aggiungere
cose a queste cose di nuovo questo è un
modo di cercare di evitare uno scontro e
nome scontri in questi questi comuni
oggetti così ho mostrato il tuo codice d’amore
già e ora voglio raccontarti un po ‘
su come effettivamente andiamo in giro
generare questo codice così e come ho detto
il compilatore oscuro è una specie di
bestie sofisticate ed è abbastanza
compilatore classico tranne che per l’albero
scuotendo forse e inizia con
costruzione di alberi di sintassi per la freccetta del dardo
gli alberi di sintassi del codice sono molto semplici
rappresentazione del tuo codice sorgente
e potrebbe sembrare qualcosa del genere
per a per una semplice espressione positiva I
avere una nota positiva e avete due e a
tre e fuori appeso sotto così andiamo
attraverso uno stadio che chiamiamo SS a
costruzione del grafico che effettivamente costruisce
una rappresentazione intermedia basata su
una forma di saggio se questa è una forma
probabilmente non familiare a tutti voi così
Ti darò solo una breve testa
su ciò che è così la forma del saggio è
modulo statico assegnazione singola quindi è a
è un intermediario di compilatori classico
forma di rappresentazione che le persone vedono
negli ultimi forse 20 anni con
con buoni risultati per per trattare con
l’ analisi del flusso di dati parte del del
compilatore quindi ciò che effettivamente traduciamo a
albero di sintassi come quello sopra a a
rappresentazione appiattita che solo
hanno essenzialmente istruzioni su cosa
La la
il codice risultante deve fare e solo
allineato in una sequenza in modo da avere a
costante a costantemente e quindi una chiamata
questo chiede a queste due cose insieme così
questo è un insieme di un tipo di alto livello
rappresentazione intermedia che usiamo
e la cosa bella è che permette
per certe ottimizzazioni che farò
coprire più tardi una volta che abbiamo costruito questa cosa noi
passa attraverso un generatore di codice e finiamo
con un albero di sintassi che rappresenta
il codice JavaScript invece che può
quindi essere piuttosto stampato e animato e
questo è quello che vedi così il
rappresentazione intermedia che abbiamo
quattro per gli SS un modulo è che è un a
grafico dei blocchi di base essenzialmente se tu
prendi il codice sulla sinistra che ha
e se con un altro in là così ha
due diversi rami che sono possibili
e come alcuni lo stanno emergendo
in realtà compila qualcosa che
sembra più o meno come quello che ho
il giusto là ha quattro fondamentalmente
blocchi c’è quello di entrata che
tutto passa e ad alcuni
punto all’interno di quel blog di base c’è a
c’è una divisione o vai al
a sinistra o vai a destra a seconda di
il valore di xey per la base
il blocco a sinistra chiamerà la stampa
di X e il blocco di base sul sul
a destra chiamerà la stampa di Y e quindi
essi uniranno le forze di nuovo a
al lato di ritorno e finirà
restituendo X o Y a seconda di se
abbiamo eseguito b1 o b2 quindi il trucco con
la forma statica di assegnazione singola è quella
finisci per avere queste chiamate Phi
note nel grafico ci sono i nodi
servono esplicitamente unendo due
possibili valori da due diversi
indica nel codice il singolo statico
proprietà di assegnazione che ogni è quella
ogni singolo valore che produce questa cosa
è prodotto solo in un posto così così per
istanza quando tu e quando andate ad essere
tre dobbiamo capire se il
valore di ritorno che dobbiamo produrre è
da T 0 o T 1 e questo è un
ottimizzazione classica per
e ci permette di fare ottimizzazioni
e, naturalmente, la parte difficile è
qui sta trovando un buon modo di andare da
questa forma piuttosto astratta torna in
JavaScript che sembra ragionevole quando noi
ottimizzare è spesso molto importante per
noi per avere una nozione di albero dominato
dove un albero dominante è veramente ed è
a è un albero dei blocchi di base che
hai nel grafico dove sai
qualcosa su e quali blocchi sono
sempre garantito per essere eseguito prima
dei blocchi quindi in questo caso non lo sei
garantito che b1 sia eseguito prima di essere
tre non si è garantito che essere quello di
viene eseguito prima di essere tre ma sai
per tutti i blocchi lassù che non lo sono
essere 0 che essere 0 sarà stato eseguito
e corri al completamento prima di iniziare
in esecuzione ma b1 b2 o b3 questo in realtà
ti permette di iniziare a propagare
informazioni che trovi in b 0 al
nodi in b1 b2 e b3, quindi usiamo molto
inversioni di trattamento dominante nel
fase di ottimizzazione del compilatore in modo che il
il tipo di tentazione che facciamo è
elencato qui che facciamo un sacco di tag
propagazione quindi dovremo saprà che in
che possiamo generare un codice molto migliore se
sappiamo qualcosa sui tipi di
operandi coinvolti quindi propagiamo i tipi
attraverso questo questo modulo di saggio e
che ci dà un sacco di informazioni che
ci aiuta fino a topi facciamo anche un sacco di
funzione di inlining e quando sappiamo
abbastanza per il messaggio che noi siamo
chiamandoci possiamo effettivamente allineare il
corpi di loro al cartello di chiamata
che rendono certe cose molto più veloci
un’altra ottimizzazione che facciamo è globale
numerazione dei valori che coprirò di più
dettaglio e ma ti ho già mostrato un
loop invariante codice movimento faccia che
sposta questa lunghezza dall’accessorio da
dall’asse della lista fuori dal ciclo
quindi queste sono tutte ottimizzazioni classiche
non è qualcosa per cui abbiamo inventato
per dr js ma ce l’abbiamo fatta
sicuro che il compilatore ha abbastanza
struttura per supportare questo tipo di
ottimizzazioni quindi voglio darti un
sentirsi per quale tipo di trucchi di compilazione
suoniamo qui, quindi voglio spendere un po ‘
tempo su una delle ottimizzazioni
numerazione del valore globale quindi valore globale
la numerazione è un modo di
di sostituire sostanzialmente le istruzioni
con altre istruzioni quando lo sappiamo
faranno la stessa cosa così
sbarazzarsi di sotto-espressioni comuni
è un altro modo di formularlo così per
numerazione del valore globale diciamo i due
le istruzioni sono le stesse se loro
eseguire la stessa operazione sullo stesso
input così chiaramente a volte il
eseguire un’istruzione può avere un lato
effetti che possono influenzare gli altri
istruzioni ma in generale se tu
ho già calcolato il valore e tu
non sono stati influenzati da nessuna parte
effetti in corso non devi
ricalcola quel valore che è essenzialmente
numerazione del valore globale, quindi ecco a
semplice esempio di questo qui è un piccolo
metodo oscuro chiamato bagnato che produce il
risultato dell’aggiunta di 1 a X e e
qualcosa che con l’aggiunta di 1 a X
c’è qualche refactoring che dovrebbe essere
avrebbe dovuto essere fatto a quel livello di codice
già allora e ma se non l’hai fatto
che hai di nuovo ricevuto un modulo di prova
quello sembra qualcosa come questo ci sono
nessun ramo lì quindi è molto semplice
avere t0 che è il perimetro x te
avere t1 che è costante e quindi
tu li aggiungi insieme a una chiamata
che aggiunge t1 e T t0 e t1 usano il
valore e poi tu di più facciamo il
stessa cosa in seguito, come si può dire di vedere
qui e abbiamo diverse chiamate a più
abbiamo tre chiamate diverse il vantaggio
e siamo lieti di ridurlo un po ‘così
la numerazione del valore globale sarà effettivamente
scorre attraverso questo codice e capire
che il costante al
introdurre che t3 è in realtà qualcosa
abbiamo visto prima, quindi possiamo sbarazzarci di
quello e sostituirlo così a questo punto
il mio punto era che il t3 che possiamo ottenere
liberarsi di e possiamo sostituire e possiamo
sostituire l’uso di t3 con un t1 e in
il nella chiamata a più là in modo che
significa che il T3 si spegne completamente
questo era il punto che ci consente
in realtà per continuare a spingere su questo e
riutilizzare il fatto che t4 e t2 sono ora
lo stesso fanno la stessa operazione su
lo stesso input in modo da poterne sostituire uno
con l’ altro e finiamo per avere un
grafico più semplice che assomiglia
questo dove stai facendo di meno
calcoli e alla fine possiamo
generare codice che assomigli a qualcosa
questo invece è roba molto semplice
ti mostra solo come corri
il grafico scorre attraverso il codice e
rendersi conto che certe cose sono le stesse loro
sono uguali e ti sbarazzi del
versione ridondante di esso così il
algoritmo utilizzato per implementare effettivamente
questa cosa è è piuttosto semplice a
l’alto livello a cui basta camminare
Dominator tree e tu mantieni un set di
valori di valori live che hai già
calcolato e se trovi un
istruzione e hai già un live
valore nel tuo set lo scegli
valore reale invece e sostituire il
istruzione corrente con quello vivo
invece e, naturalmente, tu
registra queste istruzioni nel set
come andate e la cosa più grande è
che devi assicurarti che se tu
vedere qualcosa che ha un effetto collaterale
questo potrebbe influenzare qualcosa in questo set
di valori che è necessario rimuovere da
questo da questo set quindi è davvero solo un
attraversare quell’albero del Dominator
dove si tiene traccia di quali valori sono
già calcolato e può essere riutilizzato così
il grafico del flusso di controllo associato a
l’albero Dominator come questo è ancora
necessario quando fai queste operazioni
perché quando cammini l’albero Dominator
e potresti dover uccidere e puoi farlo
sbarazzarsi del valore live calcolato
per un’informazione basata su un ramo in
la fotografia di controllo quindi l’esempio
ecco che se arrivi al b2 e
blocco di base che devi effettivamente
lasciare che questo abbia effetto e la vita
valore impostato per l’analisi b3
perché b 3 può essere raggiunto attraverso essere a
nel flusso di controllo quindi è un po ‘
complicato ma il risultato netto è quello
generiamo codice più piccolo e altro ancora
codice efficiente una delle cose più grandi
che abbiamo ancora problemi con questo
abbiamo una mancanza di conoscenza in
nell’output generato e così anche
quando probabilmente avevamo un sacco di tipi in
il sistema e abbiamo ancora questo
problema che il codice che possiamo
generare noi quando non abbiamo alcun tipo
l’informazione è
molto peggio del codice sarà
generalmente lo abbiamo così a volte noi
senti come possiamo davvero fare una bella
buona ipotesi come se tu stia usando
forse qualcosa come una lista dovremmo
appena trattato come una lista se stai usando
qualcosa come un numero se stai aggiungendo
loro insieme per esempio forse noi
potrei trattarli come numeri
l’unico problema è che potremmo sbagliare
quindi proviamo a indovinare sulla base di input e
e come le cose vengono usate se loro
sono per esempio numeri ma quando siamo
facendo ciò che chiamiamo speculativo
ottimizzazioni dobbiamo essere consapevoli di questo
stiamo solo indovinando e non siamo del tutto
certo se abbiamo ragione quindi lascia che ti mostri
come sembra se hai il codice come
questo poi passa attraverso un array che usa il
X a lungo la proprietà aggiunge tutto
in questo e sarebbe davvero bello se
potremmo ottimizzare l’accesso di
elementi di array di FX e fare uso di
primitivi veloci per quello il problema è
non sappiamo se X è un array che potrebbe
essere una stringa potrebbe essere qualcosa di strano
solo che non sappiamo che cosa è e ma
il compilatore che abbiamo abbiamo leggermente
ci permette di speculare e dire che lo farebbe
essere fantastico con un vantaggio in più rispetto a un at
questo punto quindi perché non proviamo solo a
compilalo come se fosse così finiamo
generare codice come questo il primo
cosa che facciamo è che abbiamo controllato se X è un
javis della pioggia se non è con te
o quello, ma se è geloso di
array che è il caso dal primo
line down essenzialmente possiamo andare
avanti e fare tutte le operazioni su questo
javis berretto sapendo che è geloso
del raggio e possiamo accedere alle lunghezze
e possiamo accedere agli elementi dell’array
in un modo davvero veloce, dobbiamo ancora
controlla che le cose che leggiamo siano
i nostri numeri e dobbiamo controllare che
siamo nei limiti ma è ancora molto
meglio di dover chiamare arbitrario
i metodi a questo punto il problema è
questa prima riga che controlla se X
è una schiera di gioghi che sarebbe una specie di
pulito se gettiamo un’eccezione lì
e dire che sembrava che stavi usando
questo come un array JavaScript e davvero
non è così forse questo è un bug nel tuo
codice il problema è che bene in realtà
non è un problema è una caratteristica il bello
la cosa è che le persone possono scrivere le loro
codice dardo e hanno l’ottica che si comportano
proprio come le liste di costruzione
e e anche questo deve funzionare così noi
devo generare una versione di questo alcuni
metodo che funziona senza supposizione
che X è un lavoro così grande e quindi noi
generare è in realtà questo un separato
metodo chiamato la versione di salvataggio che
ha uno stato che usiamo effettivamente
inserire il metodo in luoghi diversi se
è necessario e ha il
ambiente le variabili live che noi
bisogno di trasferire da uno all’altro
in questo caso è solo X e qui tu
avere la versione lenta del codice
che è quello che saremmo stati costretti
generare se non lo facessimo se non lo facessi
avere la speculazione speculativa
ottimizzazioni in gioco, quindi quello che vedi
ecco molte altre chiamate al metodo
messaggio che prova a confrontare se le cose
sono meno di quanto si prova a ottenere le lunghezze
chiamando un accessor si tenta di indicizzare
in qualcosa chiamando l’indice
operatore o lat alla fine tranne per in
il metodo di indice quindi questo è solo molto
più in basso quindi preferiremmo molto correre in
nella versione ottimizzata di così noi
devo mettere questo per avere un dardo appropriato
semantica ma noi crediamo che noi
non useremo mai questo metodo così davvero
devi provare a tagliare il distributore
tentazioni nel sistema in modo diverso
genereremmo troppo codice che noi
non avrà mai bisogno ed è davvero difficile da
trovare il giusto equilibrio tra
ottimizzando troppo e troppo poco noi
non ho abbastanza informazioni in questo
indica che si tratta di un’analisi statica statica
cosa che pensiamo possa essere usata
in un modo o nell’altro così adesso
lo abbiamo ridotto al punto in cui siamo
speculando solo sui tipi per
valori utilizzati da loop interni
dove possiamo effettivamente spostarci certi
controlli fuori dal giro di conseguenza
quindi se lo speculativo è uno stinco
possiamo dimostrare che è abbastanza buono
per spostare effettivamente le cose dai loop
lo farò altrimenti proveremo a non farlo
facciamo questo abbiamo alcune idee su come
in realtà migliorare un po ‘così e se
in realtà siamo solo andati avanti e
generato ottimizzazioni speculative
su tutti i tipi che vorremmo
ottimizzare in base a e poi preso quello
risultando in codice grande ma ma
proprio come metterlo là fuori e correre
attraverso di esso e profilato e quello
ci darebbe qualche informazione in merito
come viene utilizzato il programma
allora ci permetterà di guardare effettivamente
a quale di questi metodi di salvataggio sono
anche essere chiamato lo permetterà
noi a guardare quale delle ottimizzate
messaggio che viene chiamato e
quali sono caldi così un modo pulito di
fare questo sarebbe in realtà 22
ottimizzare speculativamente tutto e
quindi ricompila con meno speculazioni
dove permetti solo speculazioni
limitazioni nei metodi che erano
in realtà sono davvero hot e in
la loro versione ottimizzata è così
qualcosa che abbiamo già implementato
perché la toolchain intorno a avere un
il passo di ottimizzazione del gadget di profilo è
tipo di complicato per i nostri utenti così e
ma sembra promettente in termini di
ottenere maggiori informazioni su ciò che il
il programma lo fa effettivamente in runtime così uno
cosa voglio dire di trattare
controllare così nel codice sì, noi allora
genereremmo questo come è una forma e
è un po ‘difficile per noi da prendere
quella forma e compilarlo anche voi
JavaScript di bell’aspetto l’esempio che ho
mostrato che spero non guardi troppo
straniero e ma in realtà è un po ‘
difficile da tradurre un grafico generico che
ha salti arbitrari tra blocchi di base
a qualcosa che somiglia a javascript
quindi quello che abbiamo fatto è in realtà che abbiamo
ho cercato di mantenere la struttura del codice da
freccia nel modulo SSA che abbiamo costruito senza problemi
troppo con esso e basta compilare quello
allo stesso JavaScript corrispondente
dichiarazioni di flusso di controllo non è il
soluzione ideale, forse, ma è così
funziona davvero molto bene ed è giusto
ci sono alcune ottimizzazioni sul
campo di controllo che non possiamo fare in questo modo
ma funziona bene per il flusso di dati in modo giusto
per darti un’idea di quello che sembra
come il tipo di posto in cui abbiamo
i problemi con questo è dove siamo
introdurre controlli nei luoghi in cui il
La sintassi JavaScript consente solo
espressioni essenzialmente così in questo caso
si dispone di un controllo di indice che si desidera
iniettare nella condizione di un ciclo for
è un po ‘difficile da fare in modo efficiente
così che ciò che finiamo per comporre anche questo
è qualcosa in cui non possiamo compilare il
per ciclo ad un ciclo for lo compiliamo a
un ciclo di tempo
con alcune pause in là per provare a
sfuggire quel confine non è così
piuttosto è il codice baker risolve il
problema in questo caso e in generale
essere in grado di compilare un ciclo for ad a
per loop e un ciclo while per un po ‘di tempo
era solo più bello quindi spero che questo
ti ha dato alcune informazioni su come
il compilatore è scritto e cosa può
ottimizzare gli asiatici che fa e ciò che noi
incentrato principalmente è in aggiunta a
è la prestazione di runtime e la correttezza
nel vero sito di codice di Victor che ha
migliorato di più dal nostro primo
rilascio e quello che stiamo vedendo in questo momento
è che piccoli esempi e in realtà fanno
compila con un piccolo pezzo di JavaScript
uscita e quindi non è più il caso
che otterrai megabyte di
JavaScript ammesso per un piccolo
ciao esempio del mondo e una cosa che
a volte vediamo se è così
le persone scrivono un’applicazione che dipende
su un sacco di librerie che tira in
attraverso le importazioni quindi se la tua applicazione
si traduce in pezzi di dimensioni considerevoli di
JavaScript potrebbe essere perché tu sei
importazione e utilizzo di molto codice di
transitivamente abbiamo ancora più lavoro da fare
fare in questa zona e continuerà a
spingere su questo, ma sta diventando molto
meglio ed è gentile ora e uno
cosa che non abbiamo implementato completamente
Eppure è il supporto per la generazione di minified
uscita che è molto comune nel
Il mondo JavaScript in cui ottieni questo
leggermente su di te skated e minified
versione di javis dell’output
questo è molto ben progettato per trans
trasmettendo attraverso il filo
essenzialmente solo una riscrittura che faccia
si abbassa sull’uso identifica
nel tuo codice e li rende piccoli e
il più breve possibile in modo da poter già utilizzare
e sperimentare ora
l’opzione minify ma dovresti aspettarti
ad cominci molto meglio nel corso
le prossime settimane e mesi quindi non lo faccio
sapere se questo è in realtà qualcosa di te
posso vedere qui dietro questo è un questo
è una diapositiva che ti mostra il nostro interno
sito di tracciamento delle prestazioni quindi questo è un
sottoinsieme del benchmark che eseguiamo e
voglio solo dimostrare che ci interessa
sulle prestazioni e le seguiamo
rintracciarlo ogni giorno se lo vuoi davvero
rendere il sistema veloce noi
per misurare le prestazioni in ogni check in
essenzialmente e lo facciamo noi
misurarci contro v8 perché noi
avere molta dimestichezza con il codice
genera e quindi quello che vedi qui è
in realtà sul giusto te
vedere per tutti i parametri che ho
elencato qui vedi quanto siamo veloci
rispetto a v8 quindi l’ultima colonna
la colonna più a destra inizia così
è quanto siamo veloci o veloci
il codice Java generatore che emettiamo
rispetto al solo JavaScript scritto a mano
codice e abbiamo ancora del lavoro da fare
siamo intorno al settantotto percento di
le prestazioni del puro codice JavaScript
ma devi pagare o tenere a mente
che questo in realtà include tutto il
controlli extra che abbiamo inserito lì
potrebbe aiutarti a prendere la tua scatola
prima che vadano in produzione, così siamo
generare codice che non è altrettanto efficiente
come JavaScript scritto a mano nativo in tutto
casi ancora, ma stiamo migliorando molto voi
può anche vedere che il dardo nativo
VM che è la penultima colonna qui
sta già facendo meglio di v8 già
e qualcosa su cui continueremo ad andare avanti
e ma è bello vederlo a causa di
l’ inizio semantico è più semplice
linguaggio per implementare in modo efficiente siamo
già ora anche prima del primo è un
il vero buio crede che abbiamo già vent’anni
percentuale più veloce di e v8 e noi
certamente si aspettano di migliorarlo
numero andando avanti quindi aspettatevi di più
il fronte delle prestazioni sempre così
le conclusioni sono molto semplici dovresti
scrivi le tue app web e dardeggia
dovrebbe essere compilato in JavaScript se tu
bisogno di una storia di compatibilità con il
browser moderni e tu puoi essere di più
produttivo se hai una buona catena di strumenti
e passa dal montaggio e un bene
compilatore per generare queste cose per
voi e potete farci preoccupare un po ‘
dell’ottimizzazione di piombo basso così tu
non devi discutere con i tuoi colleghi di lavoro
su tutti questi trucchi di basso livello e
cose di cui devi preoccuparti
JavaScript quindi l’ultima cosa è che noi
voglio davvero continuare a migliorare il web
piattaforma crediamo davvero che il web
è in
bisogno di un migliore supporto per la programmazione
nel grande e in particolare sul cellulare
vediamo che l’avvio dell’applicazione per grande
le app Web sono ancora un problema, qualcosa che noi
certamente voglio risolvere e vogliamo
darti più prevedibile e migliore
prestazioni di runtime e come già
visto che stiamo diventando molto vicino
dart2js front con JavaScript nativo
performance e sul fronte vm è
è già meglio così è stato tutto me stesso
avevo quindi sono molto molto aperto a qualsiasi tipo di
Domande che i ragazzi possono avere sulla
tecnologia o o dark ok così il primo
la domanda riguarda il debug e l’uso
le librerie javascript sono quindi in fase di debug
per prima cosa lo è anche la nostra storia di debug
davvero questo quando stai correndo con il
dardo VM è abbastanza semplice che tu abbia un
API debugger per il vm e puoi usare
è come se tu fossi in esecuzione in qualsiasi
altra soluzione nativa vm per il
generare codice javascript ciò che produciamo
è una mappa sorgente sul lato che racconta
gli strumenti di sviluppo che stai collegando
fino a dove e in sostanza ti dà
una mappatura dal retro del generatore
nel tuo codice sorgente in modo da poter fare come
unico passaggio attraverso il codice sorgente
anche se stai eseguendo il
Codice JavaScript, quindi stiamo ricevendo molto
di aiuto dal fatto che gli altri hanno
ha già generato questo mapping sorgente
formatta in modo che usiamo quello il secondo
parte della domanda era in giro
Integrazione JavaScript e a
interoperabilità con esistente
Le librerie JavaScript sono davvero difficili
problema ed è qualcosa che
abbiamo parlato molto del diverso
approcci ae e il più grande
il problema che abbiamo è davvero quello che vogliamo
qualcosa che funziona bene sul nativo
dardo VM e sulla versione tradotta
ciò si traduce in JavaScript, quindi vogliamo
una soluzione dove puoi prendere un pezzo di
Codice Java e interagire con esso nel
allo stesso modo, non importa se finisci in esecuzione
sul dardo VM o se sei in un
versione tradotta quindi cosa ci viene in mente
con finora è una sorta di modo limitato di
chiamare in modo sincrono essenzialmente
funzioni esterne lavori esterni e
poi facendo un po ‘di civiltà attraverso il
confine tra questi il JavaScript
mondo e mondo oscuro quindi significa
questo essenzialmente facendo questa integrazione
è un po ‘più ingombrante e giusto
chiamando java spunctional–
roba indietro ma dobbiamo fare un po ‘
controllandoli sul confine da fare
certo che i due mondi sono in a
formato coerente e non si ottiene un
molti puntatori per il rollback nativo di Java
testi di incorporato in tutti i tuoi dati
oggetti quindi è fattibile è un it’s
diventando sempre più facile ma è ancora
qualcosa dove ce ne vuole un mio
quantità di lavoro da integrare con quello
biblioteca esterna una cosa che ho sempre
piace chiederci che tipo di librerie
ti piacerebbe integrare con perché?
di solito c’è un sacco di cose
librerie Java molto importanti che
la gente vorrebbe davvero vedere come
jQuery e jQuery Mobile e quant’altro, ma
la lista è molto breve quindi se tu
avere qualcosa che vorresti c
integrati di cui vorrebbero sapere
e così la domanda è data che noi
chiedere a Google il controllo di v8 che abbiamo
ceduto alla tentazione di aggiungere
roba a v8 che ci permetterà di
generare meglio JavaScript e grassi e
corri più veloce su v8 sì, finora siamo noi
non ho aggiunto nulla a v8 come a
risultato delle nostre cose oscure tranne che per alcuni
mancano le ottimizzazioni per le quali abbiamo trovato
l’istanza v8 non era particolarmente brava in
occuparsi di valori a 32 bit senza segno e
ha affrontato solo 31 pozzi e abbiamo avuto
alcuni benchmark ma davvero davvero
importava quindi c’è un feedback
venendo dalla squadra oscura alla squadra v8
su cose particolari che non lo sono
esibirsi bene e in v8 come alcuni
essere un altro motore java in modo che lo facciano
opportunità di ottimizzazione ma siamo davvero
voglio solo mettere cose in v8 che
generalmente ha senso per JavaScript
programmi così il nostro stile qui è davvero
per provare a generare il codice Java che viene eseguito
bene su tutti i browser moderni e questo
non compra davvero tanto per farlo
eseguire il dieci percento più veloce e v8 da solo e
quindi finora non è stato qualcosa di simile
ha senso per noi capisco che sono io
significa che potresti essere tentato di farlo ma
non vinceremo nulla facendolo
essenzialmente e, a dire il vero, il
anche i posti in cui abbiamo mangiato sono
anche i luoghi in cui siamo più probabili
avere il dardo VM quindi non lo penso
in realtà è una pessima buona idea e
tranne per la ricerca di colli di bottiglia e
cose esistenti che possono essere prestazioni
fisso
e quindi la domanda è che consideriamo
aggiungendo un flag per far rispettare più rigorosamente
digitando per essere in grado di generare meglio
codice e quindi in realtà non abbiamo
considerato questo perché noi davvero
sentire come il dardo è una piattaforma dinamica e
volevamo davvero essere usati come
piattaforma dinamica quindi questa nozione
che non devi scrivere tipi
ovunque per ottenere un corretto e
programma efficiente è molto
importante per noi così no che non ha davvero
venire come qualcosa che volevamo
e alcune persone ci hanno chiesto se noi
volevo fidarmi forse delle annotazioni di tipo
quando sono lì per generare codice solo
basato sul tipo di notazione giusto
Supponiamo che siano corretti finora
non l’ho fatto e chiaramente in alcuni
casi che consentirebbero ai programmatori di
esprimici che certe cose sono
probabilmente è probabile che sia il numero così o
ma non l’abbiamo davvero preso
questo passo soprattutto perché è giusto
ora ci piacerebbe avere quel qualcosa in più
la pressione ci ha messo in alto
prestazioni senza cambiare il significato
delle annotazioni di tipo statico che
le persone hanno messo dentro vogliamo davvero
tieni questo come documentazione di
l’intento del programma non sono alcuni
trucco di basso livello di ottimizzazione in modo che il
la domanda è di avere un altro browser
i fornitori hanno mostrato interesse in
implementando un dardo VM e io in realtà
non so se qualcuno ha dimostrato di no
penso che abbiamo visto alcun sostegno pubblico per
il dardo VM attraverso altri browser I
penso sia ancora molto presto e il dardo
VM sta maturando come puoi vedere
la performance sta arrivando e c’è
possiamo ancora fare molto
meglio penso che sia sul nostro tavolo per provare
per dimostrare come quanto quanto
influisce su ciò che puoi costruire sul web
quando si tratta di avvio dell’applicazione e
prestazioni di punta e una volta che abbiamo che io
penso che sia la prima volta per noi
molto difficile da controllare cosa accadrà
da quel punto in avanti e ma noi di
Certo, speriamo che le persone trovino
che la tecnologia sia così avvincente e
interessante che vogliono usarlo anche
quindi la domanda è se, quando si passa
isolati che stai solo assegnando a questo
questa è la variabile del dollaro e e se
c’è qualche condivisione di codice dietro il
scene tra le diverse fessure dell’occhio così
in questo momento ce ne sono in realtà due
diverse versioni di creare un occhio
taglia o stai facendo funzionare la tua deposizione delle uova
altri occhi che in base al proprio
codice sorgente nel qual caso facciamo il codice
compartecipazione
e ma la vostra è anche possibile per deporre le uova
e io taglio da un URI dove non lo fai
sapere che cosa la tua deposizione delle uova nel qual caso noi
in realtà non proviamo a fare alcun codice
condividendo quindi è in realtà fino al
programma per richiedere uno o l’altro e
e chiaramente se si sta generando in base a
il tuo codice sorgente lo rende perfetto
senso di fare più code sharing e lì
non ci sono versioni strane in conflitti
può sorgere perché sai che sei
garantito che sia in esecuzione la stessa fonte
codice quindi è un bel posto dove stare e
questo è il posto dove la gente di solito
finiscono per essere quando vogliono solo usare
isolati per la loro applicazione
in più pezzi, ma anche in entrambi
ottenere alcuni dei benefici per la sicurezza o
è appena trapelato un po ‘incoraggiato
benefici di avere così effettivamente ciò che noi
facciamo è un bel piccolo oggetto che
è in realtà creato tramite un JavaScript
funzione che ha tonnellate di proprietà così
usiamo solo lo stesso costruttore per
creando il prossimo così essenzialmente
è un oggetto JavaScript che ce l’ha
sembra più o meno come se avessi un Java
classe così solo una volta per istanziare
ogni volta che scivolo è abbastanza leggero
in quel modo e l’idea è che noi
voglio permettere alle persone di eseguirle
come web worker o meno a seconda di cosa
hanno davvero bisogno a volte se ne hanno
una necessità per l’accesso Dom da più occhi
fessure e l’unica cosa che guadagni davvero
da aver moltiplica è questo
presentando la tua domanda in più
pezzi e anche tu guadagni l’an
essenzialmente uno spazio dei nomi globale in più
per tutto lo stato statico si ottiene un nuovo
copia di tutto ciò che è statico
le variabili sono semplicemente divise in questo modo
va bene per alcune cose che penso che abbiamo
tempo per un’altra domanda, ma penso
stiamo finendo il tempo sì, uno di più
domanda quindi la domanda è che abbiamo
librerie per l’accesso al ghiaccio Dom API
e poi database e cose simili
che così chiaramente queste cose stanno vivendo
costruito mentre parliamo dal lato server
ci sono molti diversi database che
puoi accedere e ne abbiamo alcuni
interfaccia per alcuni di loro costruita da
persone nella comunità oscura sul quando
incorporato nel browser abbiamo il
la gamma completa di dom ed e HTML è
disponibile per noi e abbiamo accesso a
loro attraverso la libreria HTML del dardo del colon
che è solo un modo semplice per te
scrivere il codice che accede al dom attraverso
dard quindi sì, c’è pieno supporto per
così
questo vale per tutti gli indici DBS e tutti
quelle cose che sono nel browser così
stiamo cercando di limitare il tuo accesso a
l’ ap basato su Dom è che vogliamo solo volerlo
dargli un nuovo linguaggio più sano
scrivere in quello ed essere ancora in grado di farlo
usa la tecnologia Browse così siamo
a corto di tempo grazie mille per
passare del tempo con me oggi e loro
spero di vedere più di voi qui per il
per i restanti discorsi in un Java
sottrarre
tu
Please follow and like us: