# Piattaforma Java

In informatica la piattaforma Java è una piattaforma software (API - application programming interface), sviluppata su specifiche e implementazioni di Sun Microsystems (acquisita nel gennaio 2010 dalla Oracle Corporation) ovvero l'ambiente di esecuzione necessario per l'esecuzione di programmi scritti in linguaggio java. Tale piattaforma ha come caratteristica il fatto di rendere possibile scrittura ed esecuzione di applicazioni indipendenti dall'hardware di esecuzione, che risulta così virtualizzato dalla piattaforma stessa, rendendo così il linguaggio java e i relativi programmi portabili su piattaforme hardware diverse (applicazioni Java girano infatti su piattaforme hardware di diversa natura (es. computer, televisore, telefono cellulare, smart card, ecc…)).

## Descrizione
### Principio di funzionamento

La piattaforma Java è composta da due blocchi costitutivi:
* la macchina virtuale Java (Java Virtual Machine o JVM)
* le API Java.
La macchina virtuale è la base della piattaforma Java, mentre le API sono una collezione di componenti software (librerie) già scritti e pronti all'uso per lo svolgimento dei compiti più disparati. Perché una applicazione software possa girare su una piattaforma Java, essa
* Deve essere scritta in un linguaggio compatibile con la macchina virtuale, ad esempio il linguaggio Java, il linguaggio Scala, e altri;
* deve essere quindi compilata, fornendo come prodotto il cosiddetto bytecode dell'applicazione;
* il bytecode verrà poi interpretato dalla macchina virtuale e quindi eseguito.
Il prodotto della fase 2 è costituito da files contenenti le istruzioni che compongono il programma. Il linguaggio in cui queste istruzioni sono espresse non è specifico di alcuna macchina o sistema operativo particolare; al contrario, viene utilizzato un linguaggio appositamente progettato per essere il più possibile 'neutro' (o più precisamente: astratto) e, quindi, indipendente dal sistema su cui verrà effettivamente eseguita l'applicazione. Questo comportamento differisce da quanto avviene in molti altri linguaggi di programmazione che, una volta compilati, producono codice macchina che può essere eseguito solo su sistemi specifici (tipicamente, lo stesso in cui è avvenuta la compilazione). Ciò permette l'indipendenza del linguaggio dalla piattaforma hardware, in quanto il bytecode prodotto è lo stesso per ogni tipologia di macchina.
Ciò rende possibile eseguire la stessa applicazione su qualsiasi macchina; l'unica cosa da cambiare è l'interprete per quella specifica macchina.
Un'implementazione della piattaforma java è il Java Runtime Environment (JRE), necessario per l'esecuzione del programma compilato, mentre per lo sviluppo dei programmi in Java a partire dal codice sorgente è necessario il Java Development Kit (JDK) che include anche il JRE. Nello sviluppo tramite IDE il JRE è linkato con le sue librerie dall'IDE stesso per l'esecuzione del programma.

### Macchina virtuale Java

La macchina virtuale è il componente della piattaforma Java che rende possibile la virtualizzazione dell'hardware sul quale l'applicazione Java gira. Essa consiste di:
* un class loader
* un class verifier
* l'interprete Java.
Il class loader carica le classi che formano il bytecode, sia dell'applicazione Java, sia delle API Java necessarie per l'esecuzione da parte dell'interprete Java.
Subito dopo il class verifier controlla che il bytecode sia valido, che non superi i limiti superiori o inferiori dello stack, assicura non esegua aritmetica dei puntatori (che potrebbe potenzialmente portare ad una violazione di memoria). Se il bytecode passa tutti questi controlli, può essere eseguito dall'interprete.
L'interprete può essere di varie forme: può essere un modulo software che interpreta il bytecode in una sola volta oppure può fare uso di un compilatore just-in-time (JIT, o Just-In-Time compiler) che traduce il bytecode in codice nativo della macchina ospitante. È anche possibile utilizzare un sistema "misto", in cui il JIT viene applicato solo alle porzioni di codice del programma utilizzate più frequentemente, mentre il resto viene interpretato. In genere, quest'ultimo approccio prevede che il JIT venga lanciato in background, mentre il programma è in esecuzione.
Una delle caratteristiche della macchina virtuale Java è che l'interprete può essere anche implementato a livello hardware, così da eseguire il bytecode come codice nativo. In altre parole, è possibile realizzare un processore il cui repertorio delle istruzioni coincida con l'insieme delle istruzioni definite dalla specifica Sun. A livello di prestazioni questa sarebbe la scelta migliore, ma la portabilità resterebbe confinata a quelle macchine che implementassero Java a livello hardware, anche se si continuerebbero ad avere tutti i vantaggi del linguaggio.
La piattaforma raggiunge performance superiori adottando uno schema nel quale l'interprete può essere eseguito alla massima velocità senza la necessità di effettuare controlli al momento dell'esecuzione; questo grazie al class verifier che esegue tutti i controlli. La piattaforma è anche dotata di un meccanismo di garbage collection che rilascia automaticamente la memoria utilizzata da oggetti che non sono più utili al programma.

### API Java

Le API Java raccolgono una gran quantità di componenti disponibili per scrivere applicazioni di qualsiasi genere. Per questo motivo la piattaforma Java è disponibile in tre configurazioni a seconda dell'uso che se ne vuole fare:
* Standard Edition. Fornisce API per le esigenze più comuni, che permette di scrivere applicazioni stand-alone, applicazioni client e server in un contesto di reti di computer, applicazioni per accesso a database, applicazioni per il calcolo scientifico e di altro tipo.
* Enterprise Edition. Permette di scrivere applicazioni distribuite.
* Micro Edition. Permette di scrivere applicazioni per i terminali mobili e, più in generale, per i dispositivi dotati di poche risorse computazionali (telefoni cellulari, palmari, smart cards ed altri).