Java (linguaggio di programmazione)
Il linguaggio Java è un linguaggio di programmazione orientato agli oggetti, creato da James Gosling e altri ingegneri di Sun Microsystems. Il gruppo iniziò a lavorare nel 1991, il linguaggio inizialmente si chiamava Oak. Java fu annunciato ufficialmente il 23 maggio 1995 a SunWorld. La piattaforma di programmazione Java è fondata sul linguaggio stesso, sulla Java Virtual Machine (JVM) e sulle API. Java è un marchio registrato di Sun Microsystems.
Panoramica
Java venne creato per soddisfare quattro scopi:
- essere orientato agli oggetti
- essere indipendente dalla piattaforma
- contenere strumenti e librerie per il networking
- essere progettato per eseguire codice da sorgenti remote in modo sicuro
Orientamento agli Oggetti
La prima caratteristica, l'orientamento agli oggetti, si riferisce a un moderno metodo di programmazione e progettazione. L'idea principale della programmazione ad oggetti consiste nel rendere il software la rappresentazione di entità reali o astratte ma ben definite (oggetti). Il suo obiettivo è di rendere più facile la gestione di grandi progetti, migliorarne la qualità e la manutenibilità.
Indipendenza dalla piattaforma
La seconda caratteristica, l'indipendenza dalla piattaforma, significa che l'esecuzione di programmi scritti in Java deve avere un comportamento simile su hardware diverso. Si dovrebbe essere in grado di scrivere il programma una volta e farlo eseguire dovunque. Questo è possibile con la compilazione del codice di Java in un linguaggio intermedio bytecode, basato su istruzioni semplificate che ricalcano il linguaggio macchina. Esso viene eseguito da una virtual machine, cioè da un interprete: Java è quindi, in linea di massima, un linguaggio interpretato. Inoltre, vengono fornite librerie standardizzate per permettere l'accesso alle caratteristiche della macchina (come grafica e networking) in modo unificato. Il linguaggio Java include anche il supporto per i programmi con multithread, necessario per molte applicazioni che usano la rete.
La portabilità è un obiettivo tecnicamente difficile da raggiungere, e il successo di Java in questo ambito è materia di alcune controversie. Sebbene sia in effetti possibile scrivere in Java programmi che si comportano in modo consistente attraverso molte piattaforme diverse, bisogna tenere presente che questi poi dipendono dalle virtual machine, che sono programmi a sè e che hanno inevitabilmente i loro bug, diversi dall'una all'altra: per questo è nata una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque", che è diventato "Scrivi una volta, fai il debug ovunque".
Compilazione Just In Time
Le prime implementazioni del linguaggio usavano una virtual machine che intepretava il bytecode per ottenere la massima portabilità . Questa soluzione si è però rivelata poco efficiente, in quanto e i programmi interpretati erano molto lenti. Per questo tutte le implementazioni recenti di macchine virtuali Java hanno incorporagto un JIT compiler, cioè un compilatore interno che al momento del lancio traduce al volo il programma bytecode Java in un normale programma nel linguaggio macchina del computer ospite; inoltre questa ricompilazione è dinamica, cioè la virtual machine analizza costantemente il modello di esecuzione del codice (profiling) e ottimizza ulteriormente le parti più frequentemente eseguite mentre il programma sta girando. Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permette di avere delle applicazioni Java decisamente più veloci e leggere. Tuttavia, anche così Java resta un linguaggio meno efficiente dei linguaggi compilati come il C++, scontando il fatto di possedere degli strati di astrazione in più e di implementare una serie di automatismi, come il garbage collection, che se da un lato fanno risparmiare tempo ed errori in fase di sviluppo dei programmi dall'altro consumano memoria e tempo di CPU in fase di esecuzione del programma finito.
Esecuzione sicura del codice remoto
La piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Una applet Java è un particolare tipo di applicazione che può essere avviata all'interno del browser dell'utente, eseguendo codice scaricato da un server web remoto. Questo codice viene eseguito in un'area (sandbox) altamente ristretta, che protegge l'utente dalla possibilità che il codice sia malevolo o abbia un comportamento non desiderato; chi pubblica il codice può applicare un certificato che usa per firmare digitalmente le applet dichiarandole "sicure", dando loro il permesso di uscire dall'area ristretta e accedere al filesystem e al network, presumibilmente con l'approvazione e sotto il controllo dell'utente. In realtà gli applet non hanno avuto molta fortuna. Infatti presuppone che il client in cui essi vengono eseguiti abbia installata la JRE (deve eseguire il codice dell'applet). Hanno avuto fortuna le applicazioni che prevedono il cosidetto THIN-CLIENT, cioè un client 'leggero' che NON ha bisogno di particolari strumenti per eseguire il codice remoto (a volte è necessario solo il browser).
Valutazione
Secondo molte persone, la tecnologia Java raggiunge ragionevolmente bene tutti i suoi obiettivi. Il linguaggio comunque non è privo di incertezze. Java tende ad essere più ad alto livello di altri linguaggi simili (come il C++); questo comporta carenze in alcune caratteristiche come i tipi di dati specifici, puntatori alla memoria di basso livello e metodi di programmazione come il sovraccaricamento degli operatori.
Nonostante queste caratteristiche siano abusate frequentemente dai programmatori, esse sono anche strumenti potenti. Comunque, la tecnologia Java include Java Native Interface (JNI), un modo per chiamare codice nativo da codice Java. Con JNI è quindi possibile ugualmente usare queste caratteristiche.
Alcuni programmatori lamentano anche la mancanza dell'ereditarietà multipla, un potente mezzo di molti linguaggi orientati agli oggetti, tra cui il C++. Il linguaggio Java separa l'ereditarietà del tipo dall'implementazione, permettendo l'ereditarietà multipla dei tipi attraverso le interfacce. Questo permette di ottenere la maggior parte dei benefici dell'ereditarietà multipla evitando molti dei suoi pericoli. Inoltre, attraverso l'uso di classi concrete, classi astratte e interfacce, un programmatore ha la possibilità di scegliere un grado nullo, parziale o completo di implementazione dell'oggetto che definisce, essendo assicurata la massima flessibilità nella progettazione.
Alcune persone pensano che per particolari progetti, la programmazione orientata agli oggetti renda il lavoro più difficile. Questa particolare lamentela non è peculiare di Java, ma è rivolta a tutti i linguaggi di questo tipo.
Linguaggio
Il seguente esempio stampa il testo "Hello world".
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } }
Strutture di controllo
while (Boolean expression) { statement(s) }
do { statement(s) } while (Boolean expression);
for (initialisation; termination condition; incrementing expr) { statement(s) }
Strutture Condizionali
if (Boolean expression) { statement(s) }
if (Boolean expression) { statement(s) } else { statement(s) }
if (Boolean expression) { statement(s) } else if (Boolean expression) { statement(s) } else if (Boolean expression) { statement(s) } else { statement(s) }
switch (integer expression) { case constant integer expr: statement(s) break; ... default: statement(s) break; }
'(Boolean expression)?(statement on true condtion):(statement on false condition)'
Gestione delle eccezioni
try { statement(s) } catch (exception type) { statement(s) } catch (exception type) { statement(s) } finally { statement(s) }
Goto
È possibile inserire un'etichetta prima di ogni dichiarazione
myLabel: aJavaStatement;
Il comando
break;
termina il ciclo corrente.
L'etichetta può essere usata per uscire da un ciclo for, while o do-while
break myLabel;
Un'espressione continue termina l'iterazione corrente e inizia quella successiva
continue;
In aggiunta con
continue label;
il flusso del programma può essere manipolato direttamente da un ciclo esterno.
La dichiarazione
return;
termina un metodo.
Con
return aValue;
aValue può essere restituito al metodo chiamante.
Tipi Primitivi
Tipo di Variabile | Descrizione |
byte | intero con segno a 8 bit |
short | intero con segno a 16 bit |
int | intero con segno a 32 bit |
long | intero con segno a 64 bit |
float | virgola mobile a 32 bit singola precisione (standard IEEE 754) |
double | virgola mobile a 64 bit doppia precisione (standard IEEE 754) |
char | carattere singolo Unicode |
boolean | vero o falso |
I caratteri usano la codifica a 16 bit Unicode. Contiene tutti i caratteri usuali, oltre a tutti i set di caratteri di molte lingue come Greco, Cirillico, Cinese, Arabo, ecc. In si Java possono usare tutti questi caratteri, anche se molti editor non hanno il supporto per i set di caratteri diversi dal ASCII. Gli Array e le stringhe non sono tipi primitivi ma oggetti.
Versioni
- JDK 1.0 1996, Solaris, Windows, Mac OS Classic, Linux
- JDK 1.1 1997, Solaris, Windows, Mac OS Classic, Linux
- JDK 1.2 1998, Solaris, Windows, Linux, ?
- JDK 1.3 2000 (conosciuto come Java 2), Solaris, Windows, Mac OS X, Linux
- JDK 1.4 2002, Solaris, Windows, Mac OS X, Linux
- JDK 1.5 2004, Solaris, Windows, Linux (Mac OS X è fermo alla 1.4.2)
Java fu inizialmente rilasciato come Java Development Kit 1.0 (JDK 1.0). Questo comprende Java Runtime (la virtual machine e le librerie di classi), e gli strumenti di sviluppo (es. il compilatore Java). Successivamente, Sun fornì un pacchetto che comprendeva solo Java 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 è Java(TM) 2 Platform, Standard Edition 1.4.
Il linguaggio è rimasto stabile dal JDK 1.0; la libreria di classi che viene fornita con JDK è stata progressivamente ampliata e modificata in alcune parti. Le estensioni e architetture legate al linguaggio Java comprendono:
- J2SE Java 2 Platform Standard Edition;
- J2EE Java 2 Platform Enterprise Edition;
- J2ME Java 2 Platform Micro Edition;
- Servlet;
- EJB Enterprise JavaBeans;
- JSP JavaServer Pages;
- JDO Java Data Objects;
- JMS Java Message Service;
- JAF JavaBeans Activation Framework;
- Java Mail;
- JNI Java Native Interface;
- JNDI Java Naming and Directory Interface;
- JSML Java Speech Grammar Specification;
- JDBC Java Database Connectivity;
- JAIN Java Integrated Networks;
- JDMK Java Dynamic Management Kit;
- Jini Java Intelligent Network Infrastructure;
- Jiro Java Interface for Regular Objects;
- JXTA sigla che sta per "juxtapose" (porre a canto);
- JavaSpaces;
- JMI Java Metadata Interface;
- JMX Java Management Extensions.
- JAXB Java Architecture for XML Binding
- JAXP Java API for XML Processing
- SAAJ SOAP with Attachments API for Java
- JAX-RPC Java API for XML-based RPC
- JAXR Java API for XML Registries
A parte il linguaggio molto semplice da imparare l'utilizzo delle archittetture e delle specifiche richiede un tempo di apprendimento molto lungo.
Come programmare in Java
La programmazione in Java è una specializzazione della programmazione con linguaggi orientati agli oggetti.
Il linguaggio Java è un linguaggio orientato agli oggetti con una sintassi simile al linguaggio C e al linguaggio C++. Allo sviluppatore già esperto di programmazione OO, alcuni punti dovrebbero essere evidenziati:
- Java supporta solo la singola ereditarietà di classi, ma permette l'ereditarietà multipla di interfacce.
- Java ha una libreria di classi molto grande (detta Java API) simile a SmallTalk, e supporta molte caratteristiche, dai contenitori di oggetti a complesse esigenze di sicurezza.
- Java viene eseguito attraverso una Virtual Machine
L'apprendimento del linguaggio non è difficile, sebbene la padronanza completa delle librerie sia un processo lungo. La maggior parte degli utenti iniziano con le classi come String e ArrayList.
Un buon punto di partenza per imparare Java è il tutorial di Sun.
Un'altra pagina molto utile per i principianti e gli esperti è la pagina della sintassi Java aggiornata all'ultima versione, sempre presso il sito Sun, che si trova qui
Per sviluppare programmi in Java è sufficente un qualsiasi editor di testo. Comunque per aiutarci nella realizzazione dei nostri progetti estistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato) che ci aiutano in tal senso alcuni dei quali a pagamento altri gratuiti.
Un ambiente di sviluppo per Java gratuito e soprattuto leggero è GEL (realizzato in Delphi), disponibile alla pagina http://www.gexperts.com solo per Windows; mentre Bluej, di chiara impostazione didattica, è disponibile per tutti i sistemi operativi al sito gratuito http://www.bluej.org/. Un altro ambiente per lo sviluppo in Java (e non solo) più complesso, potente e sempre gratuito è Eclipse donato alla comunità di sviluppatori da IBM e scaricabile dalla pagina http://www.eclipse.org Inoltre la Sun mette a disposizione un proprio ambiente di sviluppo gratuito (esiste anche una versione a pagamento) Sun One Studio Comunity Edition utilizzabile su diversi sistemi operativi. Questo ambiente è ricco di funzionalità ed è molto pesante. Il download è possibile effettuarlo da questa pagina http://wwws.sun.com/software/download/
Curiosità
J. Gosling e A. Van Hoof (considerati gli autori del linguaggio Java) si trovavano spesso ad un caffè presso il quale discutevano del linguaggio stesso. E così il linguaggio prese il nome da tale abitudine (Java è una qualità di caffè), tanto che il magic number che identifica un file .java è 0xCAFEBABE (probabilmente riferendosi alla cameriera che li serviva).