
okay, quindi questa discussione è tecnica approfondita
immergiti nel modo in cui abbiamo effettivamente implementato
la caratteristica di aggiungere lambdas a Java così
questa non è una sorta di panoramica della lingua
questo sai che questo è molto di più
un’esplorazione di ciò che siamo
implementare o implementare le scelte che cosa
le scelte abbiamo valutato e rifiutato cosa
le scelte che alla fine abbiamo preso per dare
hai un senso di come sono queste cose
effettivamente costruito così in un certo senso questo
parlare è per lo più inutile perché come
programmatori stiamo solo andando usare questi
caratteristiche in cui siamo conosci pochissime
di noi o li realizzeremo davvero
ma mi piace sempre sapere come vanno le cose
Lavoro e penso che molti di noi farlo questo
è principalmente per darti un’idea di cosa sia
andando agli strati ne conosci uno o
due strati sotto il codice che
stai scrivendo bene, quindi lavoro per Oracle
quindi sono obbligato a mostrarti questo legale
disclaimer slide and going on okay so
discorsi altamente tecnici si spera un po ‘di
hai una certa dimestichezza con JVM e
e codice byte Java quante persone qui
ho usato lo strumento pipì Java per scaricare
codice byte va bene per il terzo forse va bene così
se non lo hai e hai un laptop
in questo momento potresti voler provarlo così
Java P è un dumper bytecode
quindi il compilatore java c accetta java
il codice sorgente in scrive i file di classe Java
i file di classe Java utilizzano a
architettura neutrale intermedia
rappresentazione chiamata bytecode Java
che poi la VM traduce in nativo
codice in fase di esecuzione, quindi se vuoi sapere
quale bytecode conosci la fonte data
costrutti che conosci corrispondono a o
cosa c’è in un file di classe Java java p è un
buon strumento per imparare che così sto andando
visualizzare un codice byte io sono anche
andando a parlare di alcuni dei
strutture aggiunte in Java 7
specificamente maniglie del metodo e
invokedynamic
che ancora non è qualcosa che nessuno
chi non sta implementando le lingue lo è
intenzione di usare, ma ancora bene a sapersi
A proposito solo per capire cosa sta succedendo
va bene quindi farò un ultra veloce
panoramica
delle funzionalità che abbiamo aggiunto a Java
sette solo così puoi vedere cosa sono
il codice sorgente sembra come sto assumendo
tutti in questa stanza sono piuttosto buoni
idea di cosa sia l’ espressione lambda
la loro lingua preferita , quindi non ho
essere lavoro belabor questo lambda
espressione è nel contesto di Java è
un metodo anonimo ha tutto a
metodo ha ha una lista di argomenti che
ha un corpo ha un tipo di ritorno ha un
serie di eccezioni generate ma abbiamo
compresso via la maggior parte della sintassi
boilerplate è sai farcela
qualcosa che sai molto più piccolo così
ecco alcuni esempi di lamin
espressioni nel primo abbiamo un
argomento prende un argomento è a
la persona che il corpo prende quella persona
il loro nome li aggiunge a qualche elenco di
chiama il tipo manifest sul o sul
gli argomenti possono essere omessi se il
il compilatore è in grado di dedurlo così nel
contesto di una frase come la gente punto
per ognuno e stai passando qualcosa
che prende una persona e restituisce il nulla
compilare è in grado di dire oh bene lo so
è una persona perché cos’altro potrebbe
essere e ho il compilatore non può dedurre
per te avrai un tempo di compilazione
messaggio di errore quindi potrebbe sembrare un po ‘
un po ‘ come la digitazione dinamica in realtà
la stessa tipizzazione statica che Java ha sempre
avuto solo con meno meno caldaia e
le espressioni lambda possono acquisire valori
dal contesto che racchiude così in questo
ultima espressione minima età è definita
fuori dal lambda e così è
considerato un valore catturato okay non tutto
Lambda sta catturando ma tu sai
la cattura si adatta in gran parte al
schema di traduzione quindi avrò un paio
di esempi di questo così un pò di
sfondo di te sai perché è così
stiamo facendo questo in primo luogo che si
sapere perché preoccuparsi di aggiungere lambda a Java I
ne ho parlato un po ‘ su questo nel mio
Parliamo stamattina un paio di coppia
dei motivi principali il più importante di
che sta fornendo un percorso verso la costruzione
librerie multi-core amichevoli quindi se tu
voglio costruire parallel friendly
librerie devi avere un modo di
esprimendo il codice come dati così
che puoi dire qui fai questo per ogni
elemento della collezione e lavori
fuori i dettagli del parallelismo
la sua decomposizione ecc. molte altre
ragioni per cui vogliamo potenziare la biblioteca
gli sviluppatori di scrivere le migliori librerie noi
vuoi stare al passo o raggiungere il
competizione e tu sai che abbiamo avuto un
strumento per questo sotto forma di inter
lezioni per molto tempo ma è solo
troppo goffo e sai non non adatto
quindi quello che stiamo andando concentrarsi su in questo
parlare è la domanda di runtime
rappresentazione di come rappresentiamo lambda
espressioni in fase di esecuzione che cosa sembra
come nel bytecode, a cosa assomiglia
durante l’esecuzione e sai quanto
rappresentazione runtime è un
anche i dettagli di implementazione lo sono
importante lo sai da una parte sì
dovremmo progettare la lingua per stare in piedi
da solo, ma si desidera che venga eseguito
in modo efficiente anche sulla JVM e se
c’è una discrepanza tra come le cose
sono rappresentati a livello di lingua
e avere il rappresentante il livello VM
questo sarà il dolore continuo per
i tuoi utenti quindi vogliamo mantenere il
linguaggio vista del mondo e il
la visualizzazione runtime del mondo è allineata come
pratico e questo è qualcosa che paga
dividendi ok così grande numero di domanda
uno quando aggiungi un nuovo tipo di
l’espressione in una lingua è se lo hai
ha un linguaggio tipizzato staticamente come
Giava
qual è il suo tipo cosa, quindi qual è il tipo
di una lingua di un’espressione lambda
la maggior parte delle lingue che hanno lambda hanno un
nozione di funzione tipo funzione da
int lungo così presto le proposte per l’aggiunta
lambda java ha detto bene, aggiungiamo
tipi di funzione di Java e questo sembra
come un’idea ovvia ma quando inizi
scavando si finisce con un sacco di brutto
domande o rappresentazione circostante
quindi come sarà il
bytecode che cosa è andare a guardare come in
una firma del metodo nel bytecode così
Java è collegato dinamicamente quando tu
invoca il metodo che seleziona tra i
sovraccarichi e in realtà prende il
firma di quel metodo il metodo
chiamato foo che ha argomenti int e
lungo e attacca quello nel file di classe
quindi se se stiamo andando a
si sa quindi dobbiamo trovare un modo per
rappresenta il lambda in un tipo di VM
firma in modo simile come invochiamo a
lambda dobbiamo avere un byte speciale
codice che conosci per averlo invocato come fa
creiamo istanze di loro facciamo
che con un nuovo codice bici o con un nuovo
codice a spillo codice bici chiamato nuovo che è
nel vecchio modo dobbiamo inventare un nuovo
strada verso la nuova non ho pensato molto a questo
attentamente ok
spostarsi sul sistema del tipo di linguaggio Java
ha varianti del sistema di tipo runtime
non è quello che sta per entrare nel
rappresentazione runtime quindi tutti questi
le domande sorgono quando sai una volta
superare l’ Oh, aggiungeremo solo la funzione
digita in Java
così come molti di voi hanno alcuni di voi
probabilmente ho sentito che mi piace questo trucco di
prendendo una domanda irragionevole e
facendolo sembrare ragionevole, dicendo perché
non solo di fronte , quindi lo sai
la gente ha chiesto bene perché non aggiungere e basta
tipi di funzioni bene perchè è più difficile di
sembra che la JVM non abbia un nativo
rappresentazione di un tipo di funzione quindi noi
dovrei inventarne uno o dovremmo farlo
insegnare alla JVM qualcosa di nuovo
lo strumento più vicino che abbiamo che potrebbe
rappresentano i tipi di funzione che conosci
la funzione da tdu è abbastanza facilmente
generici ma che porterebbe con sé a
molto del dolore dei generici come la boxe
e cancellazione e tipi di funzione boxed o
cancellare i tipi di funzione potrebbe davvero puzzare
quindi per esempio se avessimo un tipo generico
funzione funzione da TD tu te
non sarebbe in grado di sovraccaricare due metodi
che ha preso funzioni anche se i loro tipi
sono completamente diversi quindi potresti
scrivere un sovraccarico di funzione da
stringa per terminare e funzionare da lungo a
doppio e poi il compilatore direbbe
non puoi farlo, questi hanno lo stesso
cancellino e dirai cosa non sembra
a tutti piace la stessa cancellazione così noi
pensavo che sarebbe stata una cosa cattiva da fare
alle persone e non volevamo farlo
e quindi questo è uno di quei posti dove
ci sarebbe un divario tra il
rappresentazione linguistica e lì e
la rappresentazione VM e questo è sempre
il punto dolente in modo da poter insegnare la VM
sui tipi di funzione reali ma questo lo farebbe
essere un enorme sforzo che potrebbe interessare
le firme influirebbero sui codici della bicicletta
influenzerebbe le regole di verifica in questo modo
sai sarebbe un grosso problema quindi
cerchiamo il cast in giro
alternative perché questo era molto
lavoro e siamo pigri così storicamente in
Codice Java con funzioni modello che ne utilizzano uno
il metodo interfaccia cose come eseguibili
o comparatore e sai che abbiamo pensato
bene, piuttosto che aggiungere un nuovo tipo
di tipo al sistema di tipo e di noi
ho appena formalizzato questa nozione di a
la funzione è rappresentata da un unico metodo
interfaccia così abbiamo preso questo modello e
gli diede un nome interfaccia funzionale e
boom abbiamo finito questo è il nostro
tipo di funzione quindi il modo in cui il
il linguaggio funziona è un’interfaccia funzionale
come il predicato qui è isomorfo a a
funzione che accetta t restituisce a
booleano in modo che il compilatore guardi
predicates e dice va bene che è un
interfaccia ma potrebbe anche essere un
funzione se fosse una funzione che sarebbe
sii dalla t tubulin e poi quando vedi
un metodo come lo sai rimuovere se di chi
argomento è un predicato di t it e
qualcuno fornisce un’espressione lambda come
gli argomenti che il metodo dice tutto
bene, sono disposto a convertire questo
espressione lambda a uno di questi
funzioni nominali vediamo se il se
le forme si combinano hanno il
stesso numero di argomenti o loro
i tipi di argomenti compatibili sono il rendimento
tipi compatibili ci sono eccezioni
compatibile e se sono quindi il
il compilatore dice va bene che prenderò questo
espressione lambda che prende una persona
e restituisce un booleano e lo farò
convertilo in un predicato di una persona
fatto e ora se lo facciamo il
le firme sembrano firme Java
che abbiamo sempre avuto loro questi
tipi nominali in loro invocazione
sembra l’invocazione che abbiamo sempre
aveva così sembra un po ‘più semplice
modo di farlo in modo tale da sapere
ci sono molti più dettagli in questa storia
di quello che so tu che esprimi su due
scivola ma è il punto da asporto
basta aggiungere i tipi di funzione era ovvio e
sbagliato
sarebbe stato complesso
introdotto casi angolari che avrebbe
utenti esposti a più del dolore di
cancellatura
che è bello avrebbe anche avuto il
effetto di biforcare completamente il
mondo delle librerie Java perché ora lo faremmo
avere vecchie librerie e nuove librerie e
come ti ricordi il dolore che siamo andati
attraverso quando avevamo librerie generiche
e le librerie non generiche anche se
erano interoperabili giusto e li
era come un periodo di cinque anni dove
c’era tutto questo churn sui generi
le librerie di fieri bene non vogliamo
farlo di nuovo e in modo che non vogliamo
creare questa divisione tra vecchio e nuovo
librerie così usando un vecchio meccanismo
evitiamo quel problema e come bonus
librerie esistenti che sono state progettate
anni prima lambda tutto ad un tratto
compatibile con lambda finchè
usano questo modello così tanto
le librerie usano già così meno nuove
concetti mantiene investimenti in
librerie esistenti a volte conosciute a
un vecchio approccio noioso è meglio di un
nuovo splendente ok, quindi guardiamo
un’altra domanda che abbiamo tipo
calati mentre progettiamo questa funzione
come viene creata un’istanza lambda
cos’è questa rappresentazione runtime?
come se avessi saputo che aveva un in questo
esempio qui abbiamo un’espressione lambda
a destra è una funzione da persona
a boolean abbiamo sul lato sinistro
lo stiamo assegnando a un predicato di
persona che è moralmente una funzione da
persona da booleana così vede il compilatore
questo codice deve produrre qualche byte
codice quindi quale codice luminoso dovrebbe
produrre così c’è un altro ovvio
la soluzione qui fa girare una classe interiore
giusto così le classi interne hanno fatto questo
per un po ‘potremmo dire un lambda
è un’istanza di classe interna e il
il compilatore genererebbe una classe interna
come questo che da quando cattura a
variabile deve avere una sensazione che ha
avere un costruttore che si inizializza
quel campo e poi il corpo fa il
cosa ovvia compilatore completamente semplice
conosci l’operazione e potremmo avere noi
avrebbe potuto essere fatto in una settimana un sacco di
la gente pensava che dovremmo essere fatti in un
settimana ma tu conosci la cosa bella
questa è la cattura lambda che si traduce molto
semplicemente invocando il
costruttore di questa classe interiore quindi il
il compilatore che conosci genera questo interno
classe che genera per l’ istanziazione
di lambda
solo un’invocazione al dollaro alimentare
un costruttore e abbiamo finito e poi
invocando lo sai il costruttore
si traduce in alcuni molto semplici
bytecode quindi cosa stiamo facendo qui noi
istanziare un ed e un oggetto di classe
Per un dollaro noi spingiamo il catturato
variabile sullo stack invochiamo il
costruttore e quindi con il riferimento
a quella nuova cosa ancora in pila noi
appena passato quello direttamente per rimuovere F così
molto semplice molto discreto nel
modo il compilatore genera bytecode
oggi va bene, ovviamente, ho paura
Citazioni intorno solo perché non l’abbiamo fatto
in questo modo bene in una classe fa schifo e
traducendo in classi interne dietro il
le scene ereditano molti dei loro problemi
con il bonus aggiuntivo che non l’hai fatto
anche chiedere una classe interiore così ora tu
avere il dolore delle classi interne senza
averne chiesto uno e questo è quello
tipo di pessimo quindi quali sono alcuni dei
problemi delle classi interne
bene le prestazioni stiamo generando a
classe per ogni espressione lambda si dispone di un
moltissime implementazioni di tipi
come runnable che significa che ottieni
megamorfosi o chiamata siti che è un
problema di prestazioni in fase di esecuzione e
stai sempre assegnando una nuova istanza
anche quando le istanze sono logicamente
equivalente quindi anche se un lambda cattura
nulla di una classe interiore sarebbe ancora
creare un’istanza di una nuova istanza e come
a volte ci sorta di farlo a mano a
il nostro codice giusto se si dispone di un comparatore
quello non sta catturando niente che tu sappia io
spostalo in cima alla tua classe
dì che conosci la finale statica privata
il comparatore C è uguale e tu lo fai tu
conosci una volta e poi lo passi e basta
ma è un po ‘come rovinare il tuo
codice per motivi di prestazioni che vorremmo
per non mettere le persone in quella situazione
e anche la regola sulle regole
la ricerca di nomi nelle classi interne è davvero
brutto e volevamo evitare di esporre
la gente a che così la cosa importante da
riconoscere è qualsiasi codice di byte il
il compilatore genera il primo giorno
Java ha lambdas è il binario
rappresentazione per lambda fino a te
conoscere la morte termica dell’universo così
sai che vogliamo scegliere
rappresentazione molto attentamente e
idealmente quella rappresentazione binaria con
la scelta dell’implementazione a cui siamo capitati
hanno fatto quando stavamo scrivendo il
compilatore perché quello che ci costringe
abbastanza terribilmente, quindi penso che sia così
un altro di quelli ovvi ma sbagliati
le scelte quindi diamo un’occhiata ad altre
opzioni in Java 7 abbiamo aggiunto una funzionalità
chiamato metodo gestisce per la VM ora questo
è una funzionalità di basso livello che è stata progettata
è davvero un kit di strumenti per il compilatore
scrittori ma l’idea è che sia come
riflessione ma in realtà è veloce così tu
può memorizzare un riferimento a un metodo in a
metodo di gestire è possibile mettere quei metodo
maniglie nella piscina costante e carico
li come costanti e la VM lo fa
molto velocemente puoi ottenere un metodo
gestire per qualsiasi metodo o qualsiasi costruttore
o qualsiasi campo indietro sesor e la VM
capisce il metodo gestisce così felicemente
in linee attraverso di loro e fornisce
sei un’API per manipolare la matematica e
gestisce come aggiungere argomenti e
rimuovere argomenti e adattarsi
argomenti con il pugilato o unboxing o
casting o what-have-you
quindi sai che fondamentalmente è un compilatore
scrittore coltellino svizzero
quindi questo sembra un altro di quelli
scelte ovvie I lambda sono una lingua
metodo di metodo a livello costante gestisce a
Costante del metodo VM come potrebbe questo
non funziona quindi potremmo usare le maniglie del metodo
come la nostra tecnica di implementazione che
significherebbe che dovremmo differire il
corpo di un’espressione lambda in a
metodo che è facile da fare e quindi
rappresentano i lambda usando il metodo
maniglie e firma del codice byte e
è lì che le cose iniziano a cadere a pezzi
ok ecco come lo farebbe il compilatore
traduci le cose se abbiamo l’esatto
stesso codice di prima quindi direi prendere
il corpo in questa lambda D lo zucchererà
un metodo qui lo abbiamo chiamato lambda
dollaro uno diamo un argomento in più
che è il catturato
età minima che arriva dal
contesto esterno e ovviamente il
argomenti l’ espressione lambda il
la persona e il corpo lo valuta appena
e poi quando andiamo a
generare codice per l’acquisizione e
l’invocazione che tutto ciò che facciamo è dire bene
dammi un metodo di impugnatura per discernere
metodo e poi riponi questo extra
argomento su di esso a metà età e poi solo
passare quello per rimuovere in caso affermativo la firma
di rimuovere se sarebbe rimuovere se metodo
gestire bene questo è un tipo di problema
perché le maniglie del metodo sono efficaci
cancellato giusto c’è solo un metodo
gestire il tipo non c’è l’handle del metodo
per la funzione da Int a Long c’è
metodo di gestire quindi questo è come super
gomma è così per un sicuro succhia questo è
anche peggio non saremmo in grado di
sovraccaricare due metodi che prendono anche
Lambda di forma diversa o diversa
arity lambda e avremmo ancora bisogno
per codificare il tipo di livello di lingua
informazioni nel file di classe da qualche parte
anche se non è codificato nel
bytecode quindi questo soffre dello stesso
problema come l’ ultimo ovvio ma sbagliato
scelta perché ci vuole un
tecnica di implementazione e it
confonde la nostra rappresentazione binaria con
quella scelta della tecnica di implementazione
quindi, ancora una bella idea, ma non lo fa abbastanza
quello che vogliamo quindi so che questo lo sai
solo preso come 20 minuti finora abbiamo
appena descritto un periodo di sei
mesi di battere la testa contro
varie opzioni okay, quindi cosa abbiamo?
imparato qui quello che vorremmo è un binario
rappresentazione che non è legato al
implementazione specifica sicuramente noi
non voglio portare con noi il bagaglio
di inter classi e anche noi non vogliamo
portare con noi il basso livello di Ness e
cancellazione di maniglie del metodo e noi no
voglio scegliere qualcosa che stiamo andando
voglio cambiare perché non vogliamo
mai dire ai nostri utenti oh sì, c’è un
nuova versione di Java là fuori ed è
molto più veloce ma si
ricompilare tutto il codice non lo facciamo
non vogliamo che gli utenti non lo facciano
così lo abbiamo preso come un
requisito non possiamo chiedere agli utenti di
ricompilare solo per ottenere di più per il
prestazioni aggiuntive che potremmo
avere in una versione futura del JDK così
ovviamente la soluzione a tutti i problemi
di informatica è più indiretta
e la sfida è: come lo facciamo
in modo che ulteriore interazione in
la direzione non ci danneggia le prestazioni
per quanto riguarda la teoria, il compilatore potrebbe
non emettere codice per costruire il lambda
ma qualcosa di più come un dichiarativo
ricetta per come realizzare questo lambda e
il runtime eseguirà quella ricetta
usando tutti gli strumenti che ha deciso al
il tempo era il migliore, forse il martedì
sarebbe nelle nostre classi e via
Giovedì che il metodo gestisce ma noi
non importa perché ora è un puro
dettagli di implementazione finché è
veloce deve essere veloce quindi per questo noi
passare a un’altra caratteristica VM che era
aggiunto in Java 7 nuovamente non una funzionalità per
utenti, ma una funzionalità per gli scrittori di compilatori
chiamato invokedynamic
quindi fammi parlare un po ‘di
invokedynamic
quindi prima di Java 7 c’erano 4 invocazioni
modalità per diversi codici byte per
invocando metodi sono stati invocati staticamente
invoca l’interfaccia invoca virtuale e
invocare speciali e corrispondono
abbastanza semplice a Java
situazioni linguistiche una è per statica
i metodi uno è per i metodi di interfaccia uno
è per i metodi virtuali e quindi uno è
perché tutto il resto invoca uno speciale
ti gestisce chiamate del costruttore e
super chiamate e metodi privati e tutti
le cose che non rientrano esattamente in
uno degli altri tre secchi e noi
ho visto esempi di due di questi nel
rappresentazione bytecode per l’interno
la classe che abbiamo usato invoca speciali da invocare
il costruttore di cibo dollaro uno e
quindi usiamo per invocare l’interfaccia a
invocare il metodo di rimozione in modo Java 7
aggiunto uno nuovo invocare dinamico e noi
abbrevia questo per indie ed è
diverso dall’altra invocazione
modalità che hanno le altre modalità di chiamata
molto fisso e invocazione simile a Java
semantica, ma ci rendiamo conto che non tutti
le lingue sono come Java e non tutte
le lingue vogliono che l’invocazione JVM funzioni
il modo in cui l’invocazione funziona in Java e così via
l’ idea di base dietro invocare la dinamica è
lascia il runtime della lingua e la VM
essere partner e decisioni di collegamento ma
fornisce anche sapere in modo che fornisce un
modo per una logica specifica della lingua a
aiutare la VM a risolvere una chiamata di metodo
e poi togliti di mezzo per non farlo
devi chiamare nella lingua
runtime su è come lo facciamo velocemente
quindi sai che potresti farti sapere
Codice JRuby che fornisce JRuby specifico
logica linkit : il codice lo informa
Logica di collegamento specifico per Python e
alla fine ciò si riduce a uno dei
vecchie modalità di chiamata che la macchina virtuale già
sa come inline attraverso una volta il
risoluzione è fatto in modo tale iniziato
come strumento per le lingue dinamiche dove
la lingua non aveva tutto il tipo
informazioni disponibili su Java JVM
firme necessarie per essere in grado di
fare di un metodo di chiamata così come un
esempio come qui c’è del codice in Ruby
dove dici che ho un metodo ADD
due argomenti a e B e il suo corpo è a
più B ma poiché non conosciamo i tipi
di A e B non sappiamo cosa più
significa davvero che potrebbero essere due numeri interi
potrebbero essere due galleggianti potrebbero essere due stringhe
quindi non conosciamo i tipi di a e B a
compilare il tempo li conosciamo in fase di esecuzione
i tipi possono cambiare da una chiamata all’altra ma
la realtà è che di solito non lo fanno se io
chiama questo metodo e poi lo chiamo
ancora una volta non c’è una buona possibilità che
Avrò lo stesso tipo nel mio
argomenti come ho fatto l’ultima volta perché
chiamiamo cose e loop proprio così tu
avere un ciclo che sta scorrendo
un array e stai chiamando questo metodo
sai più volte che voglio essere
in grado di riutilizzare le decisioni di collegamento senza
dover percorrere il lento cammino di
qual è il tipo di un qual è il tipo di
B fammi vedere nella mia tabella delle funzioni
il metodo più che corrisponde a
questi due tipi in modo da poter ovviamente
fare con questo con un riflesso ma è
davvero lento e quindi conosci la chiave qui
è che vogliamo evitare essere il collegamento in
chiamare il sito incorporando informazioni su
quando quando consulta il
logica legame specifico della lingua che dice
ecco la cosa da chiamare e qui sono
le condizioni in cui puoi semplicemente
riutilizzare questa decisione senza dover
tornare indietro e ricalcolare il collegamento
bersaglio
e una volta che la VM lo fa , allora è in grado
inline attraverso il sai il the
chiamata invocalamica proprio come qualsiasi cosa
altro
X è il ci sono più fasi per a
dato invoca il lato di chiamata dinamico il primo
volta che si richiama un determinato sito chiamata ha
fare qualche costoso collegamento one-time
lavora così consulta questa logica linguistica
che chiamiamo il metodo bootstrap e
Farà del lavoro che farà
alcune occhiate forse ne spenderanno alcune
le classi farà tutto quello che è
lo farò ma viene fatto solo una volta e
quindi restituisce un sito di chiamata di collegamento che
incorpora qui il tuo target di collegamento e
ecco le condizioni in cui tu
potrebbe dover ricollegare e da allora in poi se
quelle condizioni che conosci o non sei tu
non sono presenti regali che la VM non deve mai
consulta nuovamente il metodo di bootstrap
in seguito la VM può trattare la chiamata
lato come completamente collegato e quindi
inline attraverso proprio come qualsiasi altro
lato invito quindi è abbastanza piuttosto fresco
strumento che ti permette di fare un po ‘di tempo
lavorare e poi riutilizzare quella decisione e
questo è quello che abbiamo finito per usare nel nostro
traduzione di lambda anche se Java
questo è un linguaggio tipizzato staticamente
teoricamente uno strumento per dinamicamente
lingue digitato ma si sa perché dovrebbe
hanno tutto il divertimento quindi se guardi
ciò che è nel bytecode aggiungere e richiamare
sito di chiamata dinamico non c’è praticamente
tre gruppi di operandi il primo
è il bootstrap di collegamento che
contiene il tuo link specifico per la lingua
la logica che viene chiamata una volta non viene mai chiamata
di nuovo c’è anche un argomento dinamico
lista che viene semplicemente messa in pila
come qualsiasi altra istruzione di invocazione
e poi c’è un’altra lista di argomenti
la lista di argomenti statici che è
costanti che escono dalla costante
pool e questa è la lista degli argomenti
questo è passato al metodo bootstrap
e cattura le cose sulla chiamata
sito come i tipi di argomenti e
cose che il compilatore conosce
staticamente
così come ho detto che il lavoro è tipizzato in modo statico
linguaggio tutti i tipi coinvolti sono
statico quindi non stiamo usando la dinamica
caratteristica reale incas sto invocando dinamico
ma ciò che è dinamico qui è il nostro codice
strategia di generazione abbiamo delineato due codici
strategie di generazione prima dello spin an
classe interiore o utilizzare un metodo di gestire lì
sono anche altri si sa che potremmo usare
proxy dinamici se volessimo il nostro codice
essere molto lento o forse stiamo correndo
alcune VM che hanno un livello veramente basso
metodo per lo sai oggetti out edificio
di voi conoscete pezzi puri e alchimia e
tale che vogliamo usarlo per fare
i nostri lambda invece di voi conoscono il
altro meccanismo quindi abbiamo questi vari
strategie di implementazione e questo è
ciò che è dinamico vogliamo dinamicamente
scegli tra quelle traduzioni
strategie e invocano la dinamica ci dà
la possibilità di trasformare questa scelta in a
puro dettaglio di implementazione runtime
che è completamente separata dalla
rappresentazione binaria, quindi è davvero
bel trucco e ti farò sapere mostrarti
più di come sembra così il concetto è
nel bytecode per cui incorporiamo una ricetta
costruendo una lambda quindi cosa va a finire
quella ricetta bene abbiamo bisogno di sapere il
corpo di quella lambda, quindi lo faremo
la stessa cosa che abbiamo fatto nel metodo
gestire il caso di traduzione in cui noi
distribuire al corpo lambda un metodo
e usiamo un handle di metodo per rappresentare
quel metodo abbiamo bisogno di conoscere l’obiettivo
scrivi di che tipo è questo essere lambda
convertito negli esempi che abbiamo mostrato
finora è stato predicato così è
una delle cose che quella
metodo di bootstrap ha bisogno di sapere e poi
potrebbero esserci ulteriori metadati su
il sito di chiamata come devo fare
fare cose speciali per la sterilizzazione o
irrigare le variabili che vengono catturate
dallo scopo lessicale perché quelli sono
sarà necessario quando si costruisce il
lambda quindi questo rappresentiamo questo utilizzando
invochiamo un sito di chiamata dinamico che chiamiamo questo
la fabbrica lambda quindi l’idea sei tu
invocare questo sito di chiamata dinamico e invocare
ti restituisce il lambda che vuoi
alcuni degli argomenti alla chiamata al
le factory sono statiche e sono codificate
nella piscina costante
alcuni di loro sono dinamici sono
spinto in pila e poi la VM
fallo
il caso che le successive indicazioni di
lo stesso sito di fabbrica in altre parole
successivamente cattura lo stesso lambda tu
bypassare il percorso di collegamento lento così bene
diamo un’occhiata a ciò che il compilatore fa
il primo passo è D zuccherare il corpo lambda in
un metodo come prima, così qui abbiamo
questo metodo lambda dollaro uno ha il
argomento persona P ha il catturato
argomento min age così è facile
trasformazione molto semplice e
generalmente possiamo tradurre questo in a
metodo statico se si tratta di un metodo che
cattura il ricevitore perché tocca
un metodo o un altro membro della classe invoca
uno dei metodi di classe quindi noi
non sono d’accordo sul metodo di istanza e quindi su
il sito in cui vogliamo catturare il
lambda invochiamo e invochiamo che emettiamo
invocare istruzioni dinamiche dove diciamo
il bootstrap è questo speciale Java
metodo logico della lingua runtime
chiamato la fabbrica di meta Lambda il
argomenti statici sono acque mie
tipo di conversione il mio obiettivo di conversione
qui predicate e dov’è il mio
implementazione qui lambda dollar one
e gli argomenti dinamici sono il min
l’età che ho catturato dal contesto
quindi invoco questa vista vista che mi consegna
indietro il lambda voglio che sia di tipo
predicato e poi l’ho appena passato
rimuovere F okay , la cosa bella è la
stiamo usando questa rappresentazione nominale
di funzioni la firma della stanza di F
è solo un predicato della cattura lambda
crea un predicato che abbiamo appena passato
va bene così il codice generato è
in realtà piuttosto semplice se tu
usa Java P puoi vedere tutto il
roba invocastinamica nel pool costante
e tu sai che non abbiamo dovuto distorcere
la traduzione è molto importante
è abbastanza buono
quindi ora abbiamo questo tu sai questa cosa
chiamiamo meta Factory the the the
metodo di bootstrap per questi lambda
catturare siti potrebbe fare qualsiasi cosa
vuole che possa generarlo nella sua classe
spendi dinamicamente la classe in fase di runtime
usando Azzam oh e poi sarebbe giusto
collega il sito di chiamata al costruttore
ma quello ha generato la classe
questa è in realtà la strategia iniziale
che abbiamo implementato ma questo è solo il
versione uno strategia in modo da sapere nel
futuro potremmo fare qualcosa di simile
invece di girare una classe per lambda
potremmo girare una classe per funzionale
tipo di interfaccia di tipo wrapper per
eseguire una sola classe wrapper per
comparatore ecc e basta passare un metodo
gestire al suo al suo costruttore e
lo faremo non appena siamo sicuri che
la performance di questo è migliore e
è qualcosa che non dobbiamo
fare in un importante aggiornamento di Java che potremmo fare
e tu conosci otto punti zero punto uno
perché è solo un’implementazione
dettaglio potremmo anche usarne altri
tecniche come proxy dinamico è o
metodo gestire i proxy o VM private
api o ogni volta che possiamo fare per farlo
traduzione il più velocemente possibile
quindi, ciò che ha usato invocare la dinamica ci ha dato
ecco l’opzione per rinviare il
scelta della strategia di generazione del codice per
runtime e quindi diventa un puro
implementazione dettaglio qualcosa che noi
può cambiare da versione a versione da
giorno per giorno ci sistemiamo sul nostro binario
il protocollo ora che è qui è l’API
per questo bootstrap dinamico invocato ma noi
non hanno bruciato la scelta di
strategia di attuazione nel
bytecode quindi questo è un classico trucco Java
di spostare più del lavoro da statico
tempo di compilazione al runtime dinamico quando
hai più informazioni, se tu
avere più informazioni che puoi fare
decisioni migliori
la ragione per la compilazione dinamica sempre
spazza via la compilazione statica sei tu
avere più informazioni in fase di esecuzione di
lo fai staticamente e questo ci dà il
flessibilità per cambiare il nostro codice
strategia di generazione ogni volta che arriviamo
con uno migliore ma aspetta c’è di più
questo comportamento che invoca dinamico ha
dove la prima volta attraverso il tuo link
il sito di chiamata e quindi i tempi futuri
attraverso di essa ignora quello che ci dà
praticamente gratis quel trucco ero solo
descrivendo dove prendi inter-classe
e tu lo nascondi in un campo statico
conoscere il comparatore statico finale pubblico C
equivale a conoscere il nuovo blah blah blah
trucco che eravamo abituati a fare a mano
ridurre il numero di allocazioni nostre
codice ora il runtime fa proprio per te
gratuito
quindi se hai un lambda che non lo fa
catturare qualsiasi cosa e un sacco di lambda
sono così che conosci X arrow X plus 2
o qualcosa del genere è il compilatore
andando dire che questo è un senza stato uno lambda
l’istanza è buona quanto un’altra
non hanno identità specifiche
caratteristiche così la prima volta
catturarne uno che sto per nascondere alla chiamata
sito e poi da lì in poi sto solo andando
restituire quello stesso e il VM sta per
riconoscere questo questo modello e girare
lambda Cattura in un carico costante così
questo rende nel caso abbastanza comune di
Lambda senza stato lambda cattura molto
molto più veloce delle sue classi perché
non stai assegnando non stai andando
al mucchio ecc. quindi in questo caso puoi farlo
pensa a invokedynamic
come se fosse una cache inizializzata pigramente
ritarda l’inizializzazione al primo utilizzo
quindi l’overhead è zero se non lo è mai
usato non hai bisogno di un campo extra e
poi tutti i lambda apolidi ottengono il
beneficio di questa inizializzazione pigra e
memorizzazione nella cache gratuita, quindi ricorda
Ho detto che abbiamo bisogno di un altro livello di
indiretta ma non vogliamo pagare
quindi diamo un’occhiata al
le prestazioni costano qui ciò che siamo
chiamare solo la manifattura lambda
invocato una volta per lambda nel caso di
lambda non catturante che è carina
le successive acquisizioni comuni sono gratuite
significa totalmente gratuito e sai per il
acquisizione caso costo di acquisizione successivo
è nell’ordine di una chiamata del costruttore
che è fondamentalmente lo stesso di
inter-classe quindi abbiamo una performance
caratteristica che è solo il caso peggiore
come inter classi
miglior caso, quindi è abbastanza buono
quindi rompiamolo un po ‘se
guardiamo ai diversi livelli di costo
coinvolto nella traduzione di da lambda
a bytecode ce ne sono davvero tre
livelli significativi di costi
c’è il costo del collegamento che è il
costo una tantum la prima volta che tu
catturare così nel caso di inter
il costo del collegamento di classi è simile alla classe
caricamento a destra la prima volta
si istanzia un determinato tipo di classe inter
sai
che si traduce in un nuovo cibo
dollaro uno deve andare al file
sistema legge quei byte dal carico del disco
la classe la prossima volta che si cattura che
lo stesso tipo di inter class che non hai
per tornare al file system da leggere
quelli mordono dalla scrivania perché tu hai
ha già caricato la classe così è
costo di acquisizione dei costi di collegamento è ciò che sei
facendo ogni volta che stai catturando un
esempio così nel caso di inter class
il costo di acquisizione sta invocando il costruttore
e quindi hai un costo di chiamata
che è ogni volta che effettivamente invoco
tu conosci il lambda o l’ inter
metodo di classe e questo è solo un ordinario
vecchio invocare interfaccia bytecode va bene così noi
avere questi tre strati di costo
costo una tantum il costo per lambda e
il costo di invocazione per inter
le classi questo corrisponde alla classe
caricamento del metodo di chiamata del costruttore
invocazione
quindi accumuliamo lambda contro questo
quindi abbiamo ottenuto alcune misure dal nostro
team di prestazioni qui questo ci sta mostrando
i costi di collegamento in modo tale misura totale
tempo in millisecondi per l’ acquisizione
32.000 distinti tra le classi o
lambda dobbiamo anche evitare di influenzare il
risultati abbiamo caricato tutte le classi interne
su una scrivania ram – è la cosa che sai fare
via il costo di andare effettivamente al
disco e e e tirando quei byte in
per fare un confronto equo e c’è
una sorta di quattro esperimenti qui uno è per
catturarne uno è per non catturare e
l’altro accesso è se siamo noi
utilizzando la compilazione di livelli o non a livelli
compilation, che risulta avere un
grande differenza sulle prestazioni e
quello che vediamo l’importante è questo
ultima colonna che è la percentuale
differenza tra lambda e anonimo
classe e in tutti i casi lambda
cattura più velocemente della cattura inter-classe
cattura per il sai collegare così link
una lambda implica l’invocazione del bootstrap
genererà qualche bytecode
stai per caricare quella classe al volo
al volo
sembra un sacco di lavoro, ma è ancora
meno lavoro di una inter class va bene così
il lato di collegamento più veloce avvio così
va tutto bene, quindi facciamolo
guardare al di fuori del costo di cattura va bene così
questi numeri sono un po ‘diversi
Là
questi sono ops per microsecondo quindi invece
del tempo totale è um è throughput
e noi abbiamo misurato sei scenari Oh
sull’asse x abbiamo la classe interiore
il non catturare lambda e il
catturando lambda e poi ne abbiamo due
colonne qui uno è per un thread uno
è per 80 thread su un server 80 Way
sai
sbattere il più forte possibile e ciò che noi
vedere non sorprendentemente catturare
lambda sono esattamente veloci o lenti come
classi inter e lambda non catturanti
sono più veloci nella modalità single threaded
e quando andiamo in modalità non saturata
catturare lambda è molto più veloce di
inter classi va bene così andando dal singolo
filettato a saturo vediamo un 5x
miglioramento e rendimento per l’inter
caso di classe nel caso di cattura ma in
quasi 70 X aumento della produttività per
conosci il lambda non catturante e
quello è dove quel trucco di incassare
il lambda dal lato della chiamata e il voltarsi
in un carico costante si ripaga davvero
giusto non devi fare alcun calore
sovraccarico di gestione che ha un impatto
sulla scalabilità anche quando lo sei
allocazione con lettura allocazione locale
blocchi alla fine si deve tornare a
l’heap per ottenere un nuovo thread locale
blocco di allocazione perché hai esaurito
di quello che hai e che si presenta come
un impedimento di scalabilità così buono
storia qui i nostri numeri peggiori per
lambda sono esattamente uguali a quelli interni
le classi e i nostri numeri migliori sono
molto meglio quindi questo sai cosa
i teorici del gioco definiscono un dominio
strategia e nota che questo è solo il nostro
come una strategia stupida, questo è solo il
versione uno strategia stiamo uscendo
con la cosa più stupida possibile che potremmo
possibilmente fare così c’è una pipeline profonda
di cose che possiamo fare per renderlo più veloce
ma anche se non ci credi su
che sai che è ancora più veloce anche
con la strategia stupida va bene così uno di
le altre cose interessanti su questo
approccio che abbiamo preso è il lam
le meta fabbriche di conversione fanno parte di
il JDK quindi anche se la semantica di
sono fatti su misura per ciò che è Java
la lingua ha bisogno che altre lingue possano
trovare questo utile anche perché altro
le lingue eseguite sulla JVM potrebbero volere
invocare metodi su collezioni e maggio
voglio convertire i loro lambda al
rappresentazione di lambda che il
le raccolte si aspettano quindi le API Java
saranno pieni di questi funzionali
interfacce
sai come punto di raccolta per ogni o
la rimozione, se ad esempio abbiamo usato
e così altre lingue potrebbero voler chiamare
queste API sono e otterranno il beneficio di
tutti i miglioramenti delle prestazioni
aggiungiamo a loro nel corso del tempo in modo da sapere
ovviamente altre lingue possono fare cosa
vogliono ma è uno strumento in più nel
cassetta degli attrezzi per altri compilatori di lingue a
sulle spalle il lavoro della performance
lavoro che stiamo facendo per Java
linguaggio così non solo per noi lo sai
chiunque può usare questo ora che ho citato
questo tipo di una pipeline profonda di VM
ottimizzazioni che vogliamo davvero fare
qui così con un po ‘di aiuto da
la VM lo sta scrivendo proprio adesso, no
aiuto dalla VM che stiamo usando
invokedynamic out of the box è solo
come ogni altro compilatore che conosci
lascia che JRuby lo faccia solo con un po ‘di
aiutaci possiamo fare meglio così uno dei
ottimizzazioni che abbiamo in mente è
abbiamo progettato l’API del lambda
meta Factory per avere una semantica che mappa
perfettamente al metodo gestire algebra così
la VM potrebbe guardare una cattura lambda
sito e dire oh so esattamente cosa
ha esattamente lo stesso due uomini
semantica come questo metodo equivalente
maneggiare sapete Combinator e dal
VM comprende già l’handle del metodo
semantica è un’opportunità per la VM
per poi fare cose come applicare altro
ottimizzazioni come codice motion e box
sull’eliminazione della scatola così per esempio al
cattura dopo operazione è un puro
operazione non ha effetti collaterali quindi se il
VM può intensificare l’operazione di cattura
operazione può dire va bene che posso
muovere liberamente quell’operazione di cattura
tramite una chiamata in linea, ad esempio, così io
posso differire effettivamente farlo fino a quando non lo so
Sto andando a
o se pensi all’agnello da catturare è
Essenzialmente sei un operazione di boxe
prendendo un metodo che stai boxe in
uno di questi tipi di funzioni nominali bene
le stesse tecniche che ci permettono di fare la scatola
unbox una limitazione su numeri interi potrebbe
applica alle funzioni in cui hai questo
operazione di boxe si sposta a dove
l’unbox è qual è l’ invocazione e
quindi dì semplicemente oh, cosa mi serve?
box per fammi solo invocare il metodo
gestire direttamente così con un po ‘di
lavoro nel settore dei trasporti su cui possiamo appoggiarci
altre altre ottimizzazioni esistenti come
come inlining e codice di movimento e fuga
analisi per fare l’agnello per catturare anche
più veloce, quindi è abbastanza bello
va bene quindi devo parlare
serializzazione Odio la serializzazione ma
nessuna funzionalità linguistica è mai stata completata
senza alcuna interazione con
civiltà quindi ecco perché dovevamo aver avuto
ho dovuto affrontare questo abbiamo fatto questo
decisione di rappresentare lambda come nominale
tipi di funzione quindi se abbiamo un nominale
tipo di funzione chiamato foo e un estensore
realizzabile e qui questa è una funzione
da vuoto a booleano e assegniamo a
sono molto semplici lambda per questi utenti
andare aspettarsi questo lavoro e se noi
dì che questo non funziona è solo un altro
caso limite che gli utenti abbiano a ragionare
circa di come oh questa cosa è
serializzabile se proviene da una classe ER
o nome classe ma non da un lambda così io
deve piacere la ragione della sua provenienza
e non vogliamo chiedere alle persone di fare
quella
purtroppo perché la nostra traduzione
la strategia è dinamica non possiamo solo
serializzare l’oggetto lambda perché il
la classe che rappresenta non esisterà in
questi tempi di serializzazione quindi dobbiamo
e e anche se lo facesse forse lo è
utilizzando una diversa strategia di traduzione
e vorremmo deserializzare usando
la strategia di traduzione di una VM di destinazione
quindi abbiamo questa traduzione dinamica
strategia abbiamo bisogno di una serializzazione dinamica
strategia per e senza introdurre alcuno
buchi di sicurezza che è difficile da fare
serializzazione quindi il trucco qui è giusto
come l’ agnello per catturare il sito è un
ricetta per un lambda
il modulo serializzato deve essere una ricetta
anche per il lambda e possiamo usarlo
i ganci esistenti in serializzazione letti
Risolto scrivere scrivere per serializzare su a
ricetta di qui tutte le cose che sono andate
nel sito di chiamata e poi a D
tempo di serializzazione lo ricostituiamo
dentro sai in un nuovo agnello da catturare
usando qualunque strategia di traduzione
attuale al momento quindi tutto funziona
è abbastanza brutto che Mope Feliu noterà
funzionerà ma sai che mi piacerebbe
quei mesi della mia vita indietro
va bene riassumendo così il percorso evolutivo
per l’evoluzione di una lingua è pieno di idee
questo è ovvio ma sbagliato e tu
devo davvero stare attento
queste idee ovvie ma sbagliate perché
sono così avvincenti che è come oh I
avere lo strumento perfetto tranne che non lo è
perfetto e ragazzo non è perfetto in questo
così via e quindi devi essere disposto
per continuare a guardare e alcuni di questi mi piacciono
alcuni di questi approcci che io
descritto ha preso un numero di aha momenti
per ottenere dall’ovvio ma sbagliato ma
sai a questi sono in realtà
giusto e quando colpiamo quelli giusti
era davvero ovvio che avevano ragione ma
ci è voluto molto tempo che sai di trovare
loro e quindi devi essere disposto a
continua a guardare anche se pensi di te
trovato qualcosa di così invocato dinamico
si è rivelato un ottimo strumento qui così noi
usarlo si sa catturare lambda esso
ci ha dato flessibilità e ci dà
prestazioni e ci dà il
opportunità di cambiare la nostra strategia a
runtime e persino usando la strategia stupida
che iniziamo con almeno ancora
come sai, e forse anche meglio
rispetto alle classi inter e nei casi comuni
quindi sai spero come ho detto nessuno
di voi dovrò mai sapere nulla di
questo userete solo lambda e lo farai
ottieni grandi prestazioni e sarai
felice ma sai se la prossima volta qualcuno
dice oh lambda sono solo zucchero sintattico
per le classi interne ora puoi schiaffeggiarle
intorno a Lee autorevole se lo sei
interessato a più informazioni che puoi
vai alla pagina del progetto lambda su open
JDK
puoi scaricare le specifiche che puoi
scarica il file binario che puoi scaricare
documenti di panoramica e giocare con questo
oggi o aspetta fino a quando esce otto otto
il primo trimestre del prossimo anno e con quello
abbiamo qualche domanda sulla magia
macchina delle domande va bene così prima
la domanda qui è la testa del laminato di Java
prestazione rispetto a lambda
prestazioni di altre lingue quindi
non ho dati per questo, ma sono sicuro
che li faremo saltare tutti via
perché tutti gli altri stanno usando il
stessi strumenti che abbiamo respinto anche noi
lento okay e ora ovviamente lo sono
benvenuto a usare gli strumenti che abbiamo
e mi aspetto che alcuni compilatori migreranno
per usarli ma ho un momento difficile
immaginando che faranno molto
meglio ma sono sempre disposto ad essere
provato male, okay, vediamo che non lo sono
andando a rispondere che cosa caratteristica in
Per quanto riguarda lambda che non ce l’hanno fatta
nel tuo più grande rimpianto è quello
questo è buono
faccio nemmeno una risposta per questo così
molte piccole cose non ce l’hanno fatta
che tu sai ciò che conosci
pensa cose che sarebbero poco piccole
piccoli spigoli ma in realtà non posso
pensa a qualcosa di grande che noi che noi
davvero che davvero rimpiangiamo di andarsene
forse sono solo io a convincermi
o qualcosa
tutto bene avete altre domande
sul microfono George, così ora ci hai detto
su lambda e stamattina anche tu
parlato di tipi di valore, quindi ho solo
volevo sapere se hai intenzione di dare
noi coda di coda chiama anche a un certo punto così
coda chiama così è una buona domanda e a
domanda comune che abbiamo ricevuto
ad ogni conferenza per gli ultimi 15
anni quindi cos’è ora e come
in realtà è il tempo e il motivo
questa è la ragione per cui non siamo stati in grado
fare chiamate di coda nonostante il fatto che
è così ovvio come fare chiamate tail
è stato sottile e questo è lì
è stata un’interazione tra come si potrebbe
attuare chiamate di coda sulla JVM e sul
modello di sicurezza del
JDK quindi c’è il codice nel JDK per
qualunque motivo non sappia che sono il
messaggero non mi spara
si basa su quanti frame di stack sono
c’è tra me e l’ultimo codice
il dominio va bene così se hai la lingua
runtime sistematicamente munging the the
impilare non si può contare sul fatto di poter
cammina lungo la pila e conta il
numero di frame stack e c’era
codice di sicurezza senso del codice che
dipendeva da so che quattro fotogrammi in basso
per me è il codice utente, quindi lo farò
eseguirlo con le autorizzazioni utente di
questo codice è ovviamente fragile e
e difficile ma ciò che voleva dire era noi
non potrebbe avere
non potevamo avere chiamate a coda che facevano casino
il set di stack era totalmente
motivo accidentale non ovvio perché
era l’attuazione di code call sulla JVM
solo più difficile di quanto sembrasse
per fortuna abbiamo appena passato un
enorme sforzo per strappare tutto lo stack
codice sensibile alla profondità dal JDK e
sostituirlo con un meccanismo più generale
sul codice sensibile del chiamante dove
cammina lungo la pila e cerca il
successivamente conosci il dominio di protezione come
contrario al numero specifico di stack
fotogrammi che penso abbia rimosso il
ultimo impedimento davvero serio allo spostamento
inoltrare una coda per sapere che siamo
molto più vicino ora di quanto fossimo due o
tre anni fa ma non lo farò
qualsiasi promessa su quando sarà
okay se decidi di cambiare il
strategia per genere glam ‘das che
i componenti devono cambiare il compilatore
le librerie della VM solo solo la V I’m
in realtà nemmeno la VM è l’unica cosa
ha bisogno di cambiare è un po ‘di
codice nel runtime JDK e questo è il
implementazione della meta lambda
Factory questo è qualcosa che possiamo
cambia liberamente dalla versione alla versione
anche nelle versioni di manutenzione è tutto
puro codice Java le modifiche è solo un
dettagli di implementazione quindi nessuna lingua
cambiato nessun compilatore modificato nessuna modifica VM
nessuna libreria API modifica solo la libreria
il cambiamento di implementazione è così bello
cool mmm, stavo solo chiedendo che tu abbia parlato
sui metodi del male stamattina
se hai un metodo predefinito in due
le interfacce non ti danno il
lo stesso problema di ereditarietà che
okay, la domanda è oh mio dio tu
aggiunto l’ ereditarietà multipla in Java
l’eredità multipla è davvero
complicato, questa è la tua domanda
va bene
Java ha sempre detto che qui sono i miei figli miei
risposta intelligente che Java ha sempre avuto
eredità multipla di tipi classe a
implementa ijk che è multiplo
ereditarietà cosa abbiamo aggiunto in modo predefinito
i metodi erano ereditari multipli di
comportamento in cui tutto il dolore del multiplo
l’ereditarietà deriva dal C ++
eredità multipla di stato non lo facciamo
avere più ereditarietà di stato così
le regole per risolvere i conflitti in
i metodi predefiniti sono in realtà davvero
semplice ci sono tre regole
la prima superclasse regola vince in altre
parole se la catena della superclasse ha un
l’opinione su quel metodo che hai finito no
anche guardare le interfacce sembra giusto
come ha fatto in Java 7 regola due
le sottoclassi vincono su super classi quindi se
liste e raccolta ti offrono entrambi
implementazione di alcune impostazioni predefinite che si prendono
la più specifica regola tre non regola
tre se non si ottiene una risposta unica
dalle regole 1 e 2 implementate
te stesso come se fosse astratto molto molto
i semplici diamanti non sono un problema, puoi
hanno diamanti funzionano perfettamente così tutti
delle cose di cui abbiamo paura
ereditarietà multipla su da C ++ sono
hanno tutti a che fare con multipli
Tarrance of state e noi non ce l’abbiamo
problema no, non si rompe all’indietro
compatibilità perché se stai cercando
a compatibilità per te lo sai con te
conoscere pre codice otto Java se collegato
sotto Java 7 significa che c’è un
implementazione nella catena della superclasse
regola 1 che dà la priorità al
súplica
catena superclasse significa che funziona esattamente
in Java 8 come ha funzionato in Java 7
è molto più semplice di quanto sembri lo prometto
ok, grazie a tutti per la partecipazione
grazie Brian
e buona pausa
tu
immergiti nel modo in cui abbiamo effettivamente implementato
la caratteristica di aggiungere lambdas a Java così
questa non è una sorta di panoramica della lingua
questo sai che questo è molto di più
un’esplorazione di ciò che siamo
implementare o implementare le scelte che cosa
le scelte abbiamo valutato e rifiutato cosa
le scelte che alla fine abbiamo preso per dare
hai un senso di come sono queste cose
effettivamente costruito così in un certo senso questo
parlare è per lo più inutile perché come
programmatori stiamo solo andando usare questi
caratteristiche in cui siamo conosci pochissime
di noi o li realizzeremo davvero
ma mi piace sempre sapere come vanno le cose
Lavoro e penso che molti di noi farlo questo
è principalmente per darti un’idea di cosa sia
andando agli strati ne conosci uno o
due strati sotto il codice che
stai scrivendo bene, quindi lavoro per Oracle
quindi sono obbligato a mostrarti questo legale
disclaimer slide and going on okay so
discorsi altamente tecnici si spera un po ‘di
hai una certa dimestichezza con JVM e
e codice byte Java quante persone qui
ho usato lo strumento pipì Java per scaricare
codice byte va bene per il terzo forse va bene così
se non lo hai e hai un laptop
in questo momento potresti voler provarlo così
Java P è un dumper bytecode
quindi il compilatore java c accetta java
il codice sorgente in scrive i file di classe Java
i file di classe Java utilizzano a
architettura neutrale intermedia
rappresentazione chiamata bytecode Java
che poi la VM traduce in nativo
codice in fase di esecuzione, quindi se vuoi sapere
quale bytecode conosci la fonte data
costrutti che conosci corrispondono a o
cosa c’è in un file di classe Java java p è un
buon strumento per imparare che così sto andando
visualizzare un codice byte io sono anche
andando a parlare di alcuni dei
strutture aggiunte in Java 7
specificamente maniglie del metodo e
invokedynamic
che ancora non è qualcosa che nessuno
chi non sta implementando le lingue lo è
intenzione di usare, ma ancora bene a sapersi
A proposito solo per capire cosa sta succedendo
va bene quindi farò un ultra veloce
panoramica
delle funzionalità che abbiamo aggiunto a Java
sette solo così puoi vedere cosa sono
il codice sorgente sembra come sto assumendo
tutti in questa stanza sono piuttosto buoni
idea di cosa sia l’ espressione lambda
la loro lingua preferita , quindi non ho
essere lavoro belabor questo lambda
espressione è nel contesto di Java è
un metodo anonimo ha tutto a
metodo ha ha una lista di argomenti che
ha un corpo ha un tipo di ritorno ha un
serie di eccezioni generate ma abbiamo
compresso via la maggior parte della sintassi
boilerplate è sai farcela
qualcosa che sai molto più piccolo così
ecco alcuni esempi di lamin
espressioni nel primo abbiamo un
argomento prende un argomento è a
la persona che il corpo prende quella persona
il loro nome li aggiunge a qualche elenco di
chiama il tipo manifest sul o sul
gli argomenti possono essere omessi se il
il compilatore è in grado di dedurlo così nel
contesto di una frase come la gente punto
per ognuno e stai passando qualcosa
che prende una persona e restituisce il nulla
compilare è in grado di dire oh bene lo so
è una persona perché cos’altro potrebbe
essere e ho il compilatore non può dedurre
per te avrai un tempo di compilazione
messaggio di errore quindi potrebbe sembrare un po ‘
un po ‘ come la digitazione dinamica in realtà
la stessa tipizzazione statica che Java ha sempre
avuto solo con meno meno caldaia e
le espressioni lambda possono acquisire valori
dal contesto che racchiude così in questo
ultima espressione minima età è definita
fuori dal lambda e così è
considerato un valore catturato okay non tutto
Lambda sta catturando ma tu sai
la cattura si adatta in gran parte al
schema di traduzione quindi avrò un paio
di esempi di questo così un pò di
sfondo di te sai perché è così
stiamo facendo questo in primo luogo che si
sapere perché preoccuparsi di aggiungere lambda a Java I
ne ho parlato un po ‘ su questo nel mio
Parliamo stamattina un paio di coppia
dei motivi principali il più importante di
che sta fornendo un percorso verso la costruzione
librerie multi-core amichevoli quindi se tu
voglio costruire parallel friendly
librerie devi avere un modo di
esprimendo il codice come dati così
che puoi dire qui fai questo per ogni
elemento della collezione e lavori
fuori i dettagli del parallelismo
la sua decomposizione ecc. molte altre
ragioni per cui vogliamo potenziare la biblioteca
gli sviluppatori di scrivere le migliori librerie noi
vuoi stare al passo o raggiungere il
competizione e tu sai che abbiamo avuto un
strumento per questo sotto forma di inter
lezioni per molto tempo ma è solo
troppo goffo e sai non non adatto
quindi quello che stiamo andando concentrarsi su in questo
parlare è la domanda di runtime
rappresentazione di come rappresentiamo lambda
espressioni in fase di esecuzione che cosa sembra
come nel bytecode, a cosa assomiglia
durante l’esecuzione e sai quanto
rappresentazione runtime è un
anche i dettagli di implementazione lo sono
importante lo sai da una parte sì
dovremmo progettare la lingua per stare in piedi
da solo, ma si desidera che venga eseguito
in modo efficiente anche sulla JVM e se
c’è una discrepanza tra come le cose
sono rappresentati a livello di lingua
e avere il rappresentante il livello VM
questo sarà il dolore continuo per
i tuoi utenti quindi vogliamo mantenere il
linguaggio vista del mondo e il
la visualizzazione runtime del mondo è allineata come
pratico e questo è qualcosa che paga
dividendi ok così grande numero di domanda
uno quando aggiungi un nuovo tipo di
l’espressione in una lingua è se lo hai
ha un linguaggio tipizzato staticamente come
Giava
qual è il suo tipo cosa, quindi qual è il tipo
di una lingua di un’espressione lambda
la maggior parte delle lingue che hanno lambda hanno un
nozione di funzione tipo funzione da
int lungo così presto le proposte per l’aggiunta
lambda java ha detto bene, aggiungiamo
tipi di funzione di Java e questo sembra
come un’idea ovvia ma quando inizi
scavando si finisce con un sacco di brutto
domande o rappresentazione circostante
quindi come sarà il
bytecode che cosa è andare a guardare come in
una firma del metodo nel bytecode così
Java è collegato dinamicamente quando tu
invoca il metodo che seleziona tra i
sovraccarichi e in realtà prende il
firma di quel metodo il metodo
chiamato foo che ha argomenti int e
lungo e attacca quello nel file di classe
quindi se se stiamo andando a
si sa quindi dobbiamo trovare un modo per
rappresenta il lambda in un tipo di VM
firma in modo simile come invochiamo a
lambda dobbiamo avere un byte speciale
codice che conosci per averlo invocato come fa
creiamo istanze di loro facciamo
che con un nuovo codice bici o con un nuovo
codice a spillo codice bici chiamato nuovo che è
nel vecchio modo dobbiamo inventare un nuovo
strada verso la nuova non ho pensato molto a questo
attentamente ok
spostarsi sul sistema del tipo di linguaggio Java
ha varianti del sistema di tipo runtime
non è quello che sta per entrare nel
rappresentazione runtime quindi tutti questi
le domande sorgono quando sai una volta
superare l’ Oh, aggiungeremo solo la funzione
digita in Java
così come molti di voi hanno alcuni di voi
probabilmente ho sentito che mi piace questo trucco di
prendendo una domanda irragionevole e
facendolo sembrare ragionevole, dicendo perché
non solo di fronte , quindi lo sai
la gente ha chiesto bene perché non aggiungere e basta
tipi di funzioni bene perchè è più difficile di
sembra che la JVM non abbia un nativo
rappresentazione di un tipo di funzione quindi noi
dovrei inventarne uno o dovremmo farlo
insegnare alla JVM qualcosa di nuovo
lo strumento più vicino che abbiamo che potrebbe
rappresentano i tipi di funzione che conosci
la funzione da tdu è abbastanza facilmente
generici ma che porterebbe con sé a
molto del dolore dei generici come la boxe
e cancellazione e tipi di funzione boxed o
cancellare i tipi di funzione potrebbe davvero puzzare
quindi per esempio se avessimo un tipo generico
funzione funzione da TD tu te
non sarebbe in grado di sovraccaricare due metodi
che ha preso funzioni anche se i loro tipi
sono completamente diversi quindi potresti
scrivere un sovraccarico di funzione da
stringa per terminare e funzionare da lungo a
doppio e poi il compilatore direbbe
non puoi farlo, questi hanno lo stesso
cancellino e dirai cosa non sembra
a tutti piace la stessa cancellazione così noi
pensavo che sarebbe stata una cosa cattiva da fare
alle persone e non volevamo farlo
e quindi questo è uno di quei posti dove
ci sarebbe un divario tra il
rappresentazione linguistica e lì e
la rappresentazione VM e questo è sempre
il punto dolente in modo da poter insegnare la VM
sui tipi di funzione reali ma questo lo farebbe
essere un enorme sforzo che potrebbe interessare
le firme influirebbero sui codici della bicicletta
influenzerebbe le regole di verifica in questo modo
sai sarebbe un grosso problema quindi
cerchiamo il cast in giro
alternative perché questo era molto
lavoro e siamo pigri così storicamente in
Codice Java con funzioni modello che ne utilizzano uno
il metodo interfaccia cose come eseguibili
o comparatore e sai che abbiamo pensato
bene, piuttosto che aggiungere un nuovo tipo
di tipo al sistema di tipo e di noi
ho appena formalizzato questa nozione di a
la funzione è rappresentata da un unico metodo
interfaccia così abbiamo preso questo modello e
gli diede un nome interfaccia funzionale e
boom abbiamo finito questo è il nostro
tipo di funzione quindi il modo in cui il
il linguaggio funziona è un’interfaccia funzionale
come il predicato qui è isomorfo a a
funzione che accetta t restituisce a
booleano in modo che il compilatore guardi
predicates e dice va bene che è un
interfaccia ma potrebbe anche essere un
funzione se fosse una funzione che sarebbe
sii dalla t tubulin e poi quando vedi
un metodo come lo sai rimuovere se di chi
argomento è un predicato di t it e
qualcuno fornisce un’espressione lambda come
gli argomenti che il metodo dice tutto
bene, sono disposto a convertire questo
espressione lambda a uno di questi
funzioni nominali vediamo se il se
le forme si combinano hanno il
stesso numero di argomenti o loro
i tipi di argomenti compatibili sono il rendimento
tipi compatibili ci sono eccezioni
compatibile e se sono quindi il
il compilatore dice va bene che prenderò questo
espressione lambda che prende una persona
e restituisce un booleano e lo farò
convertilo in un predicato di una persona
fatto e ora se lo facciamo il
le firme sembrano firme Java
che abbiamo sempre avuto loro questi
tipi nominali in loro invocazione
sembra l’invocazione che abbiamo sempre
aveva così sembra un po ‘più semplice
modo di farlo in modo tale da sapere
ci sono molti più dettagli in questa storia
di quello che so tu che esprimi su due
scivola ma è il punto da asporto
basta aggiungere i tipi di funzione era ovvio e
sbagliato
sarebbe stato complesso
introdotto casi angolari che avrebbe
utenti esposti a più del dolore di
cancellatura
che è bello avrebbe anche avuto il
effetto di biforcare completamente il
mondo delle librerie Java perché ora lo faremmo
avere vecchie librerie e nuove librerie e
come ti ricordi il dolore che siamo andati
attraverso quando avevamo librerie generiche
e le librerie non generiche anche se
erano interoperabili giusto e li
era come un periodo di cinque anni dove
c’era tutto questo churn sui generi
le librerie di fieri bene non vogliamo
farlo di nuovo e in modo che non vogliamo
creare questa divisione tra vecchio e nuovo
librerie così usando un vecchio meccanismo
evitiamo quel problema e come bonus
librerie esistenti che sono state progettate
anni prima lambda tutto ad un tratto
compatibile con lambda finchè
usano questo modello così tanto
le librerie usano già così meno nuove
concetti mantiene investimenti in
librerie esistenti a volte conosciute a
un vecchio approccio noioso è meglio di un
nuovo splendente ok, quindi guardiamo
un’altra domanda che abbiamo tipo
calati mentre progettiamo questa funzione
come viene creata un’istanza lambda
cos’è questa rappresentazione runtime?
come se avessi saputo che aveva un in questo
esempio qui abbiamo un’espressione lambda
a destra è una funzione da persona
a boolean abbiamo sul lato sinistro
lo stiamo assegnando a un predicato di
persona che è moralmente una funzione da
persona da booleana così vede il compilatore
questo codice deve produrre qualche byte
codice quindi quale codice luminoso dovrebbe
produrre così c’è un altro ovvio
la soluzione qui fa girare una classe interiore
giusto così le classi interne hanno fatto questo
per un po ‘potremmo dire un lambda
è un’istanza di classe interna e il
il compilatore genererebbe una classe interna
come questo che da quando cattura a
variabile deve avere una sensazione che ha
avere un costruttore che si inizializza
quel campo e poi il corpo fa il
cosa ovvia compilatore completamente semplice
conosci l’operazione e potremmo avere noi
avrebbe potuto essere fatto in una settimana un sacco di
la gente pensava che dovremmo essere fatti in un
settimana ma tu conosci la cosa bella
questa è la cattura lambda che si traduce molto
semplicemente invocando il
costruttore di questa classe interiore quindi il
il compilatore che conosci genera questo interno
classe che genera per l’ istanziazione
di lambda
solo un’invocazione al dollaro alimentare
un costruttore e abbiamo finito e poi
invocando lo sai il costruttore
si traduce in alcuni molto semplici
bytecode quindi cosa stiamo facendo qui noi
istanziare un ed e un oggetto di classe
Per un dollaro noi spingiamo il catturato
variabile sullo stack invochiamo il
costruttore e quindi con il riferimento
a quella nuova cosa ancora in pila noi
appena passato quello direttamente per rimuovere F così
molto semplice molto discreto nel
modo il compilatore genera bytecode
oggi va bene, ovviamente, ho paura
Citazioni intorno solo perché non l’abbiamo fatto
in questo modo bene in una classe fa schifo e
traducendo in classi interne dietro il
le scene ereditano molti dei loro problemi
con il bonus aggiuntivo che non l’hai fatto
anche chiedere una classe interiore così ora tu
avere il dolore delle classi interne senza
averne chiesto uno e questo è quello
tipo di pessimo quindi quali sono alcuni dei
problemi delle classi interne
bene le prestazioni stiamo generando a
classe per ogni espressione lambda si dispone di un
moltissime implementazioni di tipi
come runnable che significa che ottieni
megamorfosi o chiamata siti che è un
problema di prestazioni in fase di esecuzione e
stai sempre assegnando una nuova istanza
anche quando le istanze sono logicamente
equivalente quindi anche se un lambda cattura
nulla di una classe interiore sarebbe ancora
creare un’istanza di una nuova istanza e come
a volte ci sorta di farlo a mano a
il nostro codice giusto se si dispone di un comparatore
quello non sta catturando niente che tu sappia io
spostalo in cima alla tua classe
dì che conosci la finale statica privata
il comparatore C è uguale e tu lo fai tu
conosci una volta e poi lo passi e basta
ma è un po ‘come rovinare il tuo
codice per motivi di prestazioni che vorremmo
per non mettere le persone in quella situazione
e anche la regola sulle regole
la ricerca di nomi nelle classi interne è davvero
brutto e volevamo evitare di esporre
la gente a che così la cosa importante da
riconoscere è qualsiasi codice di byte il
il compilatore genera il primo giorno
Java ha lambdas è il binario
rappresentazione per lambda fino a te
conoscere la morte termica dell’universo così
sai che vogliamo scegliere
rappresentazione molto attentamente e
idealmente quella rappresentazione binaria con
la scelta dell’implementazione a cui siamo capitati
hanno fatto quando stavamo scrivendo il
compilatore perché quello che ci costringe
abbastanza terribilmente, quindi penso che sia così
un altro di quelli ovvi ma sbagliati
le scelte quindi diamo un’occhiata ad altre
opzioni in Java 7 abbiamo aggiunto una funzionalità
chiamato metodo gestisce per la VM ora questo
è una funzionalità di basso livello che è stata progettata
è davvero un kit di strumenti per il compilatore
scrittori ma l’idea è che sia come
riflessione ma in realtà è veloce così tu
può memorizzare un riferimento a un metodo in a
metodo di gestire è possibile mettere quei metodo
maniglie nella piscina costante e carico
li come costanti e la VM lo fa
molto velocemente puoi ottenere un metodo
gestire per qualsiasi metodo o qualsiasi costruttore
o qualsiasi campo indietro sesor e la VM
capisce il metodo gestisce così felicemente
in linee attraverso di loro e fornisce
sei un’API per manipolare la matematica e
gestisce come aggiungere argomenti e
rimuovere argomenti e adattarsi
argomenti con il pugilato o unboxing o
casting o what-have-you
quindi sai che fondamentalmente è un compilatore
scrittore coltellino svizzero
quindi questo sembra un altro di quelli
scelte ovvie I lambda sono una lingua
metodo di metodo a livello costante gestisce a
Costante del metodo VM come potrebbe questo
non funziona quindi potremmo usare le maniglie del metodo
come la nostra tecnica di implementazione che
significherebbe che dovremmo differire il
corpo di un’espressione lambda in a
metodo che è facile da fare e quindi
rappresentano i lambda usando il metodo
maniglie e firma del codice byte e
è lì che le cose iniziano a cadere a pezzi
ok ecco come lo farebbe il compilatore
traduci le cose se abbiamo l’esatto
stesso codice di prima quindi direi prendere
il corpo in questa lambda D lo zucchererà
un metodo qui lo abbiamo chiamato lambda
dollaro uno diamo un argomento in più
che è il catturato
età minima che arriva dal
contesto esterno e ovviamente il
argomenti l’ espressione lambda il
la persona e il corpo lo valuta appena
e poi quando andiamo a
generare codice per l’acquisizione e
l’invocazione che tutto ciò che facciamo è dire bene
dammi un metodo di impugnatura per discernere
metodo e poi riponi questo extra
argomento su di esso a metà età e poi solo
passare quello per rimuovere in caso affermativo la firma
di rimuovere se sarebbe rimuovere se metodo
gestire bene questo è un tipo di problema
perché le maniglie del metodo sono efficaci
cancellato giusto c’è solo un metodo
gestire il tipo non c’è l’handle del metodo
per la funzione da Int a Long c’è
metodo di gestire quindi questo è come super
gomma è così per un sicuro succhia questo è
anche peggio non saremmo in grado di
sovraccaricare due metodi che prendono anche
Lambda di forma diversa o diversa
arity lambda e avremmo ancora bisogno
per codificare il tipo di livello di lingua
informazioni nel file di classe da qualche parte
anche se non è codificato nel
bytecode quindi questo soffre dello stesso
problema come l’ ultimo ovvio ma sbagliato
scelta perché ci vuole un
tecnica di implementazione e it
confonde la nostra rappresentazione binaria con
quella scelta della tecnica di implementazione
quindi, ancora una bella idea, ma non lo fa abbastanza
quello che vogliamo quindi so che questo lo sai
solo preso come 20 minuti finora abbiamo
appena descritto un periodo di sei
mesi di battere la testa contro
varie opzioni okay, quindi cosa abbiamo?
imparato qui quello che vorremmo è un binario
rappresentazione che non è legato al
implementazione specifica sicuramente noi
non voglio portare con noi il bagaglio
di inter classi e anche noi non vogliamo
portare con noi il basso livello di Ness e
cancellazione di maniglie del metodo e noi no
voglio scegliere qualcosa che stiamo andando
voglio cambiare perché non vogliamo
mai dire ai nostri utenti oh sì, c’è un
nuova versione di Java là fuori ed è
molto più veloce ma si
ricompilare tutto il codice non lo facciamo
non vogliamo che gli utenti non lo facciano
così lo abbiamo preso come un
requisito non possiamo chiedere agli utenti di
ricompilare solo per ottenere di più per il
prestazioni aggiuntive che potremmo
avere in una versione futura del JDK così
ovviamente la soluzione a tutti i problemi
di informatica è più indiretta
e la sfida è: come lo facciamo
in modo che ulteriore interazione in
la direzione non ci danneggia le prestazioni
per quanto riguarda la teoria, il compilatore potrebbe
non emettere codice per costruire il lambda
ma qualcosa di più come un dichiarativo
ricetta per come realizzare questo lambda e
il runtime eseguirà quella ricetta
usando tutti gli strumenti che ha deciso al
il tempo era il migliore, forse il martedì
sarebbe nelle nostre classi e via
Giovedì che il metodo gestisce ma noi
non importa perché ora è un puro
dettagli di implementazione finché è
veloce deve essere veloce quindi per questo noi
passare a un’altra caratteristica VM che era
aggiunto in Java 7 nuovamente non una funzionalità per
utenti, ma una funzionalità per gli scrittori di compilatori
chiamato invokedynamic
quindi fammi parlare un po ‘di
invokedynamic
quindi prima di Java 7 c’erano 4 invocazioni
modalità per diversi codici byte per
invocando metodi sono stati invocati staticamente
invoca l’interfaccia invoca virtuale e
invocare speciali e corrispondono
abbastanza semplice a Java
situazioni linguistiche una è per statica
i metodi uno è per i metodi di interfaccia uno
è per i metodi virtuali e quindi uno è
perché tutto il resto invoca uno speciale
ti gestisce chiamate del costruttore e
super chiamate e metodi privati e tutti
le cose che non rientrano esattamente in
uno degli altri tre secchi e noi
ho visto esempi di due di questi nel
rappresentazione bytecode per l’interno
la classe che abbiamo usato invoca speciali da invocare
il costruttore di cibo dollaro uno e
quindi usiamo per invocare l’interfaccia a
invocare il metodo di rimozione in modo Java 7
aggiunto uno nuovo invocare dinamico e noi
abbrevia questo per indie ed è
diverso dall’altra invocazione
modalità che hanno le altre modalità di chiamata
molto fisso e invocazione simile a Java
semantica, ma ci rendiamo conto che non tutti
le lingue sono come Java e non tutte
le lingue vogliono che l’invocazione JVM funzioni
il modo in cui l’invocazione funziona in Java e così via
l’ idea di base dietro invocare la dinamica è
lascia il runtime della lingua e la VM
essere partner e decisioni di collegamento ma
fornisce anche sapere in modo che fornisce un
modo per una logica specifica della lingua a
aiutare la VM a risolvere una chiamata di metodo
e poi togliti di mezzo per non farlo
devi chiamare nella lingua
runtime su è come lo facciamo velocemente
quindi sai che potresti farti sapere
Codice JRuby che fornisce JRuby specifico
logica linkit : il codice lo informa
Logica di collegamento specifico per Python e
alla fine ciò si riduce a uno dei
vecchie modalità di chiamata che la macchina virtuale già
sa come inline attraverso una volta il
risoluzione è fatto in modo tale iniziato
come strumento per le lingue dinamiche dove
la lingua non aveva tutto il tipo
informazioni disponibili su Java JVM
firme necessarie per essere in grado di
fare di un metodo di chiamata così come un
esempio come qui c’è del codice in Ruby
dove dici che ho un metodo ADD
due argomenti a e B e il suo corpo è a
più B ma poiché non conosciamo i tipi
di A e B non sappiamo cosa più
significa davvero che potrebbero essere due numeri interi
potrebbero essere due galleggianti potrebbero essere due stringhe
quindi non conosciamo i tipi di a e B a
compilare il tempo li conosciamo in fase di esecuzione
i tipi possono cambiare da una chiamata all’altra ma
la realtà è che di solito non lo fanno se io
chiama questo metodo e poi lo chiamo
ancora una volta non c’è una buona possibilità che
Avrò lo stesso tipo nel mio
argomenti come ho fatto l’ultima volta perché
chiamiamo cose e loop proprio così tu
avere un ciclo che sta scorrendo
un array e stai chiamando questo metodo
sai più volte che voglio essere
in grado di riutilizzare le decisioni di collegamento senza
dover percorrere il lento cammino di
qual è il tipo di un qual è il tipo di
B fammi vedere nella mia tabella delle funzioni
il metodo più che corrisponde a
questi due tipi in modo da poter ovviamente
fare con questo con un riflesso ma è
davvero lento e quindi conosci la chiave qui
è che vogliamo evitare essere il collegamento in
chiamare il sito incorporando informazioni su
quando quando consulta il
logica legame specifico della lingua che dice
ecco la cosa da chiamare e qui sono
le condizioni in cui puoi semplicemente
riutilizzare questa decisione senza dover
tornare indietro e ricalcolare il collegamento
bersaglio
e una volta che la VM lo fa , allora è in grado
inline attraverso il sai il the
chiamata invocalamica proprio come qualsiasi cosa
altro
X è il ci sono più fasi per a
dato invoca il lato di chiamata dinamico il primo
volta che si richiama un determinato sito chiamata ha
fare qualche costoso collegamento one-time
lavora così consulta questa logica linguistica
che chiamiamo il metodo bootstrap e
Farà del lavoro che farà
alcune occhiate forse ne spenderanno alcune
le classi farà tutto quello che è
lo farò ma viene fatto solo una volta e
quindi restituisce un sito di chiamata di collegamento che
incorpora qui il tuo target di collegamento e
ecco le condizioni in cui tu
potrebbe dover ricollegare e da allora in poi se
quelle condizioni che conosci o non sei tu
non sono presenti regali che la VM non deve mai
consulta nuovamente il metodo di bootstrap
in seguito la VM può trattare la chiamata
lato come completamente collegato e quindi
inline attraverso proprio come qualsiasi altro
lato invito quindi è abbastanza piuttosto fresco
strumento che ti permette di fare un po ‘di tempo
lavorare e poi riutilizzare quella decisione e
questo è quello che abbiamo finito per usare nel nostro
traduzione di lambda anche se Java
questo è un linguaggio tipizzato staticamente
teoricamente uno strumento per dinamicamente
lingue digitato ma si sa perché dovrebbe
hanno tutto il divertimento quindi se guardi
ciò che è nel bytecode aggiungere e richiamare
sito di chiamata dinamico non c’è praticamente
tre gruppi di operandi il primo
è il bootstrap di collegamento che
contiene il tuo link specifico per la lingua
la logica che viene chiamata una volta non viene mai chiamata
di nuovo c’è anche un argomento dinamico
lista che viene semplicemente messa in pila
come qualsiasi altra istruzione di invocazione
e poi c’è un’altra lista di argomenti
la lista di argomenti statici che è
costanti che escono dalla costante
pool e questa è la lista degli argomenti
questo è passato al metodo bootstrap
e cattura le cose sulla chiamata
sito come i tipi di argomenti e
cose che il compilatore conosce
staticamente
così come ho detto che il lavoro è tipizzato in modo statico
linguaggio tutti i tipi coinvolti sono
statico quindi non stiamo usando la dinamica
caratteristica reale incas sto invocando dinamico
ma ciò che è dinamico qui è il nostro codice
strategia di generazione abbiamo delineato due codici
strategie di generazione prima dello spin an
classe interiore o utilizzare un metodo di gestire lì
sono anche altri si sa che potremmo usare
proxy dinamici se volessimo il nostro codice
essere molto lento o forse stiamo correndo
alcune VM che hanno un livello veramente basso
metodo per lo sai oggetti out edificio
di voi conoscete pezzi puri e alchimia e
tale che vogliamo usarlo per fare
i nostri lambda invece di voi conoscono il
altro meccanismo quindi abbiamo questi vari
strategie di implementazione e questo è
ciò che è dinamico vogliamo dinamicamente
scegli tra quelle traduzioni
strategie e invocano la dinamica ci dà
la possibilità di trasformare questa scelta in a
puro dettaglio di implementazione runtime
che è completamente separata dalla
rappresentazione binaria, quindi è davvero
bel trucco e ti farò sapere mostrarti
più di come sembra così il concetto è
nel bytecode per cui incorporiamo una ricetta
costruendo una lambda quindi cosa va a finire
quella ricetta bene abbiamo bisogno di sapere il
corpo di quella lambda, quindi lo faremo
la stessa cosa che abbiamo fatto nel metodo
gestire il caso di traduzione in cui noi
distribuire al corpo lambda un metodo
e usiamo un handle di metodo per rappresentare
quel metodo abbiamo bisogno di conoscere l’obiettivo
scrivi di che tipo è questo essere lambda
convertito negli esempi che abbiamo mostrato
finora è stato predicato così è
una delle cose che quella
metodo di bootstrap ha bisogno di sapere e poi
potrebbero esserci ulteriori metadati su
il sito di chiamata come devo fare
fare cose speciali per la sterilizzazione o
irrigare le variabili che vengono catturate
dallo scopo lessicale perché quelli sono
sarà necessario quando si costruisce il
lambda quindi questo rappresentiamo questo utilizzando
invochiamo un sito di chiamata dinamico che chiamiamo questo
la fabbrica lambda quindi l’idea sei tu
invocare questo sito di chiamata dinamico e invocare
ti restituisce il lambda che vuoi
alcuni degli argomenti alla chiamata al
le factory sono statiche e sono codificate
nella piscina costante
alcuni di loro sono dinamici sono
spinto in pila e poi la VM
fallo
il caso che le successive indicazioni di
lo stesso sito di fabbrica in altre parole
successivamente cattura lo stesso lambda tu
bypassare il percorso di collegamento lento così bene
diamo un’occhiata a ciò che il compilatore fa
il primo passo è D zuccherare il corpo lambda in
un metodo come prima, così qui abbiamo
questo metodo lambda dollaro uno ha il
argomento persona P ha il catturato
argomento min age così è facile
trasformazione molto semplice e
generalmente possiamo tradurre questo in a
metodo statico se si tratta di un metodo che
cattura il ricevitore perché tocca
un metodo o un altro membro della classe invoca
uno dei metodi di classe quindi noi
non sono d’accordo sul metodo di istanza e quindi su
il sito in cui vogliamo catturare il
lambda invochiamo e invochiamo che emettiamo
invocare istruzioni dinamiche dove diciamo
il bootstrap è questo speciale Java
metodo logico della lingua runtime
chiamato la fabbrica di meta Lambda il
argomenti statici sono acque mie
tipo di conversione il mio obiettivo di conversione
qui predicate e dov’è il mio
implementazione qui lambda dollar one
e gli argomenti dinamici sono il min
l’età che ho catturato dal contesto
quindi invoco questa vista vista che mi consegna
indietro il lambda voglio che sia di tipo
predicato e poi l’ho appena passato
rimuovere F okay , la cosa bella è la
stiamo usando questa rappresentazione nominale
di funzioni la firma della stanza di F
è solo un predicato della cattura lambda
crea un predicato che abbiamo appena passato
va bene così il codice generato è
in realtà piuttosto semplice se tu
usa Java P puoi vedere tutto il
roba invocastinamica nel pool costante
e tu sai che non abbiamo dovuto distorcere
la traduzione è molto importante
è abbastanza buono
quindi ora abbiamo questo tu sai questa cosa
chiamiamo meta Factory the the the
metodo di bootstrap per questi lambda
catturare siti potrebbe fare qualsiasi cosa
vuole che possa generarlo nella sua classe
spendi dinamicamente la classe in fase di runtime
usando Azzam oh e poi sarebbe giusto
collega il sito di chiamata al costruttore
ma quello ha generato la classe
questa è in realtà la strategia iniziale
che abbiamo implementato ma questo è solo il
versione uno strategia in modo da sapere nel
futuro potremmo fare qualcosa di simile
invece di girare una classe per lambda
potremmo girare una classe per funzionale
tipo di interfaccia di tipo wrapper per
eseguire una sola classe wrapper per
comparatore ecc e basta passare un metodo
gestire al suo al suo costruttore e
lo faremo non appena siamo sicuri che
la performance di questo è migliore e
è qualcosa che non dobbiamo
fare in un importante aggiornamento di Java che potremmo fare
e tu conosci otto punti zero punto uno
perché è solo un’implementazione
dettaglio potremmo anche usarne altri
tecniche come proxy dinamico è o
metodo gestire i proxy o VM private
api o ogni volta che possiamo fare per farlo
traduzione il più velocemente possibile
quindi, ciò che ha usato invocare la dinamica ci ha dato
ecco l’opzione per rinviare il
scelta della strategia di generazione del codice per
runtime e quindi diventa un puro
implementazione dettaglio qualcosa che noi
può cambiare da versione a versione da
giorno per giorno ci sistemiamo sul nostro binario
il protocollo ora che è qui è l’API
per questo bootstrap dinamico invocato ma noi
non hanno bruciato la scelta di
strategia di attuazione nel
bytecode quindi questo è un classico trucco Java
di spostare più del lavoro da statico
tempo di compilazione al runtime dinamico quando
hai più informazioni, se tu
avere più informazioni che puoi fare
decisioni migliori
la ragione per la compilazione dinamica sempre
spazza via la compilazione statica sei tu
avere più informazioni in fase di esecuzione di
lo fai staticamente e questo ci dà il
flessibilità per cambiare il nostro codice
strategia di generazione ogni volta che arriviamo
con uno migliore ma aspetta c’è di più
questo comportamento che invoca dinamico ha
dove la prima volta attraverso il tuo link
il sito di chiamata e quindi i tempi futuri
attraverso di essa ignora quello che ci dà
praticamente gratis quel trucco ero solo
descrivendo dove prendi inter-classe
e tu lo nascondi in un campo statico
conoscere il comparatore statico finale pubblico C
equivale a conoscere il nuovo blah blah blah
trucco che eravamo abituati a fare a mano
ridurre il numero di allocazioni nostre
codice ora il runtime fa proprio per te
gratuito
quindi se hai un lambda che non lo fa
catturare qualsiasi cosa e un sacco di lambda
sono così che conosci X arrow X plus 2
o qualcosa del genere è il compilatore
andando dire che questo è un senza stato uno lambda
l’istanza è buona quanto un’altra
non hanno identità specifiche
caratteristiche così la prima volta
catturarne uno che sto per nascondere alla chiamata
sito e poi da lì in poi sto solo andando
restituire quello stesso e il VM sta per
riconoscere questo questo modello e girare
lambda Cattura in un carico costante così
questo rende nel caso abbastanza comune di
Lambda senza stato lambda cattura molto
molto più veloce delle sue classi perché
non stai assegnando non stai andando
al mucchio ecc. quindi in questo caso puoi farlo
pensa a invokedynamic
come se fosse una cache inizializzata pigramente
ritarda l’inizializzazione al primo utilizzo
quindi l’overhead è zero se non lo è mai
usato non hai bisogno di un campo extra e
poi tutti i lambda apolidi ottengono il
beneficio di questa inizializzazione pigra e
memorizzazione nella cache gratuita, quindi ricorda
Ho detto che abbiamo bisogno di un altro livello di
indiretta ma non vogliamo pagare
quindi diamo un’occhiata al
le prestazioni costano qui ciò che siamo
chiamare solo la manifattura lambda
invocato una volta per lambda nel caso di
lambda non catturante che è carina
le successive acquisizioni comuni sono gratuite
significa totalmente gratuito e sai per il
acquisizione caso costo di acquisizione successivo
è nell’ordine di una chiamata del costruttore
che è fondamentalmente lo stesso di
inter-classe quindi abbiamo una performance
caratteristica che è solo il caso peggiore
come inter classi
miglior caso, quindi è abbastanza buono
quindi rompiamolo un po ‘se
guardiamo ai diversi livelli di costo
coinvolto nella traduzione di da lambda
a bytecode ce ne sono davvero tre
livelli significativi di costi
c’è il costo del collegamento che è il
costo una tantum la prima volta che tu
catturare così nel caso di inter
il costo del collegamento di classi è simile alla classe
caricamento a destra la prima volta
si istanzia un determinato tipo di classe inter
sai
che si traduce in un nuovo cibo
dollaro uno deve andare al file
sistema legge quei byte dal carico del disco
la classe la prossima volta che si cattura che
lo stesso tipo di inter class che non hai
per tornare al file system da leggere
quelli mordono dalla scrivania perché tu hai
ha già caricato la classe così è
costo di acquisizione dei costi di collegamento è ciò che sei
facendo ogni volta che stai catturando un
esempio così nel caso di inter class
il costo di acquisizione sta invocando il costruttore
e quindi hai un costo di chiamata
che è ogni volta che effettivamente invoco
tu conosci il lambda o l’ inter
metodo di classe e questo è solo un ordinario
vecchio invocare interfaccia bytecode va bene così noi
avere questi tre strati di costo
costo una tantum il costo per lambda e
il costo di invocazione per inter
le classi questo corrisponde alla classe
caricamento del metodo di chiamata del costruttore
invocazione
quindi accumuliamo lambda contro questo
quindi abbiamo ottenuto alcune misure dal nostro
team di prestazioni qui questo ci sta mostrando
i costi di collegamento in modo tale misura totale
tempo in millisecondi per l’ acquisizione
32.000 distinti tra le classi o
lambda dobbiamo anche evitare di influenzare il
risultati abbiamo caricato tutte le classi interne
su una scrivania ram – è la cosa che sai fare
via il costo di andare effettivamente al
disco e e e tirando quei byte in
per fare un confronto equo e c’è
una sorta di quattro esperimenti qui uno è per
catturarne uno è per non catturare e
l’altro accesso è se siamo noi
utilizzando la compilazione di livelli o non a livelli
compilation, che risulta avere un
grande differenza sulle prestazioni e
quello che vediamo l’importante è questo
ultima colonna che è la percentuale
differenza tra lambda e anonimo
classe e in tutti i casi lambda
cattura più velocemente della cattura inter-classe
cattura per il sai collegare così link
una lambda implica l’invocazione del bootstrap
genererà qualche bytecode
stai per caricare quella classe al volo
al volo
sembra un sacco di lavoro, ma è ancora
meno lavoro di una inter class va bene così
il lato di collegamento più veloce avvio così
va tutto bene, quindi facciamolo
guardare al di fuori del costo di cattura va bene così
questi numeri sono un po ‘diversi
Là
questi sono ops per microsecondo quindi invece
del tempo totale è um è throughput
e noi abbiamo misurato sei scenari Oh
sull’asse x abbiamo la classe interiore
il non catturare lambda e il
catturando lambda e poi ne abbiamo due
colonne qui uno è per un thread uno
è per 80 thread su un server 80 Way
sai
sbattere il più forte possibile e ciò che noi
vedere non sorprendentemente catturare
lambda sono esattamente veloci o lenti come
classi inter e lambda non catturanti
sono più veloci nella modalità single threaded
e quando andiamo in modalità non saturata
catturare lambda è molto più veloce di
inter classi va bene così andando dal singolo
filettato a saturo vediamo un 5x
miglioramento e rendimento per l’inter
caso di classe nel caso di cattura ma in
quasi 70 X aumento della produttività per
conosci il lambda non catturante e
quello è dove quel trucco di incassare
il lambda dal lato della chiamata e il voltarsi
in un carico costante si ripaga davvero
giusto non devi fare alcun calore
sovraccarico di gestione che ha un impatto
sulla scalabilità anche quando lo sei
allocazione con lettura allocazione locale
blocchi alla fine si deve tornare a
l’heap per ottenere un nuovo thread locale
blocco di allocazione perché hai esaurito
di quello che hai e che si presenta come
un impedimento di scalabilità così buono
storia qui i nostri numeri peggiori per
lambda sono esattamente uguali a quelli interni
le classi e i nostri numeri migliori sono
molto meglio quindi questo sai cosa
i teorici del gioco definiscono un dominio
strategia e nota che questo è solo il nostro
come una strategia stupida, questo è solo il
versione uno strategia stiamo uscendo
con la cosa più stupida possibile che potremmo
possibilmente fare così c’è una pipeline profonda
di cose che possiamo fare per renderlo più veloce
ma anche se non ci credi su
che sai che è ancora più veloce anche
con la strategia stupida va bene così uno di
le altre cose interessanti su questo
approccio che abbiamo preso è il lam
le meta fabbriche di conversione fanno parte di
il JDK quindi anche se la semantica di
sono fatti su misura per ciò che è Java
la lingua ha bisogno che altre lingue possano
trovare questo utile anche perché altro
le lingue eseguite sulla JVM potrebbero volere
invocare metodi su collezioni e maggio
voglio convertire i loro lambda al
rappresentazione di lambda che il
le raccolte si aspettano quindi le API Java
saranno pieni di questi funzionali
interfacce
sai come punto di raccolta per ogni o
la rimozione, se ad esempio abbiamo usato
e così altre lingue potrebbero voler chiamare
queste API sono e otterranno il beneficio di
tutti i miglioramenti delle prestazioni
aggiungiamo a loro nel corso del tempo in modo da sapere
ovviamente altre lingue possono fare cosa
vogliono ma è uno strumento in più nel
cassetta degli attrezzi per altri compilatori di lingue a
sulle spalle il lavoro della performance
lavoro che stiamo facendo per Java
linguaggio così non solo per noi lo sai
chiunque può usare questo ora che ho citato
questo tipo di una pipeline profonda di VM
ottimizzazioni che vogliamo davvero fare
qui così con un po ‘di aiuto da
la VM lo sta scrivendo proprio adesso, no
aiuto dalla VM che stiamo usando
invokedynamic out of the box è solo
come ogni altro compilatore che conosci
lascia che JRuby lo faccia solo con un po ‘di
aiutaci possiamo fare meglio così uno dei
ottimizzazioni che abbiamo in mente è
abbiamo progettato l’API del lambda
meta Factory per avere una semantica che mappa
perfettamente al metodo gestire algebra così
la VM potrebbe guardare una cattura lambda
sito e dire oh so esattamente cosa
ha esattamente lo stesso due uomini
semantica come questo metodo equivalente
maneggiare sapete Combinator e dal
VM comprende già l’handle del metodo
semantica è un’opportunità per la VM
per poi fare cose come applicare altro
ottimizzazioni come codice motion e box
sull’eliminazione della scatola così per esempio al
cattura dopo operazione è un puro
operazione non ha effetti collaterali quindi se il
VM può intensificare l’operazione di cattura
operazione può dire va bene che posso
muovere liberamente quell’operazione di cattura
tramite una chiamata in linea, ad esempio, così io
posso differire effettivamente farlo fino a quando non lo so
Sto andando a
o se pensi all’agnello da catturare è
Essenzialmente sei un operazione di boxe
prendendo un metodo che stai boxe in
uno di questi tipi di funzioni nominali bene
le stesse tecniche che ci permettono di fare la scatola
unbox una limitazione su numeri interi potrebbe
applica alle funzioni in cui hai questo
operazione di boxe si sposta a dove
l’unbox è qual è l’ invocazione e
quindi dì semplicemente oh, cosa mi serve?
box per fammi solo invocare il metodo
gestire direttamente così con un po ‘di
lavoro nel settore dei trasporti su cui possiamo appoggiarci
altre altre ottimizzazioni esistenti come
come inlining e codice di movimento e fuga
analisi per fare l’agnello per catturare anche
più veloce, quindi è abbastanza bello
va bene quindi devo parlare
serializzazione Odio la serializzazione ma
nessuna funzionalità linguistica è mai stata completata
senza alcuna interazione con
civiltà quindi ecco perché dovevamo aver avuto
ho dovuto affrontare questo abbiamo fatto questo
decisione di rappresentare lambda come nominale
tipi di funzione quindi se abbiamo un nominale
tipo di funzione chiamato foo e un estensore
realizzabile e qui questa è una funzione
da vuoto a booleano e assegniamo a
sono molto semplici lambda per questi utenti
andare aspettarsi questo lavoro e se noi
dì che questo non funziona è solo un altro
caso limite che gli utenti abbiano a ragionare
circa di come oh questa cosa è
serializzabile se proviene da una classe ER
o nome classe ma non da un lambda così io
deve piacere la ragione della sua provenienza
e non vogliamo chiedere alle persone di fare
quella
purtroppo perché la nostra traduzione
la strategia è dinamica non possiamo solo
serializzare l’oggetto lambda perché il
la classe che rappresenta non esisterà in
questi tempi di serializzazione quindi dobbiamo
e e anche se lo facesse forse lo è
utilizzando una diversa strategia di traduzione
e vorremmo deserializzare usando
la strategia di traduzione di una VM di destinazione
quindi abbiamo questa traduzione dinamica
strategia abbiamo bisogno di una serializzazione dinamica
strategia per e senza introdurre alcuno
buchi di sicurezza che è difficile da fare
serializzazione quindi il trucco qui è giusto
come l’ agnello per catturare il sito è un
ricetta per un lambda
il modulo serializzato deve essere una ricetta
anche per il lambda e possiamo usarlo
i ganci esistenti in serializzazione letti
Risolto scrivere scrivere per serializzare su a
ricetta di qui tutte le cose che sono andate
nel sito di chiamata e poi a D
tempo di serializzazione lo ricostituiamo
dentro sai in un nuovo agnello da catturare
usando qualunque strategia di traduzione
attuale al momento quindi tutto funziona
è abbastanza brutto che Mope Feliu noterà
funzionerà ma sai che mi piacerebbe
quei mesi della mia vita indietro
va bene riassumendo così il percorso evolutivo
per l’evoluzione di una lingua è pieno di idee
questo è ovvio ma sbagliato e tu
devo davvero stare attento
queste idee ovvie ma sbagliate perché
sono così avvincenti che è come oh I
avere lo strumento perfetto tranne che non lo è
perfetto e ragazzo non è perfetto in questo
così via e quindi devi essere disposto
per continuare a guardare e alcuni di questi mi piacciono
alcuni di questi approcci che io
descritto ha preso un numero di aha momenti
per ottenere dall’ovvio ma sbagliato ma
sai a questi sono in realtà
giusto e quando colpiamo quelli giusti
era davvero ovvio che avevano ragione ma
ci è voluto molto tempo che sai di trovare
loro e quindi devi essere disposto a
continua a guardare anche se pensi di te
trovato qualcosa di così invocato dinamico
si è rivelato un ottimo strumento qui così noi
usarlo si sa catturare lambda esso
ci ha dato flessibilità e ci dà
prestazioni e ci dà il
opportunità di cambiare la nostra strategia a
runtime e persino usando la strategia stupida
che iniziamo con almeno ancora
come sai, e forse anche meglio
rispetto alle classi inter e nei casi comuni
quindi sai spero come ho detto nessuno
di voi dovrò mai sapere nulla di
questo userete solo lambda e lo farai
ottieni grandi prestazioni e sarai
felice ma sai se la prossima volta qualcuno
dice oh lambda sono solo zucchero sintattico
per le classi interne ora puoi schiaffeggiarle
intorno a Lee autorevole se lo sei
interessato a più informazioni che puoi
vai alla pagina del progetto lambda su open
JDK
puoi scaricare le specifiche che puoi
scarica il file binario che puoi scaricare
documenti di panoramica e giocare con questo
oggi o aspetta fino a quando esce otto otto
il primo trimestre del prossimo anno e con quello
abbiamo qualche domanda sulla magia
macchina delle domande va bene così prima
la domanda qui è la testa del laminato di Java
prestazione rispetto a lambda
prestazioni di altre lingue quindi
non ho dati per questo, ma sono sicuro
che li faremo saltare tutti via
perché tutti gli altri stanno usando il
stessi strumenti che abbiamo respinto anche noi
lento okay e ora ovviamente lo sono
benvenuto a usare gli strumenti che abbiamo
e mi aspetto che alcuni compilatori migreranno
per usarli ma ho un momento difficile
immaginando che faranno molto
meglio ma sono sempre disposto ad essere
provato male, okay, vediamo che non lo sono
andando a rispondere che cosa caratteristica in
Per quanto riguarda lambda che non ce l’hanno fatta
nel tuo più grande rimpianto è quello
questo è buono
faccio nemmeno una risposta per questo così
molte piccole cose non ce l’hanno fatta
che tu sai ciò che conosci
pensa cose che sarebbero poco piccole
piccoli spigoli ma in realtà non posso
pensa a qualcosa di grande che noi che noi
davvero che davvero rimpiangiamo di andarsene
forse sono solo io a convincermi
o qualcosa
tutto bene avete altre domande
sul microfono George, così ora ci hai detto
su lambda e stamattina anche tu
parlato di tipi di valore, quindi ho solo
volevo sapere se hai intenzione di dare
noi coda di coda chiama anche a un certo punto così
coda chiama così è una buona domanda e a
domanda comune che abbiamo ricevuto
ad ogni conferenza per gli ultimi 15
anni quindi cos’è ora e come
in realtà è il tempo e il motivo
questa è la ragione per cui non siamo stati in grado
fare chiamate di coda nonostante il fatto che
è così ovvio come fare chiamate tail
è stato sottile e questo è lì
è stata un’interazione tra come si potrebbe
attuare chiamate di coda sulla JVM e sul
modello di sicurezza del
JDK quindi c’è il codice nel JDK per
qualunque motivo non sappia che sono il
messaggero non mi spara
si basa su quanti frame di stack sono
c’è tra me e l’ultimo codice
il dominio va bene così se hai la lingua
runtime sistematicamente munging the the
impilare non si può contare sul fatto di poter
cammina lungo la pila e conta il
numero di frame stack e c’era
codice di sicurezza senso del codice che
dipendeva da so che quattro fotogrammi in basso
per me è il codice utente, quindi lo farò
eseguirlo con le autorizzazioni utente di
questo codice è ovviamente fragile e
e difficile ma ciò che voleva dire era noi
non potrebbe avere
non potevamo avere chiamate a coda che facevano casino
il set di stack era totalmente
motivo accidentale non ovvio perché
era l’attuazione di code call sulla JVM
solo più difficile di quanto sembrasse
per fortuna abbiamo appena passato un
enorme sforzo per strappare tutto lo stack
codice sensibile alla profondità dal JDK e
sostituirlo con un meccanismo più generale
sul codice sensibile del chiamante dove
cammina lungo la pila e cerca il
successivamente conosci il dominio di protezione come
contrario al numero specifico di stack
fotogrammi che penso abbia rimosso il
ultimo impedimento davvero serio allo spostamento
inoltrare una coda per sapere che siamo
molto più vicino ora di quanto fossimo due o
tre anni fa ma non lo farò
qualsiasi promessa su quando sarà
okay se decidi di cambiare il
strategia per genere glam ‘das che
i componenti devono cambiare il compilatore
le librerie della VM solo solo la V I’m
in realtà nemmeno la VM è l’unica cosa
ha bisogno di cambiare è un po ‘di
codice nel runtime JDK e questo è il
implementazione della meta lambda
Factory questo è qualcosa che possiamo
cambia liberamente dalla versione alla versione
anche nelle versioni di manutenzione è tutto
puro codice Java le modifiche è solo un
dettagli di implementazione quindi nessuna lingua
cambiato nessun compilatore modificato nessuna modifica VM
nessuna libreria API modifica solo la libreria
il cambiamento di implementazione è così bello
cool mmm, stavo solo chiedendo che tu abbia parlato
sui metodi del male stamattina
se hai un metodo predefinito in due
le interfacce non ti danno il
lo stesso problema di ereditarietà che
okay, la domanda è oh mio dio tu
aggiunto l’ ereditarietà multipla in Java
l’eredità multipla è davvero
complicato, questa è la tua domanda
va bene
Java ha sempre detto che qui sono i miei figli miei
risposta intelligente che Java ha sempre avuto
eredità multipla di tipi classe a
implementa ijk che è multiplo
ereditarietà cosa abbiamo aggiunto in modo predefinito
i metodi erano ereditari multipli di
comportamento in cui tutto il dolore del multiplo
l’ereditarietà deriva dal C ++
eredità multipla di stato non lo facciamo
avere più ereditarietà di stato così
le regole per risolvere i conflitti in
i metodi predefiniti sono in realtà davvero
semplice ci sono tre regole
la prima superclasse regola vince in altre
parole se la catena della superclasse ha un
l’opinione su quel metodo che hai finito no
anche guardare le interfacce sembra giusto
come ha fatto in Java 7 regola due
le sottoclassi vincono su super classi quindi se
liste e raccolta ti offrono entrambi
implementazione di alcune impostazioni predefinite che si prendono
la più specifica regola tre non regola
tre se non si ottiene una risposta unica
dalle regole 1 e 2 implementate
te stesso come se fosse astratto molto molto
i semplici diamanti non sono un problema, puoi
hanno diamanti funzionano perfettamente così tutti
delle cose di cui abbiamo paura
ereditarietà multipla su da C ++ sono
hanno tutti a che fare con multipli
Tarrance of state e noi non ce l’abbiamo
problema no, non si rompe all’indietro
compatibilità perché se stai cercando
a compatibilità per te lo sai con te
conoscere pre codice otto Java se collegato
sotto Java 7 significa che c’è un
implementazione nella catena della superclasse
regola 1 che dà la priorità al
súplica
catena superclasse significa che funziona esattamente
in Java 8 come ha funzionato in Java 7
è molto più semplice di quanto sembri lo prometto
ok, grazie a tutti per la partecipazione
grazie Brian
e buona pausa
tu
Please follow and like us: