Java (lenguajo de programasion)
Java xe un linguajo de programmassion orientà ai ogeti, derivà dal C++ (e quindi in qualche manièra anca dal C) e creà da James Gosling e altri ingegniri dea Sun Microsystems. A piataforma de programassion Java xe fondà sol linguajo stesso, soa Macchina virtuae Java (Java Virtual Machine o JVM) e soe API Java. Java xe un marchio registrà de Sun Microsystems.
Storia
Il gruppo di progetto iniziò a lavorare nel 1991, al linguaggio inizialmente fu dato il nome Oak, tale nome fu successivamente cambiato in Java a causa di un problema di copyright (il linguaggio di programmazione Oak esisteva già). Dato che gli ideatori del linguaggio si trovavano spesso ad un caffè presso il quale discutevano del progetto, il linguaggio prese il nome da tale abitudine (Java è una qualità di caffè dell'omonima isola dell'Indonesia), tanto che il magic number che identifica un file di bytecode ottenuto dalla compilazione di un file Java è 0xCAFEBABE (probabile riferimento alla cameriera che li serviva).
Java fu annunciato ufficialmente il 23 maggio 1995 a SunWorld.
Il 13 novembre 2006 la Sun Microsystems ha rilasciato la sua implementazione del compilatore Java e della macchina virtuale sotto licenza GPL[1].
L'8 maggio 2007 SUN ha rilasciato anche le librerie (tranne alcune componenti non di sua proprietà) sotto licenza GPL rendendo Java un linguaggio di programmazione la cui implementazione di riferimento è libera. [2]
Caratteristiche
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
Per facilitare il passaggio a questo linguaggio per i programmatori old-fashioned legati in particolare a linguaggi come il C la sintassi di base (strutture di controllo, operatori e così via) è stata mantenuta pressoché identica.
Orientamento agli oggetti
La prima caratteristica, l'orientamento agli oggetti, si riferisce a un moderno metodo di programmazione e progettazione, la programmazione orientata agli oggetti (OOP).
L'idea alla base della OOP è di rappresentare, nella progettazione del software, le entità reali o astratte che compongono il problema sotto forma di oggetti. Gli oggetti sono caratterizzati da delle proprietà (definite variabili o campi di istanza o di esemplare) e di metodi applicabili sugli oggetti stessi, che possono ad esempio modificarne lo stato o estrarne informazioni.
I programmi scritti in Java possono essere unicamente orientati agli oggetti, di conseguenza tutto il codice deve essere necessariamente incluso in una classe.
Sebbene Java possa operare sia su oggetti che su tipi di dati primitivi, è considerato un linguaggio ad oggetti puro, ovvero nel quale gli oggetti sono le entità di base del linguaggio, anziché essere costruiti partendo da costrutti ad un inferiore livello di astrazione.
Ereditarietà
L'ereditarietà in java è implementata mediante la parola chiave extends
, applicata nella dichiarazione di una classe
public class Quadrato extends Quadrilatero
Una classe estende sempre una e una sola altra classe (ovvero non esiste ereditarietà multipla), ma può a sua volta essere estesa da un numero arbitrario di classi. Se non si utilizza la clausola extends
, la classe estende comunque una superclasse implicita, la classe Object
.
Questo sistema rende disponibile un modo per creare gerarchie di classi ben definite, ad esempio una classe Quadrilatero
può definire alcuni comportamenti generali per tutte le figure geometriche con 4 lati, tuttavia si può presentare la necessità di aver bisogno di caratteristiche più specifiche per i nostri oggetti, quindi si creerà una classe Quadrato
che estende la classe Quadrilatero
da cui deriva tutti gli attributi (le variabili di istanza) e tutti i comportamenti (i metodi), salvo poi riscrivere (tramite overriding) quei comportamenti che sono prettamente associati ai quadrati (ovvero legati alla proprietà specifica dei quadrati di avere 4 lati uguali).
L'overriding si attua semplicemente scrivendo all'interno della classe che estende (in questo caso la classe Quadrato
) il metodo che vogliamo riscrivere, utilizzando la stessa firma del relativo metodo della superclasse (deve avere lo stesso nome e gli stessi attributi, in numero e tipo, e lo stesso ordine).
Java adotta un modello di ereditarietà basato sull'ereditarietà singola; in altre parole, una classe può estendere una sola superclasse. Su questo punto Java si differenzia dal C++, basato sul modello dell'ereditarietà multipla. Dopo l'avvento di Java, l'ereditarietà singola si è gradualmente affermata come modello standard di ereditarietà nelle tecnologie object-oriented, ed è stata abbracciata, per esempio, anche dai linguaggi del framework .NET Microsoft.
Interfacce
L'utilizzo di una interfaccia in Java consente di trattare in modo omogeneo tutti gli oggetti che forniscono un dato insieme di servizi, a prescindere dalla loro implementazione (e quindi dalla loro particolare classe di appartenenza). Dal punto di vista sintattico, una interfaccia Java consiste principalmente di una lista di dichiarazioni di metodi che tutte le classi che implementano l'interfaccia devono fornire.
public class Quadrato implements FiguraGeometrica
dove l'interfaccia FiguraGeometrica
potrebbe essere dichiarata come segue:
public interface FiguraGeometrica {
public int calcolaPerimetro();
public int calcolaArea();
}
Si noti che nella dichiarazione di un metodo in un'interfaccia le parole chiave public
e abstract
sono sempre implicite e, dunque, facoltative. Con l'implementazione dell'interfaccia, la classe Quadrato
deve contenere al suo interno i metodi calcolaPerimetro
e calcolaArea
propri (o possono essere ereditati dalla superclasse). L'utilizzo delle interfacce viene usato quando si hanno delle gerarchie di oggetti, o oggetti semplici che possiedono delle operazioni comuni (metodi), ma l'implementazione di queste sono differenti una dall'altra.
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 detto bytecode, basato su istruzioni semplificate che ricalcano il linguaggio macchina. Il bytecode verrà quindi eseguito da una macchina virtuale. 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 hardware diverse, bisogna tenere presente che questi poi dipendono dalle macchine virtuali che sono programmi a sé e che hanno inevitabilmente i loro bug, diversi l'una all'altra: per questo è nata una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque" ("write once, run everywhere"), che è diventato "Scrivi una volta, fai il debug ovunque" ("write once, debug anywhere").
Compilazione Just-In-Time
Le prime implementazioni del linguaggio usavano una macchina virtuale Java che interpretava il bytecode per ottenere la massima portabilità, definita Architecture Neutral. Questa soluzione si è però rivelata poco efficiente, in quanto i programmi interpretati erano molto lenti. Per questo motivo, tutte le implementazioni recenti di macchine virtuali Java hanno incorporato un compilatore just-in-time (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 macchina virtuale analizza costantemente il modello di esecuzione del codice (profiling), e ottimizza ulteriormente le parti più frequentemente eseguite, mentre il programma è in esecuzione.
Questi accorgimenti, a prezzo di una piccola attesa in fase di lancio del programma, permettono 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 collector, 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. Un Java applet è 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 cosiddetto thin-client, cioè un client 'leggero' che non ha bisogno di particolari strumenti per eseguire il codice remoto (a volte è necessario solo il browser).
Altri aspetti di interesse
Rispetto alla tradizione dei linguaggi a oggetti da cui deriva (e in particolare rispetto al suo diretto progenitore, il C++), Java ha introdotto una serie di notevoli novità rispetto all'estensione della sua semantica. Fra le più significative si possono citare probabilmente la possibilità di costruire GUI (interfacce grafiche) con strumenti standard e non proprietari utilizzando i package java.awt e javax.swing (per il C++ e altri linguaggi analoghi solitamente le GUI non fanno parte del linguaggio, ma sono delegate a librerie esterne), la possibilità di creare applicazioni multi-thread, ovvero che svolgono in modo concorrente molteplici attività, e il supporto per la riflessione, ovvero la capacità di un programma di agire sulla propria struttura e di utilizzare classi caricate dinamicamente dall'esterno.
Fra gli argomenti che depongono spesso a favore di Java nella scelta del linguaggio di implementazione di un progetto software moderno, inoltre, si deve certamente contare la vastità delle librerie standard di cui il linguaggio è dotato, e che in particolare contribuiscono a renderlo altamente integrabile con le altre tecnologie. Alcuni esempi di funzionalità di libreria di Java sono:
- accesso ai database tramite JDBC e ai DBMS con driver ODBC tramite il bridge JDBC-ODBC
- manipolazione documenti XML
- dialogo con piattaforme CORBA
- potenti strumenti per la programmazione lato server nel contesto Web
- supporto nativo per gran parte dei protocolli della famiglia IP, vedi ad esempio il Socket Java
- supporto per le applicazioni multimediali, streaming audio e video.
Linguaggio
Hello, world!
Il seguente esempio stampa il testo "Hello world".
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello World");
}
}
Segue l'analisi riga per riga del frammento di codice:
- public class HelloWorld
La classe porta il nome HelloWorld e, poiché è dichiarata "public", significa che anche il nome del file nel quale verra' scritto il programma dovra' chiamarsi HelloWorld.java. Quindi il nome del file .java e il nome della classe "pubblica" devono coincidere!
- public static void main(String[] args)
La classe HelloWorld contiene un unico metodo, che si chiama "main". È un nome particolare. In effetti, al caricamento della classe, l'interprete java cerchera' il metodo che portera' questo nome.
- "public" perché il metodo deve essere raggiungibile da qualsiasi classe, e in particolare, dallo stesso interprete.
- "static" perché non deve essere invocato su un oggetto particolare (detto "d'invocazione").
- "void" perché non deve restituire alcun valore.
Il parametro args si riferisce all'array di stringhe passato all'interprete al momento del suo avvio. Se viene eseguito questo comando:
$ java HelloWorld par1 par2
la stringa par1 sarà caricata nella variabile args[0] mentre par2 sarà caricata nella variabile args[1].
- System.out.println("Hello world");
Questa operazione stampa sullo schermo la scritta "Hello world". Entrando più nel dettaglio, il metodo println() viene invocato su un oggetto statico di tipo PrintStream chiamato "out", il quale, a sua volta si trova all'interno della classe System.
Strutture di controllo
Cicli
while (boolean expression)
{
statement(s)
}
do {
statement(s)
} while (boolean expression);
for (initialisation; termination condition; incrementing expr) {
statement(s)
}
Alternative
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 condition) : (statement on false condition)
Gestione delle eccezioni
try {
statement(s)
} catch (exception type) {
statement(s)
} catch (exception type) {
statement(s)
} finally {
statement(s)
}
Salti
È possibile inserire un'etichetta prima di ogni dichiarazione
myLabel: aJavaStatement;
Il comando
break;
termina il ciclo corrente.
Nel caso di cicli annidati, il break con label può essere usato per terminare uno qualsiasi di tali cicli:
break cicloEsterno;
Un'espressione continue termina l'iterazione corrente e inizia quella successiva
continue;
Il continue con una label può essere usato per passare alla prossima iterazione di uno qualsiasi di un insieme di cicli annidati:
continue cicloEsterno;
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 Java si 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.1.4 (Sparkler) 12 settembre 1997
- JDK 1.1.5 (Pumpkin) 3 dicembre 1997
- JDK 1.1.6 (Abigail) 24 aprile 1998
- JDK 1.1.7 (Brutus) 28 settembre 1998
- JDK 1.1.8 (Chelsea) 8 aprile 1999
- J2SE 1.2 (Playground) 4 dicembre 1998
- J2SE 1.2.1 (none) 30 marzo 1999
- J2SE 1.2.2 (Cricket) 8 luglio 1999
- J2SE 1.3 (Kestrel) 8 maggio 2000
- J2SE 1.3.1 (Ladybird) 17 maggio 2001
- J2SE 1.4.0 (Merlin) 13 febbraio 2002
- J2SE 1.4.1 (Hopper) 16 settembre 2002
- J2SE 1.4.2 (Mantis) 26 giugno 2003
- J2SE 5.0 (1.5.0) (Tiger) 29 settembre 2004
- Java SE 6 (1.6.0) (Mustang) 11 dicembre 2006
- Java SE 7 (1.7.0) (Dolphin) Prevista per il primo semestre 2010
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:
- GeoTools Libreria per il trattamento di dati geografici
- J2SE Java 2 Platform Standard Edition
- Java_EE Java Platform Enterprise Edition
- J2ME Java 2 Platform Micro Edition
- Servlet
- EJB Enterprise JavaBeans
- JSP JavaServer Pages
- JSF Java Server Faces
- JDO Java Data Objects
- JMS Java Message Service
- JAF JavaBeans Activation Framework
- JavaMail
- 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 accanto)
- JavaSpaces
- JMI Java Metadata Interface
- JMX Java Management Extension
- 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
- Java 3D Java 3D API
Sebbene il linguaggio sia molto semplice da imparare, l'utilizzo delle architetture 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 OOP, 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. La vastità delle "librerie" (o più correttamente package) standard del linguaggio è tale da renderne praticamente impossibile la "padronanza"; per programmare in Java è dunque necessario avere a disposizione la documentazione delle API del linguaggio, disponibile in linea sul sito ufficiale.
Un buon punto di partenza per imparare Java è il tutorial di Sun.
Per sviluppare programmi in Java è teoricamente sufficiente un qualsiasi editor di testo; in pratica, se si vuole scrivere qualcosa di più del classico hello world, occorre un ambiente di sviluppo integrato. Esistono diversi IDE (Integrated Development Environment, ambiente di sviluppo integrato), alcuni gratuiti ed altri a pagamento.
Fra questi quello più premiato è IntelliJ IDEA vincitore fra l'altro del premio Best Java IDE 2005 rilasciato da JDJ. Si tratta di un IDE completo, molto funzionale ed in grado di garantire una padronanza completa del codice che si sta sviluppando.
Un ambiente di sviluppo per Java gratuito e soprattutto leggero è BlueJ, di chiara impostazione didattica, e disponibile per tutti i sistemi operativi al sito gratuito http://www.bluej.org/. Un altro ambiente per lo sviluppo in Java (e non solo) è Eclipse, donato alla comunità di sviluppatori da IBM e scaricabile dalla pagina http://www.eclipse.org. Eclipse è più avanzato e potente, è libero e disponibile per molti sistemi operativi; da notare che quest'ultimo è strutturato con un'architettura a plugin che permette l'aggiunta di ulteriori funzionalità semplicemente scaricando ed installando il relativo plugin (si veda ad esempio eclipse plugins).
La Sun stessa ha promosso lo sviluppo di un ambiente di sviluppo gratuito e open source chiamato NetBeans e lo mette a disposizione gratuitamente insieme a Sun Java Studio. Questi due ambienti sono scritti in Java e NetBeans è distribuito (opzionalmente) insieme alla macchina virtuale [1]. Come entità separata, NetBeans è scaricabile da netbeans.org. Uno degli IDE commerciali più diffusi è JBuilder prodotto dalla Borland.
Note
- ↑ "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; the source is being released via the OpenJDK project.
- ↑ Open JDK is here! (TXT), Sun Microsystems, 08-05-2007. Entrada il 09-05-2007.
Voci correlate
Altri progetti
Errore script: nessun modulo "Interprogetto".
Collegamenti esterni
- (EN) Java sul sito della Sun Microsystems
- (EN) Sito della Sun Microsystems
- (EN) Il nuovo portale di Java OpenSource
- (EN) Java e le sue tecnologie (Opensource)
- (EN) Java open source: not an hoax
- (EN) OpenJDK
- (EN) Full Java Tutorial
- (EN) Java Application Development on Linux Libro in formato pdf (open source)
- (IT) Programmi Java con sorgenti opensource
- (IT) Portale della comunità MokaByte
- (IT) Javaportal
- (IT) Un video corso in italiano su Java
- (IT) Articoli sulle varie tecnologie java
- (IT) Evento itinerante organizzato dai Java User Groups italiani
Modeło:Linguaggio C Modeło:Link AdQ