Domanda

C ++ ha ereditarietà multipla. L'attuazione di ereditarietà multipla a livello di assieme può essere molto complicato, ma ci sono buone online su come questo avviene normalmente (VTables, correzioni puntatore, thunk, ecc).

Java non ha più l'ereditarietà dell'implementazione, ma ha l'ereditarietà multipla interfaccia, quindi non credo che un'implementazione dritto in avanti con un singolo vtable per classe può implementare questo. Come funziona java implementare interfacce internamente?

mi rendo conto che, contrariamente a C ++, Java viene compilato Jit, così diversi pezzi di codice possono essere ottimizzati in modo diverso, e diverse JVM potrebbero fare le cose diversamente. Quindi, c'è un po 'di strategia generale che molti JVM seguono su questo, o qualcuno sa l'attuazione di una specifica JVM?

Inoltre JVM spesso devirtualize e chiamate di metodo in linea nel qual caso non ci sono VTables o equivalente coinvolto affatto, quindi potrebbe non avere senso di chiedere sequenze di assemblaggio reali che implementano chiamate al metodo di interfaccia / virtuali, ma per scontato che la maggior parte JVMs ancora mantenere una sorta di rappresentazione generale delle classi in giro da utilizzare se non sono stati in grado di devirtualize tutto. È questo presupposto errato? Fa questo sguardo rappresentanza in alcun modo come un C ++ vtable? Se è così non hanno interfacce VTables separati e come sono questi collegati con VTables classe? Se è così in grado di istanze di oggetti hanno più puntatori vtable (classe / interfaccia VTables) come istanze di oggetti in C ++ può? Fare riferimenti di un tipo di classe e di un tipo di interfaccia allo stesso oggetto sempre hanno lo stesso valore binario oppure possono differire questi come in C ++ in cui hanno bisogno di correzioni di puntatore?

(per riferimento: questa domanda chiede qualcosa di simile circa il CLR, e sembra che vi sia una buona spiegazione in questo articolo di MSDN , tuttavia, che possono essere superate, ormai. non sono stato in grado di trovare qualcosa di simile per Java).

Modifica

  • I 'attrezzi' si intendono nel senso di "Come fa il compilatore GCC implementare intero chiamate aggiunta / funzione / etc", non nel senso di "Java classe ArrayList implementa l'interfaccia List".
  • Sono consapevole di come funziona a livello di bytecode JVM, quello che voglio sapere è che tipo di codice e Datastructures sono generati dalla JVM dopo che è caricamento fatto i file di classe e la compilazione del bytecode.
È stato utile?

Soluzione

La caratteristica fondamentale della JVM HotSpot è inline caching . Questo in realtà non significa che il metodo di destinazione è inline, tuttavia comporta un presupposto è messo nel codice JIT che ogni futura chiamata al metodo virtuale o l'interfaccia si rivolgerà la stessa attuazione (cioè che il sito chiamata è monomorfa). In questo caso, un controllo viene compilato in codice macchina se l'assunzione effettivamente detiene (vale a dire se il tipo di oggetto target è la stessa come era ultima volta), e quindi il controllo di trasferimento direttamente al metodo di destinazione - senza tavoli virtuali coinvolti a tutti. Se l'asserzione fallisce, un tentativo può essere fatto per convertire questo sito chiamata megamorphic (cioè con più tipi possibili); se ciò non riesce anche (o se non é la prima chiamata), viene eseguita una ricerca normale prolisso, utilizzando VTables (per i metodi virtuali) e itables (per interfacce).

Modifica : Il hotspot Wiki ha maggiori dettagli sui stub vtable e iTable. Nel caso polimorfica, mette ancora una versione di cache in linea nel sito chiamata. Tuttavia, il codice è in realtà uno stub che esegue una ricerca in un vtable, o un iTable. C'è uno stub vtable per ogni spostamento vtable (0, 1, 2, ...). Interface chiama aggiungere una ricerca lineare su un array di itables prima di guardare in itable (se trovato) a una data di offset.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top