Movatterモバイル変換


[0]ホーム

URL:


Vai al contenuto
WikipediaL'enciclopedia libera
Ricerca

Macchina virtuale Java

Da Wikipedia, l'enciclopedia libera.
Logo diJava, il primolinguaggio di programmazione ad alto livello per la JVM

Lamacchina virtuale Java (detta ancheJava Virtual Machine oJVM) è il componente dellapiattaforma Java responsabile per l'esecuzione deiprogrammi in formatobytecode.

Tipicamente un programma in formato bytecode può essere ottenuto dallacompilazione di un programma equivalente in unlinguaggio di programmazione di livello più alto. Tra i vari che possono essere tradotti in Java bytecode figuranoJava,Groovy,Clojure,Scala,Kotlin.[1]

Descrizione

[modifica |modifica wikitesto]

La JVM è definita da unaspecifica, mantenuta daOracle. Qualsiasi sistema che si comporti in modo coerente con tale specifica viene considerato come una particolareimplementazione della JVM. Esistono implementazionisoftware per praticamente tutti isistemi operativi moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni speciali per particolari ambientihardware/software, cometelefoni cellulari epalmari), e persino implementazioni hardware comeJazelle.

La disponibilità di implementazioni della macchina virtuale Java per diversi ambienti operativi è la chiave dellaportabilità di Java, proclamata nellosloganwrite once, run everywhere ("scrivi una volta, esegui dappertutto"). La macchina virtuale realizza infatti unambiente di esecuzione omogeneo, che nasconde al software Java (e quindi al programmatore) qualsiasi specificità delsistema operativo sottostante:

Software applicativo Java
Java Virtual Machine
Sistema Operativo

Architettura

[modifica |modifica wikitesto]
Schema architetturale di alto livello della JVM

L'architettura di una JVM comprende in generale i seguenti elementi:

Lo stesso argomento in dettaglio:Bytecode.

Ilcodice sorgente di Java vienecompilato in bytecode e memorizzato infile conestensione.class. Per compilare tale codice viene fornito uno strumento che prende il nome diJavac. Questo strumento non viene considerato come un compilatore tradizionale proprio perché traduce il codice sorgente in bytecode. Il codice, a causa del formato, non può essere eseguito direttamente ma deve essere interpretato su ciascuncomputer. L'estremaportabilità e flessibilità del codice Java sono date, appunto, da questo passaggio intermedio.

Un'istruzione di bytecode è composta da unopcode di unbyte, che serve per identificare l'istruzione in questione, e da zero o piùoperandi, ciascuno dei quali può essere più lungo di un byte.Quando gli operandi sono più lunghi di un byte, viene memorizzato per primo ilbig-endian (byte di ordine superiore), questi operandi vengono poi assemblati dal flusso di byte in fase di esecuzione. Ad esempio, un parametro a16 bit viene rappresentato all'interno del flusso di istruzioni da due byte.Ilset di istruzioni della macchina virtuale di Java interpreta i dati nelle aree di memoria di esecuzione come appartenenti a un insieme prefissato ditipi: i tipi primitivi, che sono rappresentati da diversitipi interi con segno (byte, short, int, long), un tipo intero senza segno (char), due tipi invirgola mobile (float e double) e in più il tipo che fa riferimento a unoggetto (puntatore a32 bit).

Lo stesso argomento in dettaglio:Registro (informatica).

I registri della JVM sono affini ai registri che si trovano in un computer reale, essi contengono lo stato in cui si trova la macchina durante le operazioni, influiscono sul funzionamento di quest'ultima e vengono aggiornati dopo l'esecuzione di ciascunbytecode.

La macchina virtuale Java include i seguenti registri:

  • pc - ilprogram counter, indica il bytecode che sta per essere eseguito.
  • vars - un puntatore alla primavariabile locale del metodo attualmente in esecuzione.
  • frame - un puntatore all'ambiente di esecuzione del metodo corrente in esecuzione.
  • optop - un puntatore al vertice dello stack degli operandi, è utilizzato per valutare tutte le espressioni aritmetiche.

L'ampiezza con cui Java definisce questi registri è di 32 bit.Essendo basata sullo stack, la macchina virtuale non fa alcun uso di registri per il passaggio o l'acquisizione di argomenti; ciò che ha portato i programmatori ad optare per questa scelta è stata la semplicità e la compattezza dei bytecode che favoriscono l'implementazione della macchina virtuale suarchitetture con pochi registri.

Lostack, che è alla base del funzionamento della macchina virtuale Java, viene utilizzato per passare i parametri alle istruzioni che vengono man mano eseguite e per ricevere i risultati da queste prodotti.Unframe dello stack di Java è affine a unframe dello stack di un convenzionale linguaggio di programmazione. Ogni frame contiene le informazioni associate ad una delle chiamate a metodo "impilate" sullo stack.

Ogni frame dello stack possiede tre aree (che potrebbero essere anche vuote):

  • Le variabili locali per la chiamata al metodo
  • L'ambiente di esecuzione del metodo stesso
  • Lo stack degli operandi

Non si confonda lo stack delle chiamate a metodo con lo stack degli operandi. Quest'ultimo funziona in modo autonomo rispetto all'altro. L'unica correlazione che corre tra i due è che il secondo viene gestito in una area di memoria interna ai frames che sono presenti nel primo. Molto semplicisticamente, potremmo dire che abbiamo a che fare con uno stack nello stack.

Con il termine heap si fa riferimento a quel sito dellamemoria nella quale vengono allocati glioggetti appena creati. Al momento dell'avvio della JVM, una certa area di memoria (più ampia o ridotta a seconda dell'implementazione della macchina virtuale) viene spesso assegnata allo heap. Alcune implementazioni assegnano fin dall'avvio una ampia quantità di memoria allo heap, tenendo tale quantità costante per tutta l'esecuzione del programma; altre permettono a quest'area di espandersi fin dove concesso dall'ambiente di esecuzione (tra i fattori che influenzano questa quantità ci sono le impostazioni del sistema operativo e la disponibilità effettiva di memoria sulla macchina che sta eseguendo il programma). IlGarbage collector è deputato alla rimozione degli oggetti non più utilizzati dal programma man mano che questo è in esecuzione. Ciò consente ai programmatori di svincolarsi dal compito di liberare "manualmente" (inserendo apposite istruzioni nel codice sorgente) la memoria allocata per un oggetto quando quest'ultimo ha esaurito la sua funzione nel programma. Tale compito è addirittura obbligatorio in linguaggi come ilC++. In effetti, il garbage collector è stato progettato proprio per evitare arun-time quegli errori che derivano dalla mancatadeallocazione di memoria non più utilizzata o dal tentativo di deallocare memoria ancora in uso dal programma.

Area di memorizzazione dei metodi

[modifica |modifica wikitesto]

L'area di memorizzazione deimetodi contiene le tabelle dei simboli necessari per il link dinamico, informazioni didebug 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.

CompilazioneJust-In-Time

[modifica |modifica wikitesto]
Lo stesso argomento in dettaglio:Compilatore just-in-time.

Le prime implementazioni della macchina virtuale Java eranointerpreti. 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 uncompilatore 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 nellinguaggio macchina del computer ospite[2]. 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 ilC++, scontando il fatto di possedere degli strati di astrazione in più, e di implementare una serie di automatismi, come ilgarbage collector, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi, dall'altro consumanomemoria e tempo diCPU in fase di esecuzione del programma finito.

Implementazioni

[modifica |modifica wikitesto]
Adoptium è un gruppo di lavoro dellafondazione Eclipse che promuove l'uso delletecnologie Java. Tra l'altro distribuisce versionipronte all'uso di varie implementazioni della JVM.
Lo stesso argomento in dettaglio:HotSpot.
OpenJDK è la principale implementazionelibera dellapiattaforma Java. Include un'implementazione diHotSpot per la componente JVM.

HotSpot, ufficialmente nota comeJava HotSpot Performance Engine[3]è l'implementazione di riferimento della JVM, realizzata originariamente daSun Microsystems e successivamente gestita daOracle Corporation.

Dal 2006, con la creazione diOpenJDK, HotSpot èsoftware libero.[4]

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

Eclipse OpenJ9 (precedentemente conosciuta come IBM J9) è un'implementazione scalabile e ad alte performance della JVM, pienamente conforme allaJava Virtual Machine Specification.[8]

È parte di varie distribuzioni diOpenJDK, tra cui IBM Semeru.[9]

Rispetto aHotSpot, OpenJ9 presenta prestazioni migliori in fase di avvio e un minore utilizzo di memoria a livelli di produttività simili.[10]

Le altre implementazioni

[modifica |modifica wikitesto]

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 implementazioniopen source; fra le più note si può citare Waba[11].Le specifiche della JVM vengono dettate e aggiornate dalla Oracle in quanto iniziatore e mantenitore del progetto, ma vengono spesso disattese da molte delle implementazioninon-Oracle di JVM che sono in circolazione, soprattutto per quanto riguarda ilframework 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 delleAPI "stabili", che cioè siano presenti nella JVM Oracle da varie versioni.

Note

[modifica |modifica wikitesto]
  1. (EN) Simon Maple,The Adventurous Developer's Guide to JVM Languages, suzeroturnaround.com.URL consultato il 30 maggio 2015.
  2. (EN) Haase, C.,Consumer JRE: Leaner, Meaner Java Technology, Sun Microsystem, 2007.URL consultato il 30 maggio 2015.
  3. (EN)Sun Announces Availability of the Java HotSpot Performance Engine, suthefreelibrary.com, Sun Microsystems(archiviato dall'url originale il 1º novembre 2013).
  4. (EN)Sun Opens Java, susun.com, 13 novembre 2006(archiviato dall'url originale il 21 aprile 2007).
  5. ProgettoIcedTeaArchiviato il 6 ottobre 2014 inInternet Archive.
  6. Zero and Shark FAQ, suicedtea.classpath.org.URL consultato il 3 ottobre 2014(archiviato dall'url originale il 23 agosto 2009).
  7. Zero and Shark: a Zero-Assembly Port of OpenJDK, sutoday.java.net(archiviato dall'url originale il 6 ottobre 2014).
  8. (EN) Leonardo Zanivan,New Open Source JVM optimized for Cloud and Microservices, sumedium.com, 7 febbraio 2018.
  9. (EN)Introducing the IBM Semeru Runtimes, sudeveloper.ibm.com, 2 agosto 2021.URL consultato il 3 maggio 2024.
  10. (EN) Dan Heidinga,Eclipse OpenJ9; not just any Java Virtual Machine, sujaxenter.com, 6 agosto 2018.URL consultato il 3 maggio 2024.
  11. Waba, suwaba.sourceforge.net.

Bibliografia

[modifica |modifica wikitesto]

Voci correlate

[modifica |modifica wikitesto]

Altri progetti

[modifica |modifica wikitesto]

Altri progetti

Collegamenti esterni

[modifica |modifica wikitesto]
 Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica
Estratto da "https://it.wikipedia.org/w/index.php?title=Macchina_virtuale_Java&oldid=148049404"
Categorie:
Categorie nascoste:

[8]ページ先頭

©2009-2026 Movatter.jp