Java
linguaggio di programmazione
|
---|
Logo del linguaggio
|
Autore
| James Gosling
(designer)
,
Sun Microsystems
(
programmatore
)
|
---|
Data di origine
| 23 maggio 1995
; 29 anni fa
|
---|
Ultima versione
| 21
[1]
(19 settembre 2023
; 8 mesi fa
)
|
---|
Utilizzo
| General purpose
|
---|
Paradigmi
| Multi-paradigma: generico,
orientato agli oggetti
(basato sulle classi),
funzionale
,
imperativo
,
riflettivo
, calcolo simultaneo
|
---|
Tipizzazione
| Forte
|
---|
Specifiche di linguaggio
| The Java Language Specification, Java SE 17
(
PDF
).
|
---|
Estensioni
comuni
| .java, .class,
.jar
, .jmod
|
---|
Influenzato da
| Simula
,
Ada 83
,
C++
,
Eiffel
,
Generic Java
,
Mesa
,
Modula-3
,
Oberon
,
Objective-C
,
UCSD Pascal
,
Smalltalk
|
---|
Ha influenzato
| Ada 2005
,
BeanShell
,
C#
,
Clojure
,
D
,
ECMAScript
,
Groovy
,
J#
,
JavaScript
,
PHP
,
Python
,
Scala
,
Seed7
,
Vala
|
---|
Implementazione di riferimento
|
---|
Implementazione
| interprete con JITter
|
---|
Sistema operativo
| Windows
,
Linux
,
macOS
|
---|
Licenza
| GNU General Public License
,
Java Community Process
|
---|
Sito web
| oracle.com/java/
.
java.com
.
|
---|
Modifica dati su Wikidata
·
Manuale
|
In
informatica
Java
e un
linguaggio di programmazione ad alto livello
,
orientato agli oggetti
e a
tipizzazione statica
, che si appoggia sull'
omonima piattaforma
software di
esecuzione
, specificamente progettato per essere il piu possibile indipendente dalla
piattaforma
hardware
di
esecuzione
(tramite
compilazione
in
bytecode
prima e
interpretazione
poi da parte di una
JVM
) (sebbene questa caratteristica comporti prestazioni in termini di computazione inferiori a quelle di linguaggi direttamente compilati come
C
e
C++
ovvero dunque perfettamente adattati alla piattaforma hardware).
Java e stato creato a partire da ricerche effettuate alla
Stanford University
agli inizi degli
anni novanta
. Nel
1992
nasce il linguaggio Oak (in italiano 'quercia'), prodotto da
Sun Microsystems
e realizzato da un gruppo di esperti sviluppatori capitanati da
James Gosling
.
[2]
Questo nome fu successivamente cambiato in Java (una varieta di
caffe
indonesiana
; il logo adottato e una tazzina per tale bevanda) per problemi di
copyright
: il linguaggio di programmazione Oak esisteva gia.
[3]
Per facilitare il passaggio a Java ai programmatori
old-fashioned
, legati in particolare a linguaggi come il
C++
, la
sintassi
di base (
strutture di controllo
,
operatori
ecc.) e stata mantenuta pressoche identica a quella del C++
[4]
[5]
; tuttavia a livello di linguaggio non sono state introdotte caratteristiche ritenute fonte di complessita non necessaria e che favoriscono l'introduzione di determinati bug durante la programmazione, come l'aritmetica dei puntatori e l'ereditarieta multipla delle classi.
[6]
Per le caratteristiche orientate agli oggetti del linguaggio ci si e ispirati al
C++
e soprattutto all'
Objective C
.
[7]
In un primo momento Sun decise di destinare questo nuovo prodotto alla creazione di applicazioni complesse per piccoli dispositivi elettronici; fu solo nel
1993
con l'esplosione di
internet
che Java inizio a farsi notare come strumento per iniziare a programmare per internet. Contemporaneamente Netscape Corporation annuncio la scelta di dotare il suo allora omonimo e celeberrimo
browser
della
Java Virtual Machine
(JVM). Questo segna una rivoluzione nel mondo di Internet: grazie agli
applet
le pagine web diventarono interattive a livello client, ovvero le applicazioni vengono eseguite direttamente sulla macchina dell'utente di internet e non su un server remoto. Per esempio gli utenti poterono utilizzare giochi direttamente sulle pagine web e usufruire di chat dinamiche e interattive.
Java fu annunciato ufficialmente il 23 maggio
1995
a SunWorld. Il 13 novembre
2006
la Sun Microsystems ha distribuito la sua implementazione del compilatore Java e della macchina virtuale sotto licenza
GPL
. Non tutte le piattaforme Java sono libere. L'ambiente Java libero si chiama IcedTea.
[8]
L'8 maggio
2007
Sun ha pubblicato anche le librerie, tranne alcuni componenti non di sua proprieta, sotto licenza GPL, rendendo Java un linguaggio di programmazione la cui implementazione di riferimento e libera.
[9]
Il linguaggio e definito da un documento chiamato
The Java Language Specification,
spesso abbreviato
JLS
. La prima edizione del documento e stata pubblicata nel 1996.
[10]
Da allora il linguaggio ha subito numerose modifiche e integrazioni, aggiunte di volta in volta nelle edizioni successive. A fine 2022 la versione piu recente delle specifiche e la
Java SE 19 Edition
.
[10]
Sembra che il nome 'Oak' derivasse dal fatto che Gosling e i suoi colleghi, nel periodo in cui svilupparono il linguaggio, avessero avuto come unica compagnia quella di una quercia che si trovava proprio fuori dalla finestra dell'ufficio in cui lavoravano.
Eliminato il nome 'Oak', gli ideatori del linguaggio si ispirarono al caffe presso il quale discutevano del progetto, (
Java
e una qualita di caffe dell'
omonima isola
dell'
Indonesia
), tanto che il
magic number
che identifica un
file
di
bytecode
ottenuto dalla
compilazione
di un file Java e
0xCAFEBABE
, che in
inglese
significa ragazza (babe) del caffe (cafe)
[11]
.
Una leggenda metropolitana ? mai confermata ? aggiunge che tale nome e stato anche favorito, in un secondo momento e dagli stessi creatori, come acronimo per "
Just Another Vacuum Acronym
" ("
Soltanto un altro vuoto Acronimo
"), con riferimento ironico all'altissimo numero di abbreviazioni utilizzate in ambiente informatico.
Java venne creato per cinque obiettivi primari:
[12]
- essere "semplice,
orientato agli oggetti
e familiare";
- essere "robusto e sicuro";
- essere
indipendente dalla piattaforma
;
- contenere strumenti e
librerie
per il
networking
;
- essere progettato per eseguire codice da sorgenti remote in modo sicuro.
Uno dei principi fondamentali del linguaggio e espresso dal motto
WORA
(
write once, run anywhere
, ossia "scrivi una volta, esegui ovunque"): il codice
compilato
che viene eseguito su una piattaforma non deve essere ricompilato per essere eseguito su una piattaforma diversa; infatti il prodotto della compilazione e in un formato chiamato
bytecode
che puo essere eseguito da una qualunque implementazione di un processore virtuale detto
Java Virtual Machine
; al 2014 Java risulta essere uno dei linguaggi di programmazione piu usati al mondo, specialmente per applicazioni
client-server
, con un numero di sviluppatori stimato intorno ai 9 milioni.
[13]
[14]
; un buon punto di partenza per imparare Java e il tutorial ufficiale
[15]
.
Segue il
codice sorgente
di un semplice programma che stampa il testo "
Hello world
" sulla
console
.
class
HelloWorld
{
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
"Hello World"
);
}
}
Un programma minimale in Java deve obbligatoriamente contenere la definizione di
classe
tramite la parola chiave
class
seguita dal
nome_classe
e il
metodo
main
o metodo principale nonche
entry point
del programma in cui vengono definite
variabili
, oggetti e richiamati metodi statici su variabili e/o dinamici sugli oggetti.
Nell'esempio soprastante il
main
contiene l'istruzione per la stampa a video della stringa
Hello World
; pur essendo perfettamente funzionante e semplice da comprendere, non viene sfruttata la filosofia ad oggetti che viene normalmente applicata ad ogni programma scritto in Java. Segue il codice sorgente di un programma che svolge lo stesso compito del precedente usando la
programmazione orientata agli oggetti
.
public
class
Messaggio
{
private
String
toPrint
;
public
Messaggio
(
String
print
)
{
this
.
toPrint
=
print
;
}
public
void
print
()
{
System
.
out
.
println
(
this
.
toPrint
);
}
public
static
void
main
(
String
args
[]
)
{
Messaggio
ciaoMondo
=
new
Messaggio
(
"Hello World!"
);
ciaoMondo
.
print
();
}
}
Il metodo
main
affida la stampa del messaggio a un oggetto creato apposta per questo compito, su cui e invocato il metodo dinamico
print
definito prima del main assieme al
costruttore
della classe ovvero quel particolare metodo (con ugual nome della classe) che serve per inizializzare l'attributo della classe
toPrint
dell'oggetto creato/istanziato nel main. I metodi definibili possono essere dichiarati
privati
(contrassegnati dalla parola chiave
private
) se richiamabili solo all'interno della stessa classe oppure
pubblici
(contrassegnati dalla parola chiave
public
) se richiamabili anche da altre classi, di tipo
statico
(contrassegnati dalla parola chiave
static
) se invocabili liberamente all'interno della classe (ad es. su variabili globali),
dinamici
se invocabili su oggetti.
Scrivendo nuove classi che supportano l'operazione
print
, si puo adattare il programma per mostrare messaggi di tipi radicalmente diversi, lasciando il
main
pressoche immutato, cambiando soltanto la meta riga che segue il
new
. Per esempio si puo considerare un messaggio la scritta in una
finestra
che appare sullo schermo del computer in uso, oppure una stringa inviata su connessione di rete per apparire sulla finestra di un computer
client
. Oppure il programma puo dialogare con l'utente sulla
riga di comando
o in una finestra (considerando il dialogo come un "messaggio interattivo").
Si puo modificare radicalmente il comportamento del programma con modifiche circoscritte e in punti predisposti a priori (
polimorfismo
): il programma puo resistere ad aggiornamenti ed esigenze non previste. Segue il
codice sorgente
di due programmi che mostrano lo stesso testo all'interno di una
finestra
. Il primo crea una finestra standard dove viene scritta la stringa inserita come parametro mentre il secondo programma crea una finestra rispettando i parametri (ad esempio la grandezza della finestra) inseriti nel codice.
import
javax.swing.JOptionPane
;
public
class
HelloWorld
{
public
static
void
main
(
String
[]
args
)
{
JOptionPane
.
showMessageDialog
(
null
,
"Hello World!"
);
}
}
//HelloWorld.java
package
helloworld
;
import
javafx.application.Application
;
import
javafx.event.ActionEvent
;
import
javafx.event.EventHandler
;
import
javafx.scene.Scene
;
import
javafx.scene.control.Button
;
import
javafx.scene.layout.StackPane
;
import
javafx.stage.Stage
;
public
class
HelloWorld
extends
Application
{
@Override
public
void
start
(
Stage
primaryStage
)
{
Button
btn
=
new
Button
();
btn
.
setText
(
"Say 'Hello World'"
);
btn
.
setOnAction
(
new
EventHandler
<
ActionEvent
>
()
{
@Override
public
void
handle
(
ActionEvent
event
)
{
System
.
out
.
println
(
"Hello World!"
);
}
});
StackPane
root
=
new
StackPane
();
root
.
getChildren
().
add
(
btn
);
Scene
scene
=
new
Scene
(
root
,
300
,
250
);
primaryStage
.
setTitle
(
"Hello World!"
);
primaryStage
.
setScene
(
scene
);
primaryStage
.
show
();
}
public
static
void
main
(
String
[]
args
)
{
launch
(
args
);
}
}
Il codice proposto crea degli oggetti utilizzati per gestire l'interfaccia grafica. Viene inizialmente creata una finestra il cui titolo e
Hello World!
; all'interno di questa finestra viene inserita un'etichetta che contiene al centro la scritta
Hello World!
. Infine viene stabilita la dimensione della finestra che, finalmente, viene resa visibile assieme all'etichetta che porta la scritta da visualizzare. Anche in questo codice si fa uso della programmazione a oggetti, ma in un modo diverso: il
main
non conosce i meccanismi necessari per creare una interfaccia grafica sullo schermo e questi sono decisi dalle classi JFrame e JLabel che sono state predisposte a priori (
incapsulamento
).
Java e un linguaggio
type safe
, a
tipizzazione statica
, con un
nominative
type system
, e dotato di
manifest typing
. In virtu di queste caratteristiche, viene generalmente considerato un linguaggio a
tipizzazione forte
. Il linguaggio distingue chiaramente i
tipi primitivi
che definiscono valori atomici dai
tipi strutturati
che definiscono strutture dati composte.
I tipi primitivi sono detti anche
tipi atomici
e
tipi base
e sono definiti nelle specifiche di linguaggio: di ognuno sono noti l'insieme esatto dei valori ammessi e gli operatori supportati.
I tipi strutturati sono anche
tipi riferimento
, cioe definiscono
oggetti
, e sono classi o interfacce. Tra queste, le classi degli array sono definite nelle specifiche di linguaggio; tutti gli altri tipi strutturati sono "definiti dall'utente" (
user-defined
), cioe dal programmatore. I tipi definiti dall'utente che sono legati al linguaggio per qualche motivo sono riuniti nel package
java.lang
e nei suoi sottopackage; il linguaggio stabilisce per alcuni di essi (
Object
,
String
,
Iterable
, e altri) delle regole sintattiche o semantiche aggiuntive.
I tipi riferimento includono le classi per la gestione delle stringhe, gli array e le collezioni (liste, mappe, ecc.).
- Tipi base
Tipo
|
Descrizione
|
Classe contenitore
|
byte
|
intero con segno a 8 bit
|
Byte
|
short
|
intero con segno a 16 bit
|
Short
|
int
|
intero con segno a 32 bit
|
Integer
|
long
|
intero con segno a 64 bit
|
Long
|
float
|
virgola mobile a 32 bit singola precisione (standard
IEEE 754
)
|
Float
|
double
|
virgola mobile a 64 bit doppia precisione (standard
IEEE 754
)
|
Double
|
char
|
carattere singolo
Unicode
(intero senza segno a 16 bit)
|
Character
|
boolean
|
true
o
false
|
Boolean
|
Da tutto cio consegue che i valori dei tipi base
non
sono oggetti. Tuttavia per ogni tipo base e definita una corrispondente classe, definita in gergo
tipo wrapper
o
tipo contenitore
, nel package
java.lang
, classe che permette di incapsulare dentro un oggetto un valore di tipo primitivo. Opportuni metodi della classe wrapper permettono di ottenere l'oggetto che incapsula un certo valore, e il valore incapsulato da un certo oggetto.
Dalla versione 5.0 in poi sono supportati l'
autoboxing
e l'
unboxing
che permettono di convertire da tipo primitivo a corrispondente classe
wrapper
e viceversa. Il compilatore, "dietro le quinte", traduce la conversione in una opportuna invocazione a metodo sulla classe contenitore; quindi non si tratta di una vera conversione, ma di una
sintassi comoda
che "nasconde" la creazione di un oggetto della classe wrapper. Come molti altri linguaggi di programmazione anche Java possiede tra le
strutture dati
gli
array
(vedi
array in Java
).
Valori costanti in Java si identificano con la parola chiave:
final
seguita dal tipo, nome della costante e dal valore assegnato:
final
tipo_costante <nome_costante> = valore;
esempio:
final
double
PREZZO
=
15.99
;
Per convenzione i nomi delle costanti sono tutti maiuscoli.
Inoltre e possibile dichiarare
final
anche un metodo oppure una classe quando si vuole impedire che si faccia overriding del metodo in una sottoclasse nel primo caso oppure impedire che venga creata un classe figlia a partire dalla classe in questione nel secondo caso
Sono supportate le seguenti
strutture di controllo
:
- Strutture selettive:
if ... else
e
switch
, come in C
- Strutture iterative:
while
e
do ... while
come in C
for
mutuato dal C
- for each
che agisce su un
array
o collezione
[16]
- La
gestione delle eccezioni in Java
viene gestita dalla sintassi
try ... catch ... finally
simile a quella del C++.
Al di la dei costrutti per la programmazione ad oggetti il resto della
sintassi
di Java e detta
like C
, cioe derivata o simile a quella del
linguaggio C
.
Java e un linguaggio
object-oriented
. L'idea che sta alla base della OOP e di rappresentare le entita reali o astratte che determinano le dinamiche del problema risolto dal software sotto forma di entita unitarie, dotate di specifiche d'uso e di funzionamento definite a priori. Queste entita sono chiamate
oggetti
. Le specifiche che definiscono le caratteristiche di queste unita e in base a cui le stesse vengono create o in gergo
istanziate
, sono chiamate
classi
.
Java tuttavia non e un linguaggio ad oggetti puro, ma solamente
object oriented
(orientato agli oggetti): per esempio i valori dei tipi primitivi non sono oggetti.
Nel linguaggio Java gli oggetti sono dotati di
campi
(definiti anche
attributi
o
variabili di istanza
o
di esemplare
) e di
metodi
. I metodi sono abitualmente usati per implementare agevolmente molti altri costrutti che alcuni altri linguaggi forniscono nativamente, come la gestione degli eventi (implementata attraverso i
listener
) o delle proprieta, implementate tramite gli
accessor method
e, piu in generale, con oggetti
JavaBeans
.
In Java non esistono le funzioni: i blocchi di codice che "non appartengono a nessun oggetto" sono implementati come
metodi statici
di una certa classe e quindi sono sempre dei metodi. In Java si pone un forte accento sulla distinzione tra
interfaccia
e
implementazione
di una classe o oggetto: la prima e l'insieme delle specifiche pubbliche di cui gli utilizzatori di un certo oggetto possono servirsi, mentre la seconda e l'insieme delle strutture interne e delle istruzioni eseguibili che, nel complesso, adempiono a tali specifiche. Il termine
interfaccia
e usato anche in un'altra accezione, spiegata nel seguito.
E supportata l'
ereditarieta
tra tipi. Questo permette di stabilire la
gerarchia
delle classi che compongono un programma. Il linguaggio impone che a capo della gerarchia ci sia la nota classe
java.lang.Object
.
[17]
In Java non esiste
ereditarieta multipla
tra classi.
[18]
Da un lato questo vincolo permette di avere una gerarchia di classi lineare e previene gli svantaggi introdotti dall'ereditarieta multipla. Dall'altro esso viene agevolmente superato facendo ricorso alle
interfacce
, ovvero a tipi analoghi alle classi, ma progettati apposta per essere estesi e soggetti a determinate restrizioni imposte dal linguaggio.
[19]
[20]
Di conseguenza esse forniscono alcuni vantaggi dell'ereditarieta multipla, come la possibilita che uno stesso oggetto appartenga a tipi diversi tra loro, senza gli svantaggi come l'ambiguita introdotta dal fatto che una classe possa ereditare implementazioni diverse di uno stesso metodo.
L'ereditarieta multipla in java si puo anche simulare tramite il
pattern decorator
, che se implementato correttamente, permette di "estendere" a runtime metodi e caratteristiche ad un oggetto.
Dopo l'avvento di Java l'ereditarieta singola si e gradualmente affermata come
modello standard
di ereditarieta nelle tecnologie object-oriented ed e stata abbracciata anche dai linguaggi del framework
.NET
Microsoft
. Dal Java 8 e possibile sfruttare i default method delle interfacce per costruire una seppur limitata ereditarieta multipla. Questa non intacca la linea ereditaria principale che rimane singola, ma permette di ereditare metodi da piu interfacce allo stesso tempo.
[21]
Per sviluppare programmi in Java e teoricamente sufficiente un qualsiasi
editor di testo
; in pratica, se si vuole scrivere qualcosa di piu del classico
hello world
, occorre un
ambiente di sviluppo integrato
(IDE): esistono diversi IDE (
Integrated Development Environment
, ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.
Sun (ora
Oracle
) mette a disposizione un
software development kit
specifico, chiamato
Java Development Kit
(o
JDK
), che include un certo numero di tool di uso comune, fra cui
javac
,
javadoc
,
jar
, e altri, atti ad elaborare (
compilare
) i
file sorgenti
e/o gia compilati, includendo dunque il
Java Runtime Environment
(JRE). Inoltre, nel 2019, Oracle ha rilasciato un nuovo interprete e compilatore dinamico chiamato
GraalVM
, che dal 2023 vedra alcune sue porzioni integrate all'interno di
OpenJDK
.
[22]
[23]
Essi lavorano sul codice gia scritto e salvato sul sistema: nessuno di essi fornisce un ambiente visivo di scrittura con quelle caratteristiche che tornano utili nella realizzazione di programmi complessi come l'
evidenziazione della sintassi
tramite colori diversi, l'
autocompletamento
, o la possibilita di navigare tra i sorgenti tramite il click del
mouse
.
La Oracle stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamato
NetBeans
, che puo essere scaricato da solo
[24]
, oppure (facoltativamente) con il JDK
[25]
.
- Un ambiente di sviluppo integrato open-source largamente utilizzato e
Eclipse
, donato alla comunita di sviluppatori da
IBM
e il cui sviluppo e seguito da una enorme comunita di utenti.
- Uno degli ambienti di sviluppo integrato commerciali piu diffusi e
JBuilder
prodotto dalla
Borland
.
- Un ambiente di sviluppo integrato che ha vinto diversi premi
[26]
e
IntelliJ IDEA
.
- Un ambiente di sviluppo per Java gratuito, e soprattutto leggero, e BlueJ, di chiara impostazione didattica.
- Un altro ambiente di sviluppo integrato per Java e
JCreator
, i cui pregi sono soprattutto la semplicita dell'interfaccia e la leggerezza.
- Un ambiente di sviluppo per Java (e altri linguaggi di programmazione) e
Visual Studio Code
:
software libero
e
gratuito
, anche se la versione ufficiale e sotto una
licenza proprietaria
.
I programmi scritti in linguaggio Java, dopo una fase iniziale di
compilazione
con ottenimento del cosiddetto
bytecode
, sono destinati all'
esecuzione
sulla
piattaforma Java
attraverso una fase di
interpretazione
(per questo motivo il linguaggio Java e detto anche semi-interpretato) ad opera di una
Java Virtual Machine
e in esecuzione hanno accesso alle
API
della
libreria standard
. Questi due passi forniscono un livello di astrazione che permette alle
applicazioni
di essere interamente
indipendenti dal sistema
hardware su cui esse saranno eseguite. Un'implementazione della piattaforma java e il
Java Runtime Environment
(JRE), necessario per l'esecuzione del programma compilato, mentre per lo sviluppo dei programmi in Java a partire dal codice sorgente e necessario il
Java Development Kit
(JDK) che include anche il JRE.
L'esecuzione di programmi scritti in Java deve avere un comportamento simile in contesti di esecuzione diversi. Per raggiungere questo obiettivo si lavora su livelli diversi e il primo di essi e naturalmente il linguaggio che e stato progettato appositamente proprio per questo scopo. Ad esempio esso fornisce una
sintassi
unificata per definire le
sezioni critiche
, compito che in altri linguaggi si svolge tipicamente ricorrendo a librerie di terze parti o primitive di sistema.
[27]
Inoltre praticamente non lascia spazio ai comportamenti non definiti (
undefined behavior
) o dipendenti dall'implementazione dell'
ambiente di esecuzione
.
Le specifiche di linguaggio richiedono un ambiente di esecuzione che vigila sull'esecuzione del programma e che proibisce determinate operazioni che altrimenti risulterebbero insicure. Esse fanno riferimento esplicito alla
Java Virtual Machine
, indicandola come il destinatario tipico del
bytecode
prodotto dalla
compilazione
iniziale di un programma Java, e infatti il compilatore
javac
incluso nel JDK compila proprio in bytecode. Tuttavia e possibile la compilazione verso architetture diverse, infatti e possibile produrre
codice oggetto
specifico di un certo
sistema operativo
servendosi di un compilatore apposito, ad esempio il
GNU Compiler Collection
.
In linea di principio si dovrebbe essere in grado di scrivere il programma una sola volta e di farlo eseguire dovunque, di qui il famoso slogan di Sun: "write once, run everywhere". La portabilita e un obiettivo tecnicamente difficile da raggiungere e il successo di Java in questo ambito e materia di alcune controversie. Sebbene in effetti sia possibile scrivere in Java programmi che si comportano in modo coerente attraverso molte
piattaforme
hardware diverse, questi dipendono dalle
macchine virtuali
che sono programmi a se e che hanno inevitabilmente i loro
bug
, diversi l'una all'altra: per questo e nata una parodia dello slogan di Sun "Write once, run everywhere" ("Scrivi una volta, esegui ovunque"), che e diventato "Write once,
debug
anywhere" ("Scrivi una volta,
correggi
ovunque").
[28]
Il linguaggio in se definisce solo una minima parte delle
librerie
utilizzabili in combinazione con il linguaggio stesso. La parte restante e definita dalla piattaforma su cui il programma e eseguito. La Oracle mette a disposizione tre piattaforme ufficiali, ciascuna destinata ad ambiti diversi:
In aggiunta il
programmatore
puo utilizzare un numero arbitrario di librerie di terze parti. Queste librerie, contenute in vari
package
, vengono utilizzate dal
programmatore
per utilizzare determinati
metodi
o
attributi
comuni per semplificare e uniformare i
programmi
e renderli maggiormente leggibili ai programmatori. Esistono numerosissimi package utilizzabili dai programmatori nel
linguaggio Java
. Ad esempio esistono package:
Le specifiche di linguaggio non impongono una determinata sintassi per la documentazione dei sorgenti, tuttavia nel tempo si e imposto come formato standard quello riconosciuto dal tool
Javadoc
e regolato da specifiche ufficiali ben definite (seppure esterne al linguaggio)
[29]
. Questo standard prevede che la documentazione sia fornita all'interno di commenti inseriti direttamente nei sorgenti e dotati di una speciale formattazione, che viene ignorata dal compilatore, ma riconosciuta da tool specializzati. Cio rende facile aggiornare la documentazione, in quanto essa accompagna direttamente l'elemento sintattico da essa marcato; inoltre, durante la lettura dei sorgenti di un programma, cio permette di avere sott'occhio insieme le specifiche e l'implementazione dell'elemento di programma preso in considerazione.
Un altro strumento utilizzabile per la documentazione sono le
annotazioni
, introdotte nella terza versione delle specifiche di linguaggio
[30]
. Pur avendo una sintassi formalmente differente dai commenti Javadoc, esse sono usate per lo stesso scopo, cioe fornire
metadati
che descrivono le entita di programma marcate. Tuttavia, mentre i commenti riportano le specifiche in maniera discorsiva (seppure strutturata), le annotazioni per loro stessa natura sono ideali per l'elaborazione tramite i tool, piu che per la lettura da parte di esseri umani. Inoltre, sotto opportune condizioni
[31]
, le informazioni che forniscono sono compilate insieme al codice e possono essere lette perfino a
tempo di esecuzione
, cosa che i commenti non possono fare.
Nel settembre 2017, Mark Reinhold, chief Architect della piattaforma Java, ha proposto di modificare il piano di pubblicazione, da una versione ogni due anni agli attuali sei mesi. Non tutte le versioni pero hanno un supporto prolungato (LTS - Long Term Support), quest'ultime vengono pubblicate ogni 3 anni, attualmente sono LTS la versione 17, 11 e la 8.
Versione
|
Data pubblicazione
|
End of Free
Public Updates
[32]
[33]
[34]
[35]
|
Extended
Support Until
|
Vecchia versione non piu supportata:
JDK Beta
|
1995
|
?
|
?
|
Vecchia versione non piu supportata:
JDK 1.0
|
gennaio 1996
|
?
|
?
|
Vecchia versione non piu supportata:
JDK 1.1
|
febbraio 1997
|
?
|
?
|
Vecchia versione non piu supportata:
J2SE 1.2 Playground
|
dicembre 1998
|
?
|
?
|
Vecchia versione non piu supportata:
J2SE 1.3 Kestrel
|
maggio 2000
|
?
|
?
|
Vecchia versione non piu supportata:
J2SE 1.4 Merlin
|
febbraio 2002
|
ottobre 2008
|
febbraio 2013
|
Vecchia versione non piu supportata:
J2SE 5.0 Tiger
|
settembre 2004
|
novembre 2009
|
aprile 2015
|
Vecchia versione non piu supportata:
Java SE 6 Mustang
|
dicembre 2006
|
aprile 2013
|
dicembre 2018
dicembre 2026, supporto a pagamento per Azul Platform Core
[36]
marzo 2026 per Liberica JDK BellSoft
[37]
|
Vecchia versione non piu supportata:
Java SE 7 Dolphin
|
luglio 2011
|
aprile 2015
|
luglio 2022
marzo 2026 per Liberica JDK BellSoft
[38]
|
Versione precedente ancora supportata:
Java SE 8 (LTS)
|
marzo 2014
|
gennaio 2019 per uso commerciale Oracle
dicembre 2030 per uso non commerciale Oracle
dicembre 2030 per Azul
Almeno maggio 2026 per AdoptOpenJDK
Almeno maggio 2026 per Amazon Corretto
marzo 2031 per Liberica JDK BellSoft
[39]
|
dicembre 2030
|
Vecchia versione non piu supportata:
Java SE 9
|
settembre 2017
|
marzo 2018 per OpenJDK
|
Non disponibile
|
Vecchia versione non piu supportata:
Java SE 10
|
marzo 2018
|
settembre 2018 per OpenJDK
|
Non disponibile
|
Versione precedente ancora supportata:
Java SE 11 (LTS)
|
settembre 2018
|
settembre 2026 per Azul
Almeno ottobre 2024 per AdoptOpenJDK
Almeno settembre 2027 per Amazon Corretto
Almeno ottobre 2024 per Microsoft
[40]
[41]
marzo 2027 per Liberica JDK BellSoft
[42]
|
settembre 2026
settembre 2028 per Azul
[36]
|
Vecchia versione non piu supportata:
Java SE 12
|
marzo 2019
|
settembre 2019 per OpenJDK
|
Non disponibile
|
Vecchia versione non piu supportata:
Java SE 13
|
settembre 2019
|
marzo 2020 per OpenJDK
|
Non disponibile
|
Vecchia versione non piu supportata:
Java SE 14
|
marzo 2020
|
settembre 2020 per OpenJDK
|
Non disponibile
|
Vecchia versione non piu supportata:
Java SE 15
|
septembre 2020
|
marzo 2021 per OpenJDK
marzo 2023 per Azul
[36]
|
N.D.
|
Vecchia versione non piu supportata:
Java SE 16
|
marzo 2021
|
settembre 2021 per OpenJDK
|
Non disponibile
|
Versione precedente ancora supportata:
Java SE 17 (LTS)
|
septembre 2021
|
settembre 2029 per Azul
Almeno settembre 2027 per Microsoft
marzo 2030 per Liberica JDK BellSoft
[43]
|
settembre 2029 o successivo
settembre 2031 per Azul Platform Prime
|
Vecchia versione non piu supportata:
Java SE 18
|
marzo 2022
|
settembre 2022 per OpenJDK
|
Non disponibile
|
Vecchia versione non piu supportata:
Java SE 19
|
settembre 2022
|
marzo 2023 per OpenJDK
|
Non disponibile
|
Versione stabile corrente:
Java SE 20
|
marzo 2023
|
settembre 2023 per OpenJDK
|
Non disponibile
|
Versione futura:
Java SE 21
|
settembre 2023
|
settembre 2028
marzo 2032 per Liberica JDK BellSoft
[44]
|
settembre 2031 per Oracle
|
Legenda:
Vecchia versione
Versione precedente ancora supportata
Versione corrente
Ultima versione di anteprima
Versione futura
|
Java fu inizialmente distribuito come Java Development Kit 1.0 (JDK 1.0). Questo comprende il
runtime Java
(la virtual machine e le librerie di classi), e gli strumenti di sviluppo (il compilatore Java e altri strumenti). Successivamente, Sun forni un pacchetto che comprendeva solo il runtime, chiamato Java Runtime Environment (JRE). Normalmente le persone si riferiscono ad una particolare versione di Java attraverso la versione del JDK (es. JDK 1.4) Le versioni JDK 1.2 e successive sono spesso chiamate Java 2. Per esempio, il nome ufficiale del JDK 1.4 e Java (TM) 2 Platform, Standard Edition 1.4.
Il linguaggio e rimasto stabile dal JDK 1.0 al JDK 1.4.x, con la
J2SE 5.0
sono state introdotte nuove funzionalita nel linguaggio. La libreria di classi che viene fornita con JDK e stata progressivamente ampliata e modificata in alcune parti.
Nel settembre 2017 Mark Reinhold, responsabile capo per la piattaforma Java ha proposto di pubblicare una nuova versione di Java ogni 6 mesi, invece di ogni 2 anni come avveniva precedentemente.
- Versioni delle specifiche di linguaggio
I cambiamenti nel linguaggio sono formalizzati nelle specifiche di linguaggio. Ogni nuova edizione delle specifiche integra i cambiamenti richiesti fino a quel momento tramite le
Java Specification Request
e conseguentemente implementati nel compilatore
javac
.
- The Java Programming Language, First Edition
- The Java Programming Language, Second Edition
- The Java Programming Language, Third Edition
- The Java Programming Language, Java SE 7 Edition
- The Java Programming Language, Java SE 8 Edition
- The Java Programming Language, Java SE 9 Edition
- ^
(
EN
)
JDK 21
, su
openjdk.org
.
- ^
The Java Language Specification
, su
java.sun.com
.
URL consultato il 5 maggio 2011
.
- ^
JavaWorld.com, "So why did they decide to call it Java?"
, su
javaworld.com
.
URL consultato il 5 maggio 2011
(archiviato dall'
url originale
il 3 agosto 2009)
.
- ^
Come indicato in
Design Goals of the Java(TM) Programming Language: Simple, Object Oriented, and Familiar
, su
java.sun.com
.
URL consultato il 6 maggio 2011
.
- ^
The Java Language Environment
.
- ^
The Java Language Environment
.
- ^
The Java(tm) Language: An Overview
.
- ^
"Q: What components of the JDK software are you open sourcing today? A: We're open sourcing the Java programming language compiler ("javac"), and the Java HotSpot virtual machine."
Free and Open Source Java FAQ
(archiviato dall'
url originale
il 3 marzo 2012)
.
; the source is being released via the
OpenJDK
(archiviato dall'
url originale
l'11 giugno 2007)
.
project.
- ^
Open JDK is here!
(
TXT
), su
mail.openjdk.java.net
, Sun Microsystems, 8 maggio 2007.
URL consultato il 9 maggio 2007
.
- ^
a
b
The Java Language Specification
, su
java.sun.com
.
URL consultato il 5 maggio 2011
.
- ^
James Gosling private communication to Bill Bumgarner
, su
radio.weblogs.com
.
URL consultato il 1º agosto 2011
(archiviato dall'
url originale
il 23 maggio 2009)
.
- ^
Design Goals of the Java(TM) Programming Language
, su
java.sun.com
.
URL consultato il 6 maggio 2011
.
- ^
Programming Language Popularity
, su
langpop.com
, 2014.
URL consultato il 7 febbraio 2014
(archiviato dall'
url originale
il 27 maggio 2012)
.
- ^
TIOBE Programming Community Index
, su
tiobe.com
, 2009.
URL consultato il 6 maggio 2009
.
- ^
The Java Tutorials
.
- ^
in particolare e definito per lavorare su un qualunque oggetto che sia istanza di
java.lang.Iterable
.
- ^
James Gosling, Bill Joy, Guy Steele, Gilad Bracha,
Chapter 4. Types, Values, and Variables
, in
The Java Language Specification, Third Edition
.
URL consultato il 6 maggio 2011
.
- ^
Le specifiche di linguaggio non ammettono l'indicazione di piu di una superclasse nella definizione di una data classe: vedi
Java SE Specifications
.
,
Java SE Specifications
.
- ^
The Java Language Environment, "Java language Interfaces"
, su
java.sun.com
.
URL consultato il 6 maggio 2011
.
- ^
James Gosling, Bill Joy, Guy Steele, Gilad Bracha,
Chapter 9. Interfaces
, in
The Java Language Specification, Third Edition
.
URL consultato il 7 maggio 2011
.
- ^
Java 8 explained: Default methods
, su
zeroturnaround.com
.
URL consultato il 3 aprile 2016
.
- ^
(
EN
) Oleg ?elajev,
Announcing GraalVM 19
, su
graalvm
, 12 maggio 2019.
URL consultato il 6 luglio 2023
.
- ^
(
EN
)
GraalVM Java Compilers Join OpenJDK in 2023, Align with OpenJDK Releases and Processes
, su
InfoQ
.
URL consultato il 6 luglio 2023
.
- ^
Welcome to NetBeans
.
- ^
Java SE Downloads
.
- ^
Awards
.
- ^
The Java Language Environment
, su
java.sun.com
.
URL consultato il 6 maggio 2011
.
- ^
William Wong,
Write Once, Debug Everywhere
, su
electronicdesign.com
.
URL consultato il 3 agosto 2008
(archiviato dall'
url originale
il 21 marzo 2009)
.
So far, the "write-once, run-everywhere" promise of Java hasn't come true. The bulk of a Java application will migrate between most Java implementations, but taking advantage of a VM-specific feature causes porting problems.
- ^
How to Write Doc Comments for the Javadoc Tool
, su
oracle.com
.
URL consultato il 16 giugno 2011
.
- ^
The Java Language Specification, Annotations
, su
java.sun.com
.
URL consultato il 16 giugno 2011
.
- ^
Il tipo che definisce l'annotazione in uso deve essere stato marcato con la meta-annotazione
@Retention
. Vedi
The Java Language Specification, Interfaces
, su
java.sun.com
.
URL consultato il 16 giugno 2011
.
- ^
Oracle Java SE Support Roadmap
, su
oracle.com
.
- ^
Support | AdoptOpenJDK
, su
adoptopenjdk.net
.
- ^
Amazon Corretto 8 & 11 support extended
, su
aws.amazon.com
.
- ^
Azul Java Support Roadmap
, su
kr.azul.com
.
URL consultato il 27 agosto 2021
(archiviato dall'
url originale
il 22 settembre 2021)
.
- ^
a
b
c
(
EN
)
Azul Support Roadmap
, su
Azul | Better Java Performance, Superior Java Support
.
URL consultato l'8 luglio 2021
.
- ^
Liberica JDK 6 roadmap
, su
bell-sw.com
.
- ^
Liberica JDK 7 roadmap
, su
bell-sw.com
.
- ^
Liberica JDK 8 roadmap
, su
bell-sw.com
.
- ^
(
EN
)
Support roadmap for the Microsoft Build of OpenJDK
, su
docs.microsoft.com
.
URL consultato il 3 agosto 2021
.
- ^
(
EN
)
Announcing General Availability of Microsoft Build of OpenJDK
, su
Java at Microsoft
, 25 maggio 2021.
URL consultato il 3 agosto 2021
.
- ^
Liberica JDK 11 roadmap
, su
bell-sw.com
.
- ^
Liberica JDK 17 roadmap
, su
bell-sw.com
.
- ^
Liberica JDK 21 roadmap
, su
bell-sw.com
.
- Fonti usate per la stesura della voce
- Specifiche di linguaggio
Le diverse edizioni delle specifiche sono
accessibili sul sito della Oracle
.
L'ultima edizione e la seguente:
- (
EN
) James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley,
The Java Language Specification, Java SE 8 Edition
(
PDF
).
URL consultato il 18 marzo 2014
.
- (
EN
) James Gosling, Bill Joy, Guy Steele, Gilad Bracha, Alex Buckley,
The Java Language Specification, Java SE 7 Edition
(
PDF
).
URL consultato il 28 agosto 2012
.
- Testi di approfondimento
- (
EN
)
Sito ufficiale
, su
oracle.com
.
- Java
, su
Treccani.it ? Enciclopedie on line
,
Istituto dell'Enciclopedia Italiana
.
- (
EN
)
Java
, su
Enciclopedia Britannica
, Encyclopædia Britannica, Inc.
- (
EN
)
Opere riguardanti Java (Computer program language)
, su
Open Library
,
Internet Archive
.
- (
EN
)
Java
, in
Free On-line Dictionary of Computing
, Denis Howe.
Disponibile con licenza
GFDL
- Java sul sito di Oracle
, su
oracle.com
.
- (
EN
)
Il portale di Java OpenSource
, su
home.java.net
.
URL consultato il 19 marzo 2014
(archiviato dall'
url originale
il 3 novembre 2015)
.
- (
EN
)
Java e le sue tecnologie (Opensource)
, su
java-source.net
.
URL consultato il 14 settembre 2007
(archiviato dall'
url originale
il 15 marzo 2009)
.
- (
EN
)
Java open source: not an hoax
, su
today.java.net
.
URL consultato il 13 novembre 2006
(archiviato dall'
url originale
il 15 novembre 2006)
.
- (
EN
)
OpenJDK
, su
openjdk.java.net
.