IL BYTECODE

java-logoIl Bytecode è il prodotto della fase di compilazione in Java. La JVM è una rappresentazione virtuale, descritta in un software di un computer reale. La JVM ha un set di istruzioni macchina, come una normale CPU. Il set di istruzioni riconosciute dalla JVM si chiama Bytecode. Le istruzioni della Java Virtual Machine sono 256 in tutto e ognuna di queste istruzioni occupa un byte. Da qui il nome di Bytecode. La compilazione di un sorgente Java tramite il comando Javac produce un file con estensione .class che contiene il Bytecode.

Bytecode

Per toccare con mano come sia in realtà il Bytecode creiamo una cartella TestBytecode e la apriamo in Visual Studio Code. Scriviamo il codice riportato in figura. Usiamo il comando javac, come si vede nel terminale del programma, per creare il file .class e il comando java per mettere in esecuzione il programma.

Test

Ora apriamo un terminale posizionandoci nella directory che contiene il file .class e digitiamo il seguente comando:

javap TestByteCode

Terminale

Questo comando ci dice da quale sorgente è stato compilato il file, ha un costruttore e due metodi main e Denominazione con i rispettivi parametri. Insomma, dal file .class risaliamo alla struttura del programma. Vediamo ora come sia possibile vedere il set di istruzioni macchina.

Diamo il comando

javap -c TestByteCode

Bytecode

LA JAVA VIRTUAL MACHINE

Vedremo cosa succede realmente quando portiamo in esecuzione un programma scritto in Java.

JVM
Class Loader

Quando mettiamo un programma in esecuzione tramite il comando java nomeclasse il primo componente che va in esecuzione nella JVM è il Class Loader. Questo componente individua il Bytecode della nostra classe eseguibile e lo carica in memoria, carica anche tutti i riferimenti ad altri file .class.

IL COMPILATORE JIT

Una volta che il Class Loader ha caricato tutti i Bytecode, quello della nostra classe eseguibile e tutte le sue classi di riferimento, passa ad un altro componente, il Bytecode Verifier. Il compito di questo componente è quello di verificare il Bytecode da alterazioni sospette che potrebbero compromettere la sicurezza del software. Al termine il JIT compiler esegue la trasformazione del Bytecode nel codice macchina della particolare piattaforma sottostante. Il JIT esegue la compilazione, semplificando molto, di un metodo alla volta e solo la prima volta che viene invocato di modo che le successive invocazioni se non è stato modificato non deve essere ricompilato. Il compilatore JIT consente di avere performance elevate dei nostri programmi Java.

JIT