Macchina virtuale Java: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Implementazioni: fix e aggiunte
Riga 69:
=== Area di memorizzazione dei metodi ===
L'area di memorizzazione dei [[Metodo (programmazione)|metodi]] contiene le tabelle dei simboli necessari per il link dinamico, informazioni di [[Debugging|debug]] aggiuntive, ambienti di sviluppo da associare all'implementazione di qualsiasi metodo e i bytecode di Java che implementano tutti i metodi presenti nel sistema. Poiché i bytecode vengono memorizzati come flusso di byte, l'area dei metodi è allineata per byte mentre le altre aree sono allineate a parole di 32 bit.
 
=== Compilazione ''Just-In-Time'' ===
{{Vedi anche|Compilatore just-in-time}}
 
Le prime implementazioni della macchina virtuale Java erano ''[[interprete (informatica)|interpreti]]''. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano comunque molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un [[compilatore just-in-time]] (''JIT compiler''), cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel [[linguaggio macchina]] del computer ospite<ref>{{Cita libro|autore = Haase, C.|titolo = Consumer JRE: Leaner, Meaner Java Technology|anno = 2007|editore = Sun Microsystem|città = |accesso = 30 maggio 2015|url = http://www.oracle.com/technetwork/articles/javase/consumerjre-135093.html|lingua = en}}</ref>. Inoltre, questa ricompilazione è dinamica, cioè la macchina virtuale analizza costantemente il modello di esecuzione del codice (''profilattico''), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.
 
Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi propriamente compilati come il [[C++]], scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il [[garbage collection|garbage collector]], che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano [[memoria (informatica)|memoria]] e tempo di [[CPU]] in fase di esecuzione del programma finito.
 
== Implementazioni ==
Line 95 ⟶ 102:
Numerose altre parti forniscono regolarmente implementazioni della macchina virtuale Java, in genere con l'intento di competere con l'implementazione Oracle in quanto a prestazioni; in alcuni casi si tratta di implementazioni commerciali. Sono disponibili anche altre implementazioni ''[[open source]]''; fra le più note si può citare Waba<ref>[http://waba.sourceforge.net/php/waba/waba.php Waba]</ref>.
Le specifiche della JVM vengono dettate e aggiornate dalla Oracle in quanto iniziatore e mantenitore del progetto, ma vengono spesso disattese da molte delle implementazioni ''non-Oracle'' di JVM che sono in circolazione, soprattutto per quanto riguarda il [[framework]] che ogni JVM include. Di conseguenza, le diverse JVM non sono totalmente compatibili tra loro ed occorre fare attenzione nello scrivere i programmi, se si vuole che essi funzionino su ogni JVM. La cosa migliore da fare a tale scopo sarebbe non usare le ultime caratteristiche del linguaggio introdotte dalla Oracle nelle JVM più recenti e usare delle [[Application programming interface|API]] "stabili", che cioè siano presenti nella JVM Oracle da varie versioni.
 
== Compilazione ''Just-In-Time'' ==
{{Vedi anche|Compilatore just-in-time}}
Le prime implementazioni della macchina virtuale Java erano ''[[interprete (informatica)|interpreti]]''. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano comunque molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un [[compilatore just-in-time]] (''JIT compiler''), cioè un compilatore interno, che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel [[linguaggio macchina]] del computer ospite<ref>{{Cita libro|autore = Haase, C.|titolo = Consumer JRE: Leaner, Meaner Java Technology|anno = 2007|editore = Sun Microsystem|città = |accesso = 30 maggio 2015|url = http://www.oracle.com/technetwork/articles/javase/consumerjre-135093.html|lingua = en}}</ref>. Inoltre, questa ricompilazione è dinamica, cioè la macchina virtuale analizza costantemente il modello di esecuzione del codice (''profilattico''), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.
 
Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi propriamente compilati come il [[C++]], scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come il [[garbage collection|garbage collector]], che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano [[memoria (informatica)|memoria]] e tempo di [[CPU]] in fase di esecuzione del programma finito.
 
== Note ==