Macchina virtuale Java

La macchina virtuale Java (detta anche Java Virtual Machine o JVM) è il componente della piattaforma Java responsabile per l'esecuzione dei programmi in formato bytecode.

La macchina virtuale Java (detta anche Java Virtual Machine o JVM) è il componente della piattaforma Java responsabile per l'esecuzione dei programmi in formato bytecode.

Tipicamente un programma in formato bytecode può essere ottenuto dalla compilazione di un programma equivalente in un linguaggio di programmazione di livello più alto. Tra i vari che possono essere tradotti in Java bytecode figurano Java, Groovy, Clojure, Scala, Kotlin.

Descrizione

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:

Architettura

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

Un set di istruzioni per i bytecode

Un gruppo di registri

Uno stack

Un'area di heap su cui opera la routine di garbage collection

Un'area per la memorizzazione dei metodi

Java Bytecode

Il codice sorgente di Java viene compilato in bytecode e memorizzato in file con estensione .class. Per compilare tale codice viene fornito uno strumento che prende il nome di Javac. 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 ciascun computer. L'estrema portabilità e flessibilità del codice Java sono date, appunto, da questo passaggio intermedio.

Un'istruzione di bytecode è composta da un opcode di un byte, 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 il big-endian (byte di ordine superiore), questi operandi vengono poi assemblati dal flusso di byte in fase di esecuzione. Ad esempio, un parametro a 16 bit viene rappresentato all'interno del flusso di istruzioni da due byte.

Il set di istruzioni della macchina virtuale di Java interpreta i dati nelle aree di memoria di esecuzione come appartenenti a un insieme prefissato di tipi: i tipi primitivi, che sono rappresentati da diversi tipi interi con segno (byte, short, int, long), un tipo intero senza segno (char), due tipi in virgola mobile (float e double) e in più il tipo che fa riferimento a un oggetto (puntatore a 32 bit).

Registri

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 ciascun bytecode.

La macchina virtuale Java include i seguenti registri:

pc - il program counter, indica il bytecode che sta per essere eseguito.

vars - un puntatore alla prima variabile 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 su architetture con pochi registri.

Stack

Lo stack, 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.

Un frame dello stack di Java è affine a un frame 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.

Servizi correlati

Altre voci

A

Android 15

Android 15 (nome in codice Vanilla Ice Cream) è la quindicesima versione del sistema operativo mobile Android, sviluppato dalla Open Handset Alliance, a sua volta guidata dall'azienda Google, pubblicato il 15 ottobre 2024.

Leggi la voce →
M

Microsoft Edge

Microsoft Edge è un browser web sviluppato da Microsoft, disponibile su Windows, macOS, Linux, Android e iOS. È incluso come browser predefinito in Windows 10, Windows 11, Windows 10 Mobile, Xbox One e Xbox Series X e Series S

Leggi la voce →
J

JetBrains

JetBrains (precedentemente IntelliJ) è un'azienda di sviluppo software ceca nata nel 2000 i cui strumenti hanno come mercato gli sviluppatori software e i project manager.

Leggi la voce →
I

IOS 7

iOS 7 è la settima versione del sistema operativo per dispositivi mobili iOS, sviluppato dalla Apple Inc. e successore di iOS 6. È stato annunciato durante la WWDC il 10 giugno 2013 ed è stato pubblicato il 18 settembre dello stesso anno.

Leggi la voce →
Android TVA

Android TV

Android TV è una piattaforma per smart TV sviluppata e prodotta da Google. Grazie al sistema operativo Android permette di sovrapporre un'interfaccia utente interattiva alla normale programmazione televisiva. Dall'autunno 2020 esiste anche la versione denominata Google TV di Android TV.

Leggi la voce →
S

Swift (linguaggio di programmazione)

Swift (dall'inglese "rapido, svelto") è un linguaggio di programmazione orientato agli oggetti per sistemi macOS, iPadOS, iOS, watchOS, tvOS e Linux, presentato da Apple durante la WWDC 2014.

Leggi la voce →