Java: introduzione
Linguaggio Java
Java è un linguaggio nato negli anni 90. Il suo nome deriva dall’isola di Java (Giava in italiano), famosa per la produzione di caffè, bevanda preferita dai programmatori, che nell’immaginario collettivo passano notti insonni al computer. Il linguaggio nasce allo scopo di creare applicazioni multipiattaforma tramite il paradigma di programmazione ad oggetti.
Per multipiattaforma si intende che ogni applicazione Java può essere eseguita su diversi sistemi operativi o architetture hardware senza bisogno di modificare il codice sorgente. Altri linguaggi infatti richiedono sia una compilazione specifica per piattaforma, sia in alcuni casi (come nel C++) codice specificamente scritto.
In Java invece vale il principio WORA (“Write once, run everywhere”). Le applicazioni Java vengono eseguite tramite un runtime chiamato Java Virtual Machine (JVM) che viene preinstallato nel computer dove dovrà essere eseguita. Vedremo dettagliatamente la JVM più avanti.
Come detto, Java è un linguaggio di programmazione ad oggetti, anzi in un certo senso è il linguaggio di programmazione ad oggetti, in quanto questo paradigma si è sviluppato ed evoluto intorno a Java1. Con Java la programmazione ad oggetti è diventato il paradigma di programmazione dominante, che viene usato ancora oggi nella maggior parte delle applicazioni.
Java è utilizzato principalmente per la realizzazione di applicazioni lato server per il Web, in particolare nel mondo delle grandi aziende (Java Enterprise), nel cloud, nello IoT, nelle applicazioni desktop (JavaFx) e in alcuni videogiochi (come Minecraft). E’ inoltre, insieme a Kotlin, il linguaggio di riferimento per realizzare app Android.
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.java” stiamo eseguendo 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 HelloWorld
La 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 Mario
In pratica viene stampato il primo degli argomenti del programma (args[0]).
- Java non è però il primo linguaggio di programmazione ad oggetti, anche C++ lo è, così come altri linguaggi precedenti a Java, come Smalltalk ↩︎
Perché Java è così importante
Java è un linguaggio che ormai 30 anni di vita, ed in questi decenni ha subito molte evoluzioni, introducendo col tempo innovazioni come i generics, i decoratori, gli streams e le interfacce funzionali, restando al passo con i tempi e l’evoluzione delle tecnologie di questi ultimi decenni (come cloud e containerizzazione).
Resta comunque un linguaggio con una forte propensione a un formalismo lessicale senza compromessi data anche dal suo essere un linguaggio orientato agli oggetti “puro”. Questo ne fa un linguaggio talvolta verboso, talvolta un po’ rigido, e non sempre adatto sia per i progetti più semplici, sia per tutti quei progetti con forte manipolazione dei dati, dove il paradigma funzionale si rivela più efficace. Un altro problema è la mancanza ancora oggi di una tipizzazione null-safe.
Un limite è inoltre la JVM, che da una parte garantisce l’esecuzione multipiattaforma, ma dall’altra limita le prestazioni e le risorse necessarie per essere utilizzata. La compilazione JIT risolve in buona parte il problema, ma resta una sovrastruttura di cui bisogna tenere conto nella progettazione delle risorse del sistema che dovrà eseguire un programma Java.
Infine la sua curva di apprendimento, non tanto nel linguaggio, ma negli strumenti necessari per mettere in piedi una applicazione, richiedono competenze verticali molto forti, ad esempio in ambito Java Enterprise, con la conoscenza di decine di strumenti come EJB, JPA, JAX-RS, JAX-WS. JSF, o il framework Spring, per i quali sono previste competenze verticali e costose certificazioni. La messa in opera di un server Java è una attività complessa che richiede personale dedicato, rendendo quindi Java adatto soprattutto per grandi progetti.
Ma la forza di un linguaggio è data dalla sua capacità di affrontare con successo una classe di problemi garantendo applicazioni manutenibili. Ed è proprio la manutenibilità il segreto del successo di Java. Quando una applicazione raggiunge una dimensione anche di poche migliaia di righe di codice i formalismi e le regole del linguaggio sono quelle che garantiscono la coerenza interna, specie quando ci lavorano molti programmatori.
Pochi linguaggi, come Java, hanno segnato un’epoca dell’informatica, tanto da poter parlare, come per il C, di un “prima” e di un “dopo”. La programmazione ad oggetti si è evoluta intorno a Java, tutti i pattern GOF, i principi SOLID, la Dependency Injection, il TDD sono tutti pensati e progettati prima di tutto per Java. Tecnologie come il Web Service (specie SOAP) e gli OR/M sono state realizzate con Java in mente 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.
Java è quindi ancora importante per le seguenti ragioni:
- è ancora oggi il miglior linguaggio per imparare bene la programmazione ad oggetti;
- la sua base di software e librerie esistenti è tale da permettere di realizzare quasi qualsiasi cosa;
- grazie ad alcune librerie permette di creare subito applicazioni significative.
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 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. In pratica risolve tutti i difetti di Java, è più semplice, meno verboso, supporta pienamente la programmazione ad oggetti ma anche la funzionale, gestisce la tipizzazione null-safe. E’ un linguaggio che supporta sia la JVM, e quindi la possibilità di usare librerie Java manentendo compatibilità col passato. Supporta gli stessi framework di Java (Spring e Springboot) ma ne ha di propri (Kotlin multiplatform piattaforma per creare app desktop e mobile anche per Apple) ed è a tutti gli effetti l’alternativa più promettente a Java senza uscire dal mondo Java. Resta ancora poco diffuso, e subisce la concorrenza di Python e Javascript.