Macchina virtuale Java
La macchina virtuale Java, detta anche Java Virtual Machine o JVM, è la macchina virtuale che esegue i programmi in linguaggio bytecode, ovvero i prodotti della compilazione dei sorgenti Java. La JVM è formalmente una specifica, mantenuta da Sun Microsystems. Qualsiasi sistema che si comporti in modo coerente con tale specifica sarà quindi da considerarsi una particolare implementazione della JVM. Esistono implementazioni software per praticamente tutti i sistemi operativi moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni che operano in contesti hardware/software particolari, per esempio telefoni cellulari, e persino implementazioni hardware . Le specifiche della JVM vengono dettate e aggiornate dalla Sun Microsystems in quanto iniziatore e mantenitore del progetto, ma vengono spesso disattese dalla maggioranza delle implementazioni non-sun 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 SUN nelle JVM più recenti e usare delle API "stabili" , che cioe' siano presenti nella JVM SUN da varie versioni. A tale proposito è in atto una controversia tra la Sun e la Microsoft in quanto quest'ultima ha sviluppato una JVM per ambienti Microsoft, contravvenendo a quello che è lo spirito di Java e soprattutto il motivo del suo rapido sviluppo che consiste, appunto, nella scrittura di un codice unico in grado di comportarsi in maniera identica su tutte le macchine.
Caratteristiche della JVM
La caratteristica peculiare della JVM è la cosiddetta "portabilità" , ovvero la possibilità di essere eseguita su sistemi operativi diversi e quindi di eseguire tutti gli applicativi scritti rispettando le specifiche in questione. Rispettando in maniera egregia - molto di più di quanto ci abbiamo abituato altre software house - lo slogan della Sun "Write once, Run everywhere (scrivi una volta, esegui dappertutto), la JVM si pone come uno "strato software" e crea un ambiente Wiktionary:it:virtuale tra il Sistema Operativo vero e proprio e gli altri applicativi, così come esemplificato nello schema che segue:
Applicativi Java |
---|
Java Virtual Machine S.O. virtuale |
Sistema Operativo “reale” relativo al tipo di processore |
Tale caratteristica rende la JVM particolarmente adatta ad essere utilizzata su sistemi embedded (palmari, telefonini, etc); a questo riguardo si segnala che, per sfruttare al meglio anche hardware dalle risorse limitate, le ultime JVM Sun, così come alcune altre implementazioni reperibili, hanno metodi efficaci per ridurre il consumo di CPU, tra i quali l'HotSpot (tm). La JVM ufficiale Sun implementa due tipi di HotSpot:
- la Server HotSpot: che ha risposta minore all'avvio ma sarà tendenzialmente più efficiente durante tutta l'esecuzione;
- la Client HotSpot: che inizia subito con l'esecuzione ed è quella usata come standard dalla JVM Sun.
Per questi motivi si usa la Server HotSpot per programmi server o in generale per programmi che resteranno in esecuzione a lungo e per i quali il tempo di avvio non è importante. Un altro approccio possibile potrebbe essere compilare il programma Java in codice nativo anziché in bytecode, usando ad esempio il compilatore gcj della FSF, ma questo ridurrebbe i benefici sul fronte peculiare della portabilità.
JVM Open Source
Va inoltre detto che esistono dei progetti Open Source che non seguono le specifiche della Sun e che presentano delle caratteristiche veramente interessanti. Infatti, oltre a rendere disponibili i sorgenti (nel pieno rispetto della filosofia open source) presentano una ridottissima occupazione di memoria (intorno ai 50 KB). La prima ad essere sperimentata è stata la JVM "Waba", in grado di interpretare direttamente i bytecodes prodotti da un qualunque compilatore Java e quindi in grado di eseguire la stessa applicazione sia sul personal computer che sul palmare.