Java è uno dei pochi linguaggi di programmazione la cui storia attraversa diverse grandi trasformazioni dell’informatica: elettronica di consumo, ascesa del Web, applicazioni aziendali, open source, smartphone e cloud.
Quando fu presentato al pubblico nel 1995, la sua promessa era riassunta da uno slogan celebre: “Write Once, Run Anywhere”, scrivere una volta ed eseguire ovunque. Java diede forma concreta a questa ambizione con una combinazione duratura: un linguaggio relativamente accessibile, bytecode, la Java Virtual Machine (JVM), gestione automatica della memoria e una libreria comune.
Eppure Java non nacque per il Web. La sua storia iniziò alcuni anni prima in un progetto dedicato al futuro dei dispositivi elettronici.
1991: il progetto Green
All’inizio degli anni Novanta Sun Microsystems era nota soprattutto per workstation Unix e informatica di rete. Alcuni ingegneri pensavano però che la successiva ondata avrebbe coinvolto anche dispositivi intelligenti di consumo: televisori interattivi, set-top box ed elettronica domestica.
Nel 1991 Sun avviò il Green Project. Tra i membri c’era James Gosling, destinato a svolgere un ruolo centrale nella progettazione del nuovo linguaggio.
Il problema era chiaro: quei dispositivi potevano usare processori e ambienti molto diversi. Mantenere una versione del software per ogni architettura sarebbe stato costoso e fragile. La portabilità divenne quindi un requisito fin dall’inizio.
Oak: Java prima di Java
Gosling sperimentò inizialmente con C e C++. C++ offriva potenti astrazioni e controllo preciso delle risorse, ma il team cercava un ambiente più semplice da distribuire su hardware eterogeneo.
Gosling creò Oak, chiamato così per una quercia visibile dal suo ufficio. Il linguaggio mantenne una sintassi familiare agli sviluppatori C e C++, eliminando però diversi meccanismi difficili da gestire. Un garbage collector recuperava automaticamente la memoria e scompariva l’aritmetica esplicita dei puntatori.
L’obiettivo non era soltanto eseguire lo stesso software altrove, ma rendere i programmi complessi più sicuri e prevedibili.
Bytecode e JVM: spostare il problema della portabilità
La scelta architetturale decisiva di Java è il modello di esecuzione. Il sorgente non viene normalmente compilato direttamente per un processore specifico, ma in un formato intermedio, il bytecode Java, eseguito da una Java Virtual Machine.
Se una piattaforma dispone di una JVM compatibile, può in linea di principio eseguire lo stesso bytecode. Invece di adattare ogni applicazione a ogni macchina, si adatta la JVM alle diverse piattaforme.
È la base del Write Once, Run Anywhere. La portabilità perfetta dipende comunque da librerie, integrazione con il sistema e implementazioni, ma questa architettura riduce fortemente il lavoro specifico per piattaforma.
Dal progetto Green al Web
Il progetto Green non ottenne il successo commerciale sperato nella televisione interattiva. Nello stesso periodo il World Wide Web stava esplodendo. Sun capì che un linguaggio progettato per dispositivi eterogenei poteva essere utile anche in una rete di computer molto diversi.
Oak dovette cambiare nome per motivi di marchio e fu scelto Java. Sun presentò pubblicamente il linguaggio nel 1995.
Sviluppò inoltre HotJava, un browser capace di eseguire piccoli programmi Java incorporati nelle pagine: le applet. Animazioni, interfacce e piccoli giochi rendevano il Web improvvisamente molto più dinamico. Netscape aggiunse rapidamente il supporto a Java, dando al linguaggio enorme visibilità.
Quella vetrina sarebbe però stata temporanea.
Java non è JavaScript
La somiglianza dei nomi crea ancora confusione, ma Java e JavaScript sono linguaggi diversi.
JavaScript fu creato nel 1995 da Brendan Eich in Netscape come linguaggio di scripting leggero per il browser. La sua evoluzione è raccontata nel nostro articolo sulla storia di JavaScript.
Java si affermò soprattutto nelle applicazioni, nei server e nei sistemi aziendali. JavaScript divenne il linguaggio nativo del browser prima di estendersi a server e molti altri ambienti.
Java 1.0: una piattaforma, non solo un linguaggio
Nel gennaio 1996 Sun pubblicò il Java Development Kit 1.0. Java era già più di una sintassi: linguaggio, compilatore, JVM, libreria standard, strumenti di sviluppo, sicurezza e caricamento dinamico delle classi formavano una piattaforma coerente.
Gli sviluppatori potevano contare su API comuni per collezioni, input/output, rete, interfacce grafiche e concorrenza. Questa base condivisa divenne importante quanto il linguaggio stesso.
Java adottò inoltre molti principi della programmazione orientata agli oggetti: classi, oggetti, incapsulamento, ereditarietà e polimorfismo. Rispetto a C++, automatizzava maggiormente la memoria ed evitava varie operazioni di basso livello, favorendo la manutenzione di grandi applicazioni nel tempo.
Java 2 e l’era aziendale
Java 1.2, pubblicato nel 1998 con il nome Java 2, organizzò la piattaforma in diverse edizioni: J2SE per usi generali, J2EE per applicazioni aziendali e J2ME per dispositivi con risorse limitate.
J2EE ebbe un ruolo decisivo. Servlet, JavaServer Pages, Enterprise JavaBeans, accesso ai database, messaggistica e application server offrivano un ambiente standardizzato per grandi sistemi distribuiti.
Java divenne comune in banche, assicurazioni, telecomunicazioni, pubbliche amministrazioni e grandi aziende. Portabilità, tipizzazione statica, garbage collection, JVM matura e numerose librerie si adattavano bene a organizzazioni che dovevano mantenere software per dieci o vent’anni.
La JVM diventa veloce
Le prime JVM avevano fama di essere lente. La situazione cambiò con i compilatori JIT (Just-In-Time), che individuano il codice eseguito frequentemente e lo trasformano in istruzioni native ottimizzate durante l’esecuzione.
La JVM può così osservare il comportamento reale e ottimizzare i percorsi effettivamente utilizzati. HotSpot, acquisito e integrato da Sun, divenne una tecnologia centrale.
Java passò gradualmente dall’essere considerato troppo lento a sostenere sistemi server di grandi dimensioni.
Perché le applet sono scomparse
Mentre Java prosperava sui server, le applet declinavano. Richiedevano plugin o installazioni locali, comportavano problemi di sicurezza e distribuzione e potevano avviarsi lentamente.
Nel frattempo HTML, CSS, JavaScript e le API Web divennero abbastanza potenti da creare interfacce ricche senza plugin. I browser finirono per abbandonare quelle tecnologie storiche.
La scomparsa delle applet non significò la scomparsa di Java: il linguaggio aveva già trovato usi molto più duraturi nei server e nei sistemi aziendali.
Java 5: modernizzare senza rompere
Nel 2004 Java 5 introdusse, tra l’altro, generics, annotazioni, enumerazioni, autoboxing e cicli for migliorati.
I generics rafforzarono la sicurezza dei tipi nelle collezioni. Le annotazioni divennero essenziali per i framework che associano metadati a classi, metodi e campi.
Questa versione mostra una sfida permanente: evolvere abbastanza da restare moderno senza sacrificare la compatibilità che rende Java prezioso.
L’ecosistema diventa importante quanto il linguaggio
Una grande parte della storia di Java si svolge fuori dalla sintassi. Apache Tomcat, Hibernate e soprattutto Spring trasformarono lo sviluppo server. Spring diffuse la dependency injection e Spring Boot semplificò poi applicazioni autonome e servizi Web.
Strumenti di build come Maven e Gradle, librerie di test e IDE quali Eclipse, IntelliJ IDEA e NetBeans resero praticabile il lavoro su basi di codice enormi. Questo tooling industriale contribuì fortemente alla longevità di Java.
OpenJDK: una piattaforma oltre un singolo fornitore
Nel 2006 Sun annunciò l’apertura di gran parte di Java. OpenJDK divenne l’implementazione open source di riferimento della piattaforma.
Quando Oracle acquisì Sun nel 2010, Java entrò in una nuova fase istituzionale, con dibattiti su licenze e governance. OpenJDK assunse però un ruolo sempre più centrale.
Oracle, Red Hat, IBM, Amazon, Microsoft e altre organizzazioni contribuiscono oggi all’ecosistema o distribuiscono proprie build. Java è diventato così un’infrastruttura condivisa molto meno dipendente da una singola distribuzione commerciale.
Android: un’altra vita per Java
Le prime generazioni dell’SDK Android usarono Java come principale linguaggio applicativo. Android non eseguiva però semplicemente le applicazioni su una JVM Java SE tradizionale: Google creò un proprio stack, prima Dalvik e poi ART.
Questa differenza e l’uso delle API Java contribuirono a una lunga disputa legale tra Oracle e Google. Java rimase comunque per anni il linguaggio simbolo dello sviluppo Android.
Kotlin ricevette in seguito supporto ufficiale e divenne preferito per molti nuovi progetti, ma una quantità enorme di codice Java resta nell’ecosistema Android.
Java 8: lambda e stream
Nel 2014 Java 8 portò una delle più importanti evoluzioni moderne. Le espressioni lambda resero più concisa l’espressione dei comportamenti e l’API Stream introdusse un modello dichiarativo per filtrare, trasformare e aggregare dati.
Java incorporò così più idee della programmazione funzionale senza abbandonare le sue fondamenta orientate agli oggetti. Java 8 rimase una versione dominante in produzione per molti anni.
La JVM diventa multilinguaggio
La JVM non è più riservata a Java. Scala combina programmazione a oggetti e funzionale, Clojure porta un approccio ispirato a Lisp, Groovy offre un linguaggio dinamico e Kotlin una sintassi moderna con forte interoperabilità Java.
Questa diversità mostra che uno dei risultati più duraturi di Java potrebbe essere proprio la macchina virtuale. Gli sviluppatori possono beneficiare di garbage collector, JIT, diagnostica ed ecosistema JVM senza scrivere direttamente Java.
Java moderno: evoluzione regolare e virtual thread
Dal 2017 Java ha adottato un ritmo di pubblicazione più regolare. Le versioni moderne hanno aggiunto moduli, var, record, text block, pattern matching, sealed class e virtual thread.
I virtual thread, sviluppati con Project Loom, permettono di gestire un numero molto elevato di attività concorrenti leggere mantenendo un modello di programmazione familiare. Sono particolarmente utili per servizi che attendono spesso rete, database o altre operazioni di I/O.
Questa evoluzione riassume la strategia di Java moderno: ridurre gli attriti storici e adattare la JVM ai nuovi carichi di lavoro preservando il più possibile le applicazioni esistenti.
Perché Java è ancora importante
Java occupa un particolare compromesso tra prestazioni, portabilità, sicurezza di esecuzione, produttività e stabilità su larga scala. Python privilegia maggiormente concisione e rapidità di sviluppo; JavaScript domina storicamente il browser; C++ offre un controllo più diretto delle risorse. Java si è radicato nei sistemi destinati a durare.
La sua longevità deriva da forte compatibilità, JVM matura, garbage collector e JIT sofisticati, enorme ecosistema, buoni strumenti diagnostici e una vastissima base di codice esistente.
Java continua a essere criticato per verbosità, consumo di memoria e costi di avvio. Record, pattern matching, nuovi garbage collector, framework come Quarkus o Micronaut e tecnologie come GraalVM affrontano progressivamente questi limiti, soprattutto in cloud e container.
Java evolve quindi soprattutto per adattamento continuo, non per reinvenzione radicale.
Da Oak a un’infrastruttura mondiale
La televisione interattiva non fu il suo grande mercato. Le applet scomparvero. Sun Microsystems cessò di esistere come azienda indipendente. Eppure Java rimase.
Le sue fondamenta - portabilità, macchina virtuale, gestione automatica della memoria, librerie comuni e compatibilità - si dimostrarono utili ben oltre il contesto originale.
Java passò da linguaggio immaginato per dispositivi elettronici a piattaforma di esecuzione globale, utilizzata direttamente da Java e da una famiglia più ampia di linguaggi e strumenti costruiti attorno alla JVM.
In sintesi
Java nacque nel 1991 nel Green Project di Sun Microsystems con il nome Oak. L’architettura basata su bytecode e JVM mirava alla portabilità tra dispositivi eterogenei.
Il Web offrì a Java la prima grande vetrina attraverso le applet, ma il successo duraturo arrivò soprattutto da server e sistemi aziendali. Java 2, Java 5 e Java 8 fecero evolvere la piattaforma mentre framework e strumenti diventavano sempre più importanti.
L’apertura di OpenJDK, la diversità dei linguaggi JVM e sviluppi moderni come i virtual thread hanno trasformato Java in un’infrastruttura che va molto oltre il linguaggio originario.
Domande frequenti
Chi ha creato Java?
Java fu progettato all’inizio degli anni Novanta in Sun Microsystems. James Gosling è generalmente considerato il suo principale creatore.
Come si chiamava originariamente Java?
Il linguaggio si chiamava inizialmente Oak e fu rinominato Java prima della presentazione pubblica del 1995.
Perché Java è portabile?
Il codice Java viene normalmente compilato in bytecode, eseguito da una JVM disponibile su diverse piattaforme. Lo stesso programma compilato può quindi funzionare in più ambienti compatibili.
Java e JavaScript sono collegati?
No. Nonostante i nomi, sono linguaggi distinti con storie, progettazioni e modelli di esecuzione differenti.
Esistono ancora le applet Java?
Sono praticamente scomparse. I browser moderni hanno eliminato i plugin necessari e gli standard Web ne hanno assorbito gli usi principali.
Cos’è OpenJDK?
OpenJDK è il progetto open source che fornisce l’implementazione di riferimento della piattaforma Java. Diverse aziende e comunità contribuiscono e distribuiscono proprie build.
Qual è la differenza tra Java e JVM?
Java è un linguaggio. La JVM è una macchina virtuale che esegue bytecode. Anche Kotlin, Scala o Clojure possono usare la JVM come piattaforma di destinazione.
Perché Java è durato così a lungo?
Portabilità, compatibilità, maturità della JVM, enorme ecosistema e adozione diffusa nelle organizzazioni hanno creato una base particolarmente duratura.