Macchina virtuale Java

piattaforma
Lo stesso argomento in dettaglio: Architettura della macchina virtuale Java.

In informatica la macchina virtuale Java (detta anche Java Virtual Machine o JVM) è il componente software della piattaforma Java che esegue i programmi tradotti in bytecode dopo la prima fase di compilazione in bytecode (tra i linguaggi di programmazione che possono essere tradotti in bytecode troviamo Java, Groovy, Clojure, Scala ed Eta).

Principio modifica

I passi che devono essere fatti per eseguire un programma scritto in linguaggio Java sono i seguenti:

  1. Un programmatore usa un editor di testo o un ambiente di sviluppo integrato come Eclipse, NetBeans o IntelliJ IDEA per scrivere una o più classi Java
  2. Un software di compilazione trasforma il programma in bytecode, che è una leggera astrazione del codice macchina
  3. Il bytecode viene fornito ad una macchina virtuale Java che lo esegue

Il bytecode è generalmente prodotto dalla compilazione di codici sorgenti (o file sorgenti) scritti in linguaggio Java, anche se è possibile produrre bytecode partendo da altri linguaggi come Scala, Kotlin, Clojure o Groovy[1].

La JVM è definita da una 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 sistemi operativi moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni speciali per particolari ambienti hardware/software, come telefoni cellulari e palmari), e persino implementazioni hardware come Jazelle.

La disponibilità di implementazioni della macchina virtuale Java per diversi ambienti operativi è la chiave della portabilità di Java, proclamata nello slogan write once, run everywhere ("scrivi una volta, esegui dappertutto"). La macchina virtuale realizza infatti un ambiente di esecuzione omogeneo, che nasconde al software Java (e quindi al programmatore) qualsiasi specificità del sistema operativo sottostante:

Software applicativo Java
Java Virtual Machine
Sistema Operativo

Implementazioni modifica

OpenJDK e HotSpot modifica

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[2][3]; le implementazioni Oracle sono in genere viste come implementazioni di riferimento, ma sono anche ampiamente utilizzate da utenti finali, aziende e istituzioni.

IcedTea e Zero modifica

Per sostituire le parti di HotSpot che erano sotto licenza non open, è nato il progetto IcedTea.[4] La macchina virtuale sviluppata in tale progetto si chiama HotSpot Zero Assembly, chiamata anche semplicemente Zero.[5] 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.[6]

Le altre implementazioni modifica

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[7]. 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 API "stabili", che cioè siano presenti nella JVM Oracle da varie versioni.

Compilazione Just-In-Time modifica

  Lo stesso argomento in dettaglio: Compilatore just-in-time.

Le prime implementazioni della macchina virtuale Java erano 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[8]. 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 collector, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito.

Note modifica

  1. ^ Simon Maple, he Adventurous Developer's Guide to JVM Languages, su zeroturnaround.com. URL consultato il 30 maggio 2015.
  2. ^ OpenJDK
  3. ^ Oracle America vs Google, Corte d'Appello Federale, 9 maggio 2014
  4. ^ Progetto IcedTea Archiviato il 6 ottobre 2014 in Internet Archive.
  5. ^ Zero and Shark FAQ, su icedtea.classpath.org. URL consultato il 3 ottobre 2014 (archiviato dall'url originale il 23 agosto 2009).
  6. ^ Zero and Shark: a Zero-Assembly Port of OpenJDK Archiviato il 6 ottobre 2014 in Internet Archive.
  7. ^ Waba
  8. ^ (EN) Haase, C., Consumer JRE: Leaner, Meaner Java Technology, Sun Microsystem, 2007. URL consultato il 30 maggio 2015.

Bibliografia modifica

Voci correlate modifica

Altri progetti modifica

Collegamenti esterni modifica

  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica