Macchina virtuale Java: differenze tra le versioni
Contenuto cancellato Contenuto aggiunto
→Compilazione Just-In-Time: aggiunte fonti, rimosso templ. F |
|||
Riga 1:
{{vedi anche|Architettura della macchina virtuale Java}}
La '''macchina virtuale Java''', detta anche '''Java Virtual Machine''' o '''JVM''', è il componente della [[piattaforma Java]] che [[esecuzione (informatica)|esegue]] i [[programma (informatica)|programmi]] tradotti in [[bytecode]] dopo una prima [[compilatore|compilazione]].
Line 9 ⟶ 8:
# Il bytecode viene fornito ad una macchina virtuale Java che lo esegue
Il bytecode è generalmente prodotto dalla compilazione di [[codice sorgente|codici sorgenti]] (o [[File sorgente|file sorgenti]]) scritti in linguaggio [[Java (linguaggio di programmazione)|Java]], anche se è possibile produrre bytecode partendo da altri linguaggi come [[Scala (linguaggio di programmazione)|Scala]], [[Clojure]] o [[Groovy]]<ref>
La JVM è definita da una [[specifica tecnica|specifica]], mantenuta da [[Oracle]]. Qualsiasi sistema che si comporti in modo coerente con tale specifica viene considerato come una particolare [[implementazione]] della JVM. Esistono implementazioni [[software]] per praticamente tutti i [[sistema operativo|sistemi operativi]] moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni speciali per particolari ambienti [[hardware]]/[[software]], come [[telefono cellulare|telefoni cellulari]] e [[Computer palmare|palmari]]), e persino implementazioni hardware come [[Architettura_ARM#Jazelle|Jazelle]].
Line 25 ⟶ 24:
== Implementazioni ==
=== OpenJDK e HotSpot ===
Oltre a gestire le specifiche della macchina virtuale Java, Oracle fornisce una implementazione chiamata HotSpot che è gratuita ed in parte open source. La parte non distribuibile riguarda i font, l'audio, la sicurezza e la crittografia<ref>[http://openjdk.java.net/ OpenJDK]</ref><ref>[https://www.documentcloud.org/documents/1157205-13-1021-opinion-5-7-2014-1.html Oracle America vs Google], Corte d'Appello Federale, 9 maggio 2014</ref>; le implementazioni Oracle sono in genere viste come [[implementazione di riferimento|implementazioni di riferimento]] ma sono anche ampiamente utilizzate da utenti finali, aziende e istituzioni.
=== IcedTea e Zero ===
Per sostituire le parti di HotSpot che erano sotto licenza non open, è nato il progetto IcedTea.<ref>Progetto [http://icedtea.classpath.org/wiki/Main_Page IcedTea]</ref> La macchina virtuale sviluppata in tale progetto si chiama HotSpot Zero Assembly, chiamata anche semplicemente Zero.<ref>[http://icedtea.classpath.org/wiki/ZeroSharkFaq Zero and Shark FAQ]</ref> Il progetto ha anche lo scopo di supportare un numero maggiore di famiglie di processori rispetto alla macchina virtuale di Oracle. Per fare ciò, tutto il codice assembly presente in HotSpot è stato riscritto in C++, in modo da poter essere compilato su più architetture.<ref>[https://today.java.net/pub/a/today/2009/05/21/zero-and-shark-openjdk-port.html Zero and Shark: a Zero-Assembly Port of OpenJDK]</ref>
=== Le altre implementazioni ===
Line 35 ⟶ 34:
== Compilazione ''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 (''profiling''), 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.
|