Java 9 è qui: tutto ciò che devi sapere

Java 9, formalmente, Java Platform Standard Edition versione 9, è finalmente arrivato e il suo Java Development Kit (JDK) può essere scaricato dagli sviluppatori.

Ha diverse nuove funzionalità importanti, anche se controverse, ma è anche l'ultima della linea per il vecchio stile di distribuzione di Java.

Dove scaricare Java 9 JDK

Oracle ha pubblicato il JDK di Java SE 9 e la documentazione per il download da parte degli sviluppatori.

Le nuove funzionalità chiave di Java 9

Debuttando quasi tre anni dopo Java SE 8, Java SE 9 presenta diverse modifiche all'architettura chiave, oltre a una serie di miglioramenti.

La modularità di Java 9 è un punto di svolta

Le nuove e controverse capacità di modularità, basate su Project Jigsaw, stuzzicheranno sicuramente l'interesse dei negozi Java all'avanguardia che vogliono vedere cosa ha da offrire JDK 9 ora, anche se i negozi più conservatori decidono di aspettare che la modularità maturi.

La modularità, sotto forma di Java Platform Module System, divide il JDK in una serie di moduli da combinare in fase di esecuzione, compilazione o build. La modularità è stata definita un cambiamento "transitivo", che consente la comprensione delle dipendenze tra i moduli.

La modularità di Java 9 dovrebbe consentire agli sviluppatori di assemblare e mantenere più facilmente applicazioni sofisticate. Inoltre, dovrebbe rendere Java maggiormente in grado di ridimensionarsi a dispositivi più piccoli, migliorando la sicurezza e le prestazioni.

Gli aspetti di modularità di Java 9 includono il confezionamento delle applicazioni, la modularizzazione dello stesso JDK e la riorganizzazione del codice sorgente in moduli. Il sistema di compilazione è stato migliorato per compilare i moduli e imporre i limiti dei moduli al momento della compilazione. Le immagini JDK e Java Runtime Environment (JRE) vengono ristrutturate per gestire i moduli. Inoltre, i controlli dell'interfaccia utente JavaFX e le API CSS sono ora accessibili per la modularità.

Sono supportate numerose configurazioni; di conseguenza, la scalabilità, la sicurezza e le prestazioni delle applicazioni dovrebbero essere migliorate. Il ridimensionamento più semplice di Java fino ai piccoli dispositivi è un fattore chiave dello sforzo modulare.

Grazie alla modularità, gli sviluppatori saranno in grado di costruire e gestire meglio librerie e applicazioni di grandi dimensioni sia per Java SE (Standard Edition) che per Java EE (Enterprise Edition). Ma durante lo sviluppo di Java 9 Oracle, IBM, Red Hat e altri hanno avuto grossi disaccordi su come apportare esattamente un cambiamento così radicale alla piattaforma. Il sistema del modulo stesso è stato respinto a maggio, solo per essere approvato in una seconda votazione a giugno, dopo che erano stati compiuti progressi.

Anche con l'accordo tra i principali fornitori di Java, rimane una controversia sul fatto che la modularità possa fare molto bene agli sviluppatori Java, con alcuni esperti che dicono di sì e altri che dicono di no. Indipendentemente da ciò, Java 9 è ora modularizzato.

Per rendere più facile la migrazione a Java 9 modulare, Java 9 consente un accesso riflessivo illegale per il codice sul percorso classi, utilizzato da JRE per cercare classi e file di risorse. Questa funzionalità non sarà consentita dopo Java 9.

Miglioramenti al compilatore per il codice Java 9

L'aggiornamento a Java 9 offre diverse nuove funzionalità per la compilazione del codice, la principale delle quali è la compilazione anticipata (AoT). Ancora in una fase sperimentale, questa capacità consente la compilazione di classi Java in codice nativo prima di essere lanciate nella macchina virtuale. Questa funzione ha lo scopo di migliorare il tempo di avvio di applicazioni sia piccole che grandi, con un impatto limitato sulle prestazioni di picco.

I compilatori Just-in-time (JIT) sono veloci, ma i programmi Java sono diventati così grandi che impiega molto tempo per il completo riscaldamento di JIT, lasciando alcuni metodi Java non compilati e indebolendo le prestazioni. La compilazione anticipata ha lo scopo di affrontare questi problemi.

Ma Dmitry Leskov, direttore marketing presso il fornitore di tecnologia Java Excelsior, teme che la tecnologia di compilazione anticipata non sia abbastanza matura e desidera che Oracle abbia aspettato fino a Java 10 per una versione più solida.

Java 9 offre anche la fase due della distribuzione della compilazione intelligente di Oracle. Questa funzione implica il miglioramento s javac della stabilità e della portabilità dello  strumento in modo che possa essere utilizzato nella JVM (Java Virtual Machine) per impostazione predefinita. Lo strumento sarà anche generalizzato in modo che possa essere utilizzato per grandi progetti al di fuori del JDK. JDK 9 ha anche aggiornato il  javac compilatore in modo che possa compilare programmi Java 9 da eseguire su alcune versioni precedenti di Java.

Un'altra nuova funzionalità di compilazione, ma sperimentale, è la JVM Compiler Interface (JVMCI) a livello Java. Questa interfaccia consente a un compilatore scritto in Java di essere utilizzato come compilatore dinamico dalla JVM. L'API di JVMCI fornisce meccanismi per l'accesso alle strutture della VM, l'installazione del codice compilato e il collegamento al sistema di compilazione JVM.

La scrittura di un compilatore JVM in Java dovrebbe consentire un compilatore di alta qualità che è più facile da mantenere e migliorare rispetto ai compilatori esistenti scritti in C o C ++. Di conseguenza, i compilatori scritti in Java stesso dovrebbero essere più facili da mantenere e migliorare. Altri sforzi esistenti per abilitare i compilatori in-Java includono Graal Project e Project Metropolis.

Una nuova capacità di controllo del compilatore ha lo scopo di fornire un controllo dettagliato e dipendente dal contesto del metodo dei compilatori JVM, consentendo agli sviluppatori di modificare le opzioni di controllo del compilatore in runtime senza degrado delle prestazioni. Lo strumento consente inoltre soluzioni alternative per i bug del compilatore JVM.

REPL arriva finalmente a Java 9

Java 9 presenta uno strumento REPL (read-eval-print loop), un altro obiettivo a lungo termine per Java che si sta realizzando in questa versione, dopo anni di sviluppo nell'ambito del progetto Kulia.

Chiamato jShell, REPL di Java 9 valuta in modo interattivo dichiarazioni ed espressioni dichiarative. Gli sviluppatori possono ottenere feedback sui programmi prima della compilazione semplicemente inserendo alcune righe di codice.

Le funzionalità dello strumento della riga di comando includono il completamento tramite tabulazione e l'aggiunta automatica dei punti e virgola del terminale necessari. L'API jShell consente la funzionalità jShell negli IDE e in altri strumenti, sebbene lo strumento stesso non sia un IDE.

La mancanza di una REPL è stata citata come motivo per cui le scuole si allontanano da Java. (Linguaggi come Python e Scala hanno da tempo un REPL.) Ma il fondatore del linguaggio Scala Martin Odersky mette in dubbio l'utilità di un REPL in Java, dicendo che Java è orientato alle istruzioni mentre i REPL sono orientati alle espressioni.

Miglioramenti all'API Streams in Java 9

I flussi in Java consentono agli sviluppatori di esprimere calcoli in modo che il parallelismo dei dati possa essere sfruttato in modo efficiente. La funzionalità Stream in Java 8 consente di elaborare i dati in modo dichiarativo sfruttando le architetture multicore.

In Java 9, l'API Streams aggiunge metodi per prendere e rilasciare in modo condizionale elementi da Stream, iterare su elementi Stream e creare un flusso da un valore nullable espandendo il set di API Java SE che possono servire come origini Streams.

La cache del codice può essere suddivisa in Java 9

JDK 9 consente di dividere la cache del codice in segmenti per migliorare le prestazioni e consentire estensioni come il blocco granulare. I risultati dovrebbero essere tempi di sweep migliorati a causa di iteratori specializzati che saltano il codice non di metodo; separare codice non di metodo, profilato e non profilato; e migliorare i tempi di esecuzione per alcuni benchmark. 

Migliore supporto JavaScript in Java 9 tramite Project Nashorn

Il progetto Nashorn, che fornisce un runtime JavaScript leggero per Java, viene migliorato in JDK 9. Il progetto Nashorn è stato uno sforzo per implementare un runtime JavaScript ad alte prestazioni ma leggero in Java, a seguito del progetto Rhino che è stato avviato da Netscape. Il progetto Nashorn è stato incaricato di abilitare l'incorporamento di JavaScript nelle applicazioni Java. Ha fornito a Java un motore JavaScript in JDK 8.

JDK 9 include un'API parser per l'albero della sintassi ECMAScript di Nashorn. L'API consente l'analisi del codice ECMAScript da parte di IDE e framework lato server senza dipendere dalle classi di implementazione interne di Project Nashorn.

L'API client HTTP / 2 arriva a Java 9

L'API client beta HTTP / 2 è arrivata a JDK 9, implementando in Java l'aggiornamento al protocollo HTTP principale del web. Anche WebSocket è supportato dall'API.

L'API HTTP / 2 può sostituire l'API HttpURLConnection, che ha avuto problemi, incluso l'essere progettata con protocolli ormai defunti, antecedente a HTTP / 1, essere troppo astratta e difficile da usare.

Supporto HTML5 e Unicode migliorato in Java 9

In JDK 9, lo strumento di documentazione Javadoc è stato migliorato per generare markup HTML5. È supportato anche lo standard di codifica Unicode 8.0, che aggiunge 8.000 caratteri, 10 blocchi e sei script.

L'API di sicurezza DTLS viene aggiunta a Java 9

Per sicurezza, Java 9 aggiunge un'API per DTLS (Datagram Transport Layer Security). Il protocollo è stato progettato per prevenire intercettazioni, manomissioni e falsificazione di messaggi nelle comunicazioni client / server. Viene fornita un'implementazione per entrambe le modalità client e server.

Ciò che Java 9 depreca e rimuove

Java 9 depreca o rimuove diverse funzionalità non più in voga. Il principale tra questi è l'API applet, che è deprecata. È passato di moda ora che i produttori di browser attenti alla sicurezza hanno rimosso il supporto per i plug-in del browser Java. Anche l'avvento dell'HTML5 ha contribuito alla loro scomparsa. Gli sviluppatori vengono ora guidati verso alternative come Java Web Start, per l'avvio di applicazioni da un browser o applicazioni installabili. 

Anche lo strumento appletviewer è stato deprecato.

Java 9 depreca anche il garbage collector CMS (Concurrent Mark Sweep), con supporto che cesserà in una versione futura. L'intento è accelerare lo sviluppo di altri garbage collector nella macchina virtuale HotSpot. Il garbage collector G1 a bassa pausa è destinato a sostituire a lungo termine CMS.

Nel frattempo, le combinazioni di Garbage Collection precedentemente deprecate in JDK 8 vengono rimosse in JDK 9. Queste includono combinazioni usate raramente come Incremental CMS, ParNew + SerialOld e DefNew + CMS, che hanno aggiunto ulteriore complessità alla base del codice del Garbage Collector.

Java 9 elimina anche gli avvisi Java sulle istruzioni di importazione, per aiutare a rendere le basi di codice di grandi dimensioni pulite dagli avvisi di lint. Con queste basi di codice, le funzionalità deprecate spesso devono essere supportate per qualche tempo, ma l'importazione di un costrutto deprecato non garantisce un messaggio di avviso se gli usi del costrutto sono intenzionali e soppressi.

In Java 9 è stata rimossa anche la possibilità di selezionare JRE all'avvio tramite la funzione Multiple JRE (mJRE). La funzionalità è stata utilizzata raramente, ha complicato l'implementazione del programma di avvio Java e non è mai stata completamente documentata quando ha debuttato in JDK 5.

Oracle ha rimosso l'agente JVM TI (Tool Interface) hprof (Heap Profiling), che è stato sostituito nella JVM. Anche lo strumento jhat è stato rimosso, essendo stato reso obsoleto da visualizzatori e analizzatori di heap superiori.

Java 9 è la fine della sua linea quando inizia la nuova linea Java 9

Si potrebbe dire che Java 9 sta uscendo alla grande, con tutte le nuove funzionalità. Oracle ha recentemente rivelato che Java 9 è l'ultimo del suo genere, in termini di designazione e tempo trascorso tra le versioni principali.

Da qui in poi, Java dovrebbe avere una cadenza di rilascio di sei mesi, con la prossima versione principale, che si chiamerà Java 18.3, prevista per marzo 2018, seguita da Java 18.9 sei mesi dopo.

La nuova cadenza di rilascio di Java significa anche che JDK 9 non sarà designato come rilascio di supporto a lungo termine. Invece, la prossima versione a lungo termine sarà Java 18.9.

La cadenza di rilascio più rapida di Java significa che gli sviluppatori non dovranno aspettare così a lungo per le versioni principali. Può anche significare che gli sviluppatori salteranno Java 9 e le sue caratteristiche di modularità "immature" e aspetteranno sei mesi per la nuova versione, il che probabilmente appianerà qualsiasi kinks, ha affermato Simon Maple, direttore del supporto Java presso ZeroTurnaround, fornitore di strumenti Java.