Java: introduzione
Linguaggio Java
Java è un linguaggio pubblicato nel 1995 dal team guidato da James Gosling per offrire una piattaforma di sviluppo secondo il paradigma ad oggetti, multipiattaforma e dedicato alle applicazioni Web. Il suo nome deriva da una marca di caffè, Java, che era la preferita dal team che progettò il linguaggio.
Java è multipiattaforma: ogni applicazione Java può essere compilata su un computer ed eseguita su tutti i sistemi che supportano Java, senza fare adattamenti. Questo principio, chiamato WORA (“Write once, run Everywhere”) richiede che sia presente sul computer di esecuzione la presenza del solo runtime, chiamato Java Virtual Machine.
Java è un linguaggio di programmazione pensato e progettato per seguire il paradigma di programmazione ad oggetti.
Java è utilizzato principalmente per la realizzazione di applicazioni lato server, per il Web, per applicazioni di grandi aziende (Java Enterprise), per le applicazioni cloud, nelle applicazioni desktop (JavaFx) e in alcuni videogiochi (come Minecraft). E’ inoltre, insieme a Kotlin, il linguaggio di riferimento di Android.
JVM
Un programma Java ha un suo compilatore, javac, che compila qualsiasi programma in linguaggio Java in un linguaggio macchina, chiamato ByteCode, indipendente da una specifica macchina fisica. Bytecode può essere eseguito esclusivamente da un runtime, chiamato Java Virtual Machine, che crea un ambiente virtuale di esecuzione del codice che contiene tutte le librerie di sistema.
Per poter eseguire un programma Java, serve quindi una JVM. La JVM è disponibile per quasi tutti i computer e sistemi operativi.
In origine il ByteCode era interpretato, e questo faceva di Java un linguaggio ibrido (Java veniva compilato, ma poi Bytecode veniva interpretato). Oggi invece anche il Bytecode viene compilato, automaticamente al primo avvio, in codice macchina nativo della macchina dove viene eseguito. Questo tipo di compilazione viene chiamata Just in Time (JIT), in contrappoazione alla compilazione classica, detta AOT (Ahead of Time).
Primo programma in Java
Per questa e le prossime lezione useremo l’IDE Visual Studio Code (VS Code).
Operazioni preliminari (da svolgere una volta sola):
- Installare il Java Development Kit. Si può installare dal sito di OpenJDK (https://jdk.java.net/24/).
- Installare anche VS Code (https://code.visualstudio.com/). Si consiglia di seguire qualche guida su VS Code (ce ne sono molte su Internet), ed in particolare abilitare il salvataggio automatico.
- Installare il seguente plugin (https://code.visualstudio.com/docs/getstarted/extensions): “Extension pack for Java” che installa quanto necessario per abilitare lo sviluppo Java su VS Code.
Primo programma
- Creare un nuovo progetto (su una cartella vuota).
- Creare un nuovo file “HelloWorld.java” e copiarci il seguente codice. Si
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}Per eseguire il codice abbiamo queste possibilità:
- Premere F5 dalla schermata dell’editor.
- Aprire una finestra di terminale ed eseguire
java HelloWorld.java
In entrambi i casi – i due comandi sono equivalenti – comparirà, da terminale la scritta Hello World.
Vediamo in dettaglio quanto appena fatto:
public class Helloworldè una dichiarazione di una classe. Le classi verranno esaminate in una lezione successiva. In questo contesto di basta sapere che la classe è un contenitore di dati e funzioni.public static void main(String[] args)è la funzione di accesso principale del programma (equivalente al main del C++). Vedremo più avanti i modificatori public e static. Invece il parametro String[] args indica un array (un elenco di argomenti) da linea di comando, cioè che potranno essere letti se l’applicazione è eseguita da linea di comando.System.out.println("Hello World!)è infine una funzione di sistema che stampa, a terminale, la stringa passata come parametro.
Quando eseguiamo il comando
java HelloWorld.javaQuesto comando esegue due operazioni:
- Compilazione del codice. Il codice viene compilato in un linguaggio intermedio, detto ByteCode. Questo codice può essere eseguito dalla JVM, una macchina virtuale che consente di eseguire qualsiasi applicazione compilata da codice Java.
- Esecuzione del codice. La JVM viene eseguita, riceve il codice ByteCode preparato e lo esegue.
Possiamo separare le due azioni:
> javac HelloWorld.java
> java HelloWorldLa prima istruzione compila il codice Java e crea un nuovo file HelloWorld.class che contiene il codice ByteCode.
La seconda istruzione esegue il file HelloWorld.class. Notare che non va usata l’estensione ma solo il nome della classe.
Modifichiamo ora il programma:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello " + args[0]);
}
}Adesso se si esegue il programma succederà questo:
> java HelloWorld.java Mario
> Hello MarioIn pratica viene stampato il primo degli argomenti del programma (args[0]).
Perchè studiare Java
Java è un linguaggio che ormai ha 30 anni di vita. La sua filosofia, oltre che essere ad oggetti e multipiattaforma, è quella di fornire sempre un formalismo rigido (e spesso verboso) in ogni sua parte, con il chiaro obiettivo di automatizzare il più possibile l’individuazione di errori da parte del compilatore e di rendere il codice più esplicativo possibile. Questo non lo rende particolarmente adatto a progetti “semplici” ed in particolar modo nei progetti didattici, dove la curva di apprendimento è più ripida, rispetto all’immediatezza di altri linguaggi come Python o Javascript.
Ha anche una serie di limiti tecnici:
- essere multipiattaforma implica una lentezza di esecuzione maggiore rispetto ad altri linguaggi; non sono presenti chiamate dirette a risorse hardware o di sistema operativo;
- non è del tutto “batterie incluse”: è presente una ampia libreria standard ma per molte applicazioni sono necessarie librerie esterne o frameworks;
- La configurazione di un progetto Java è una operazione complessa che richiede competenze verticali, a meno di usare framework esterni;
- il framework ufficiale per le grandi applicazioni, ovvero Java EE, richiede la conoscenza di parecchi strumenti non immediati, come EJB, JPA, JAX, JSF, che richiedono mesi di apprendimento;
- il design del codice è fermo a scelte fatte negli anni 90, con codice verboso e macchinoso, e con limitato supporto ai valori nullable;
- non sono presenti librerie moderne per alcune applicazioni (es. calcolo, intelligenza artificiale, ecc.).
A primo avviso sembra quindi un linguaggio “vecchio”. Ma è solo una visione parziale: col tempo molte limitazioni di linguaggio sono state superate e negli ultimi anni il deploy è stato semplificato molto grazie ai frameworks. La compilazione JIT inoltre risolve il problema della lentezza di esecuzione (inizialmente era interpretato). Infine,framework come SpringBoot e JavaFX semplificano parecchio lo sviluppo di applicazioni web e desktop.
Detto questo, la forza di questo linguaggio è data dalla sua capacità di affrontare con successo la realizzazione di applicazioni medio grandi, proprio grazie ai suoi formalismi e le sue astrazioni. Quando una applicazione raggiunge una dimensione anche di poche migliaia di righe di codice Java è realmente in grado di garantire una manutenibilità del codice impossibile con altri linguaggi.
Java resta un riferimento anche come linguaggio per apprendere la programmazione ad oggetti ed i suoi principi, i design patterns e le architetture multilayer. Tecnologie come il Web Service e gli OR/M sono state realizzate intorno Java e poi trasferite su altri linguaggi.
Questo è il motivo per cui in alcuni settori, come la programmazione lato server, su cloud, Enterprise e microservizi, Java resta uno dei principali linguaggi. Inoltre tecnologie come Spring Boot, JavaFX e Android consentono di realizzare applicazioni per la maggior parte delle piattaforme. Infine la community di sviluppo Java è una delle più grandi del mondo, garantendo quindi supporto per qualsiasi problema, complice anche il fatto che Java è totalmente open source, ed è guidato da un comitato di sviluppo del linguaggio, e non da una singola società.
Java ha quindi questi punti di forza:
- è ancora oggi il miglior linguaggio per imparare bene la programmazione ad oggetti, la tipizzazione forte ed i controlli a compile time;
- la sua comunità di sviluppo consente di risolvere qualsiasi problema pratico, resta un progetto di software free ed open;
- grazie ad alcune librerie come SpringBoot, JavaFX ed Android permette di creare applicazioni per il Web, Desktop e sistemi Android.
Alternative a Java
Le principali alternative a Java sono due.
C#
C#, il linguaggio principale della piattaforma Microsoft .NET, nasce come clone di Java (la sintassi è quasi identica) ma col tempo si è evoluto introducendo nuovi concetti che poi sono stati riportati in Java. Oggi i due linguaggi sono simili, con alcuni piccoli vantaggi in C#, ma Java resta più diffuso. Un limite di C# è quello di essere comunque legato al destino di Microsoft, ed ad un insieme di framework che non sempre si sono rivelati efficaci (come il framework MONO ed in tempi più recenti MAUI) rispetto alle controparti Java (JavaFX).
Kotlin
Kotlin si può considerare il vero erede di Java, anzi una specie di Java 2.0, perché evolve il linguaggio ma mantiene la compatibilità con JVM e librerie. Risolve molti difetti di Java, è più semplice, meno verboso, supporta pienamente la programmazione ad oggetti ma anche la funzionale, gestisce la tipizzazione null-safe. Supporta gli stessi framework di Java (Spring e Springboot) ma ne ha di propri (Kotlin multiplatform) ed è a tutti gli effetti l’alternativa più promettente a Java senza uscire dal mondo Java. Resta ancora poco diffuso, con una comunità piccola ed inoltre subisce la concorrenza di Python, Javascript e Swift.
