|
|
| Table of contents |
|
2 Orientamento agli Oggetti 3 Indipendenza dalla piattaforma 4 Esecuzione sicura del codice remoto 5 Valutazione 6 Linguaggio |
}
do {
statement(s)
} while (Boolean expression);
for (initialisation; termination condition; incrementing expr) {
statement(s)
}
Panoramica
\nJava venne creato per soddisfare quattro scopi:\n# essere orientato agli oggetti\n# essere indipendente dalla piattaforma\n# contenere strumenti e librerie per il networking\n# essere progettato per eseguire codice da sorgenti remote in modo sicuro
Orientamento agli Oggetti
\nLa 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 cose reali (oggetti). Il suo obiettivo è di rendere più facile la gestione di grandi\nprogetti, migliorarne la qualità e ridurre il numero dei progetti\nche falliscono.
Indipendenza dalla piattaforma
\nLa 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 istruzioni dette bytecode -- istruzioni semplificate conformi ad uno standard. Esso viene eseguito da una virtual machine, un programma scritto nel codice nativo dell'hardware che lo traduce in codice usabile con l'hardware.\nInoltre, 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 prima implementazione del linguaggio usava una virtual machine interpretata per avere la portabilità, e molte implementazioni lo fanno ancora. Queste producono programmi più lenti rispetto a quelli creati con un compilatore C++ o con compilatori Java più recenti: per questo motivo il linguaggio ha\nsofferto della reputazione di produrre programmi lenti. Implementazioni più\nrecenti della Virtual Machine producono programmi più veloci, usando tecniche multiple.
La prima di queste consiste nel compilare direttamente in linguaggio nativo come con un compilatore tradizionale, evitando completamente il bytecode. Questo permette di raggiungere grandi performance, ma a spese della portabilita'. Un'altra tecnica impiega un compilatore "a richiesta" detto JIT ("Just In Time"). Esso compila il\nbytecode Java in codice nativo nel momento in cui viene avviato. Virtual Machine più sofisticate usano anche la ricompilazione dinamica, con la quale la VM analizza il comportamento del programma in esecuzione ricompilando e ottimizzando le parti critiche.\nEntrambe le tecniche permettono al programma di avvantaggiarsi della velocita' del codice nativo senza perdere portabilità.
La portabilità è un obiettivo tecnicamente difficile da raggiungere, e il successo di Java in questo ambito è materia di alcune controversie.\nSebbene sia in effetti possibile scrivere programmi che si comportano in modo consistente attraverso molte piattaforme diverse, il grande numero di queste ultime con piccoli errori o inconsistenze porta ad una parodia dello slogan di Sun "Scrivi una volta, esegui dovunque" facendolo diventare "Scrivi una volta, fai il debug ovunque".
Esecuzione sicura del codice remoto
\nLa piattaforma Java fu uno dei primi sistemi a fornire un largo supporto per l'esecuzione del codice da sorgenti remote. Una applet può essere avviata nel browser dell'utente, eseguendo codice scaricato da un server HTTP 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 sotto il controllo dell'utente.
Valutazione
\nSecondo molte persone, la tecnologia Java raggiunge ragionevolmente bene tutti questi 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,\nun 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.\nQuesto 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
Programma Hello World
public class HelloWorld {\n public static void main(String[] args) {\n System.out.println("Hello world!");\n }\n}\n\nStrutture di controllo
while (Boolean expression) {
statement(s)Strutture Condizionali
if (Boolean expression) {\n statement(s)\n }
if (Boolean expression) {\n statement(s)\n } else {\n statement(s)\n }
if (Boolean expression) {\n statement(s)\n } else if (Boolean expression) {\n statement(s)\n } else if (Boolean expression) {\n statement(s)\n } else {\n statement(s)\n }
switch (integer expression) {\n case constant integer expr:\n statement(s)\n break;\n ...\n default:\n statement(s)\n break;\n }
Gestione delle eccezioni
try {\n statement(s)\n } catch (exception type) {\n statement(s)\n } catch (exception type) {\n statement(s)\n } finally {\n statement(s)\n }
Goto
=
È possibile inserire un'etichetta prima di ogni\ndichiarazione
myLabel: aJavaStatement;
\nIl comando
break;
termina il ciclo corrente.
L'etichetto può essere usata per uscire da un ciclo for, \nwhile o do-while
break myLabel;
Un'espressione continue termina l'iterazione corrente e\ninizia quella successiva
continue;\n \nIn aggiunta con
continue label;\n \nil flusso del programma può essere manipolato direttamente \nda un ciclo esterno.
La dichiarazione
return;\n \ntermina 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\n(standard IEEE 754) |
| double | virgola mobile a 64 bit doppia precisione\n(standard IEEE 754) |
| char | carattere singolo Unicode |
| boolean | vero o falso |
* JDK 1.0 1996, Solaris, Windows, MacOS Classic, Linux\n * JDK 1.1 1997, Solaris, Windows, MacOS Classic, Linux\n * JDK 1.2 1998, Solaris, Windows, Linux, ?\n * JDK 1.3 2000 (conosciuto come Java 2), Solaris, Windows, MacOS X, Linux\n * JDK 1.4 2002, Solaris, Windows, LinuxJava fu inizialmente rilasciato come il Java Development Kit\n1.0 (JDK 1.0).\nQuesto comprende Java Runtime (la virtual machine e le\nlibrerie di classi), e gli strumenti di sviluppo (es. il\ncompilatore Java).\nSuccessivamente, Sun fornì un pacchetto che comprendeva solo Java\nruntime,\nchiamato Java RunTime Environment (JRE). Normalmente le persone\nsi\nriferiscono ad una particolare versione di Java attraverso la\nversione del\nJDK (es. JDK 1.4)\nLe versioni JDK 1.2 e successive sono spesso chiamate Java 2. \nPer esempio, il nome ufficiale del JDK 1.4 è Java(TM) 2\nPlatform,\nStandard Edition 1.4. Il linguaggio è rimasto stabile dal JDK 1.0; la\nlibreria di\nclassi che viene fornita con JDK è stata progressivamente\nampliata\ne modificata in alcune parti. Le estensioni e architetture legate\nal\nlinguaggio Java comprendono: \n J2SE Java 2 Platform Standard Edition;\n J2EE Java 2 Platform Enterprise Edition;\n J2ME Java 2 Platform Micro Edition;\n Servlets;\n EJB Enterprise JavaBeans;\n JSP JavaServer Pages;\n JDO Java Data Objects;\n JMS Java Message Service;\n JAF JavaBeans Activation Framework;\n Java Mail;\n JNI Java Native Interface;\n JNDI Java Naming and Directory Interface;\n JSML Java Speech Grammer Specification;\n JDBC Java Database Connectivity;\n JAIN Java Integrated Networks;\n JDMK Java Dynamic Management Kit;\n Jini Java Intelligent Network Infrastructure;\n Jiro Java Interface for Regular Objects;\n JXTA sigla che sta per "juxtapose" (porre a canto);\n JavaSpaces;\n JMI Java Metadata Interface;\n JMX Java Management Extensions.\n JAXB Java Architecture for XML Binding\n JAXP Java API for XML Processing\n SAAJ SOAP with Attachments API for Java\n JAX-RPC Java API for XML-based RPC\n 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.