Metodologie di Programmazione: Storia

Riccardo Silvestri

Che cos'è Java

Java è un linguaggio di programmazione orientato agli oggetti (OO, Object Oriented) tipato staticamente (statically typed)1 con una sintassi simile a quella del C++. È un potente linguaggio che evita alcune caratteristiche che possono rendere poco maneggevoli altri linguaggi orientati agli oggetti come il C++.

Breve storia di Java

Nel 1991 un team di ingegneri della Sun Microsystems, guidato da Patrick Naughton e James Gosling, iniziò la progettazione di un linguaggio con l'obbiettivo di agevolare la programmazione di piccoli apparecchi elettronici. Siccome tali apparecchi non avevano grandi quantità di memoria e le CPU potevano essere le più diverse, era importante che il linguaggio producesse codice snello e che non fosse legato ad una particolare architettura hardware. Questi requisiti portarono il team ad ispirarsi ad un modello che era stato adottato da alcune implementazioni del linguaggio Pascal ai tempi dei primi personal computer. Infatti, l'inventore del Pascal, Niklaus Wirth era stato il primo a introdurre l'idea di un linguaggio portabile basato sulla generazione di codice intermedio per un computer ipotetico detto macchina virtuale (virtual machine). Gli ingegneri del team adottarono questo modello ma basarono il nuovo linguaggio sul C++ piuttosto che sul Pascal, perché la loro formazione era radicata nel mondo UNIX. All'epoca, comunque, il nuovo linguaggio non era visto come un fine ma solamente come un mezzo per la programmazione di piccoli apparecchi elettronici. Inizialmente Gosling pensò di chiamarlo Oak ispirato da una grande quercia che poteva ammirare dal suo studio, ma già esisteva un linguaggio con quel nome. Il nome Java fu poi suggerito durante una pausa in un coffee shop.

Intanto, agli inizi degli anni '90, il mercato degli apparecchi elettronici "intelligenti" non era ancora sufficientemente sviluppato e l'intero progetto rischiava il fallimento. Però, il World Wide Web e internet stavano crescendo a ritmi elevatissimi e il team si rese conto che la nascente tecnologia dei browser poteva essere notevolmente potenziata proprio da un linguaggio con le caratteristiche di Java (indipendente dall'architettura hardware, real-time, affidabile e sicuro). Nel 1995 alla conferenza SunWorld presentarono il browser HotJava scritto interamente in Java che poteva eseguire codice (Java) contenuto in pagine web (ciò che oggi è chiamato applet). Agli inizi del 1996 la Sun rilasciò la prima versione di Java e il linguaggio iniziò a suscitare un interesse crescente. La versione 1.0 di Java non era certo adeguata per lo sviluppo serio di applicazioni. Da allora il linguaggio, attraversando parecchie versioni, è stato via via arricchito e le sue librerie sono state enormemente potenziate ed ampliate fino alla più recente versione 8, rilasciata nel 2014. Attualmente Java è un linguaggio maturo ed è usato per sviluppare applicazioni su grande scala, per potenziare le funzionalità di server web, per fornire applicazioni per apparecchi elettronici di largo consumo come cellulari e smartphones e per tanti altri scopi.

La Macchina virtuale

Quando un sorgente in Java è compilato, il compilatore lo converte in byte codes che sono le istruzioni di un linguaggio macchina di una CPU virtuale chiamata appunto Macchina Virtuale Java (Java Virtual Machine), in breve JVM. La JVM non corrisponde a nessuna CPU reale e anche se potrebbe essere realizzata direttamente in hardware, è sempre implementata in software. La JVM esegue i byte codes sulla CPU del computer reale sul quale si vuole eseguire il programma Java. Quindi per poter eseguire un programma Java su un certo sistema hardware e software (ad esempio, un PC Pentium Intel con Mac OS X) è necessario vi sia installata una specifica JVM (capace di eseguire i byte codes su quel sistema).

Ci si potrebbe chiedere quali sono i vantaggi di questo passaggio per un linguaggio intermedio, i byte codes, rispetto ad un comune linguaggio interpretato. A prima vista sembra non avere altro effetto che rendere inutilmente più complicata l'esecuzione di un programma. Invece, fornisce parecchi vantaggi. Un primo vantaggio sta nel fatto che l'interprete per il linguaggio dei byte codes è molto più efficiente di un interprete per un linguaggio ad alto livello come Java. Il linguaggio dei byte codes è molto più vicino ad un linguaggio macchina di una CPU reale di quanto lo sia un qualsiasi linguaggio ad alto livello. Un secondo vantaggio proviene dall'indipendenza che il linguaggio intermedio introduce tra il linguaggio Java e le diverse architetture hardware. Ad esempio, il linguaggio Java può essere modificato o esteso senza necessariamente modificare il linguaggio dei byte codes e le relative JVM (e questo è accaduto nel corso delle varie revisioni del linguaggio). Altri vantaggi, non meno importanti, riguardano la sicurezza.

Il linguaggio intermedio dei byte codes e le relative JVM costituiscono solamente una parte del mosaico che rende il linguaggio Java uno dei linguaggi di programmazione più portabili. L'altra parte consiste nella cosiddetta piattaforma Java.

La piattaforma

Per piattaforma Java (Java platform) si intende l'insieme di tutte quelle librerie predefinite che sono disponibili in ogni installazione Java e che quindi possono essere usate da un qualsiasi programma scritto in Java. Di solito con il termine piattaforma si intende l'insieme delle API (Application Programming Interface) che sono a disposizione di un programmatore su uno specifico sistema. Queste dipendono e sono invero definite dal sistema operativo (Linux, Mac OS X, Solaris, ecc.). Ora Java non è un sistema operativo però l'ampiezza e la profondità delle API messe a disposizione dalle librerie Java (la piattaforma Java appunto) sono confrontabili con quelle definite da un sistema operativo. Così un programmatore può scrivere interamente in Java delle applicazioni senza sacrificare quelle funzionalità avanzate che sarebbero normalmente disponibili solo ad applicazioni native scritte per uno specifico sistema operativo.

Un'applicazione scritta per la piattaforma Java può essere eseguita senza cambiamenti su un qualsiasi sistema operativo che supporta la piattaforma Java. Così lo stesso programma Java può essere eseguito su una grande varietà di sistemi operativi (Microsoft Windows, Mac OS X, Linux, Solaris). Questo è sintetizzato dal motto: "write once, run anywhere".

Confronto con altri linguaggi

Prima di tutto, il confronto si impone con l'antenato diretto di Java: il C++. Non è troppo impreciso dire che Java è una versione semplificata del C++. In effetti, due aspetti tra i più ostici del C++ sono stati risolti in Java. Il primo riguarda le complicanze della gestione diretta della memoria tramite i puntatori: la gestione automatica della memoria (garbage collection) di Java elimina tali problemi. Il secondo riguarda le difficoltà relative all'ereditarietà multipla del C++ che in Java è stata "risolta" sostituendola con un meccanismo più debole ma più affidabile. Però Java non è una specie di sotto linguaggio del C++. Il linguaggio Java dispone di un supporto diretto per la programmazione concorrente che non ha una controparte nel C++.

Nel passato ci si poteva lamentare e a ragione della relativa lentezza di Java rispetto al C/C++. Ma nel corso degli anni gli interpreti Java sono stati notevolmente migliorati. Le attuali JVM sono altamente ottimizzate e includono una tecnologia chiamata Just In Time compiler (JIT) che compila al volo (cioè durante l'esecuzione del programma) parti di codice che sono eseguite ripetutamente. In alcuni casi il compilatore JIT può produrre un codice più efficiente di quello prodotto da un compilatore tradizionale perché può sfruttare le statistiche mantenute durante l'esecuzione del programma. Questa tecnologia insieme con il fatto che una parte strategica della piattaforma Java è direttamente implementata in codice nativo, fa sì che generalmente un programma Java non è significativamente più lento di un corrispondente programma scritto in C/C++.

Esistono altri linguaggi simili a Java. Sicuramente quello che più di tutti è simile a Java è il C#. Però questo linguaggio a differenza di Java, e anche del C++, non è disponibile per sistemi operativi diversi da Windows. Inoltre ci sono alcuni linguaggi più recenti come Scala e Groovy che usano e sono quindi eseguiti tramite la JVM e che possono usare gran parte della piattaforma di Java.

18 Feb 2016


  1. Un linguaggio di programmazione è tipato staticamente se il tipo di ogni variabile è determinabile al momento della compilazione. Questo permette di fare dei controlli sui tipi (type checking) prima dell'esecuzione del programma aiutando così a scoprire molti errori non profondi ma piuttosto frequenti. Anche C e C++ sono tipati staticamente mentre Python non lo è essendo un linguaggio tipato dinamicamente (dynamically typed).