Indice
Indice
I
Java 2
1
1
Java 2 SDK 5.0
1.1 Istallazione di Java 2 SDK 5.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
1
2
Interpretazione dei programmi
2.1 Compilatori e interpreti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 Java Virtual Machine (JVM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
3
5
3
Uso delle librerie
3.1 Importazione di package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7
7
Parte I
Java 2
1
Java 2 SDK 5.0
Java SE Overview
Java Runtime Environment (JRE) “... provides the Java APIs, Java virtual machine, and other components necessary to run applets and applications written in the Java”
Java SE Development Kit (JDK) “... superset of the JRE, and contains everything that is in the JRE, plus tools such
as the compilers and debuggers necessary for developing applets and applications”
Java Virtual Machine “... Java Virtual Machine is responsible for the hardware- and operating system-independence
of the Java SE platform, the small size of compiled code (bytecodes), and platform security”
Java Platform Tools “... works with an array of tools, including Integrated Development Environments (IDEs),
performance and testing tools, and performance monitoring tools”
Java SE Overview /2
Java SE API “... application programming interface (API) defines the manner by which an applet or application can
make requests to and use the functionality available in the compiled Java SE class libraries”
• Core components provides essential functionality for writing powerful programs in key areas such as
database access, security, remote method invocation (RMI), and communications.
• Desktop components add a full range of features to help build applications that provide a rich user experience – deployment products such as JavaBeans, and a graphical user interface
1.1
Istallazione di Java 2 SDK 5.0
Sistemi operativi
Java è disponibile per la famiglia di S.O. Microsoft Windows e S.O. Linux (oltre a SUN e MAC):
• Windows 98 (edizione 2)
• Windows ME
• Windows 2000
• Windows XP (Intel IA32, AMD64/EM64T 32-64 bit mode)
• Windows Server 2003 (Intel IA32, AMD64/EM64T 32-64 bit mode)
• Linux (Intel IA32, AMD64/EM64T 32-64 bit mode)
File per l’installazione
I due file necessari per procedere all’istallazione sono scaricabili dal sito della SUN (java.sun.com):
Java 2 SDK jdk-1 5 0 *-windows-i586-p.exe jdk-1 5 0 *-linux-i586.bin contiene il programma di installazione di
Java 2 SDK (reperibile dal sito della SUN all’indirizzo http://java.sun.com/javase/downloads/index.jsp)
Documentazione jdk-1 5 0-doc.zip contiene la documentazione delle librerie Java (API - Application Programmer
Interface) fondamentali per la programmazione
Albero delle directory sotto Windows
C:\
|
Programmi
|
j2sdk1.5.0_*
_______________________|_________________
|
|
|
|
|
|
|
|
|
|
|
bin/ lib/ include/ demo/ jre/ ...
|
| LICENSE |
|
COPYRIGHT
|
README.html
__|__
|
|
java javac ...
Albero delle directory sotto Linux
usr
|
java
|
j2sdk1.5.0_*
_______________________|_________________
|
|
|
|
|
|
|
|
|
|
|
bin/ lib/ include/ demo/ jre/ ...
|
| LICENSE |
2
|
COPYRIGHT
README.html
|
__|__
|
|
java javac ...
Tools di base
javac compilatore per Java
java macchina virtuale (VM) ed esecutore di applicazioni Java
javadoc generatore di documentazione per le API sviluppate dall’utente
appletviewer esecutore e debugger per le applet senza usare un browser web
jar creatore e gestore di archivi di file (pacchetti) Java (.jar)
jdb debugger per Java
javap strumento per disassemblare file in formato class (bytecode)
Esecuzione dei programmi
• I programmi (tools) forniti con Java (contenuti nella directory bin) non prevedono un’interfaccia grafica
• Devono essere eseguiti dall’interprete dei comandi di Windows che è chiamato prompt (o cmd)
• L’interprete dei comandi è in genere eseguibile dal menu
Avvio ⇒ Programmi ⇒ Accessori
• Appare una finestra (tipo DOS) in cui compare un cursore lampeggiate dopo una stringa del tipo
C:\ WINDOWS >
(La stringa C:\ WINDOWS > è chiamata prompt e indica la directory corrente)
La variabile di sistema PATH
• Per invocare in modo pratico i programmi presenti nella directory bin è possibile utilizzare la variabile di
sistema PATH
• Contiene un elenco di directory separatare da un carattere:
– ; - nei sitemi Windows
– : - nei sitemi Unix (Linux)
• Indica all’interprete dei comandi le directory ove cercare i programmi eseguibili
• In riferimento all’esempio presentato qui, occorre aggiungere alla variabile PATH il path assoluto della directory
C:\Programmi\j2sdk1.5.0 05\bin
3
2
2.1
Interpretazione dei programmi
Compilatori e interpreti
Compilatori e interpreti
La macchina astratta viene implementata sulla macchina reale M da un opportuno strumento di traduzione
Compilatore È un programma che traduce un programma del linguaggio L in un programma equivalente nel linguaggio macchina di M
Interprete È un programma che simula direttamente la macchina astratta:
1. legge un’istruzione del programma P
2. effettua le operazioni del linguaggio macchina corrispondenti al suo significato
3. passa a considerare l’istruzione successiva
Compilatori
Programma Pascal
Saluti.exe
0110010...
___________
_____
________
_______
_________
program Saluti;
_____________
_____
________
_______
_________
0110010...
Saluti
Compilatore Pascal per X
Macchina X
Vantaggi: portabilità del sorgente
4
Programma Pascal
Indipendente
dalla
piattaforma
program p (input,output);
var
x:integer;
...
Compilatore
per Windows
Compilatore
per Linux
Compilatore
per MacOs
Eseguibile
Eseguibile
Eseguibile
MacOS
Linux
Windows
Dipendente
dalla
piattaforma
Strumenti per la stesura dei programmi
errori di
compilazione
programma
sorgente
compilatore
programma
oggetto
errori
del linker
librerie
linker
input
eseguibile
output
output ed
errori di
esecuzione
2.2
modifiche
esecutore
Java Virtual Machine (JVM)
Java Virtual Machine (JVM)
Interprete
(java)
Saluti.java
_____________
_____
________
_______
_________
Compilatore
(javac)
Saluti
0110010...
Saluti.class
___________
_____
________
_______
_________
JVM - caratteristiche (1)
• La JVM è una macchina astratta
5
• Come tutte le altre macchine ha un prorpio instruction set e gestisce varie aree di memoria (stack, heap) a run
time
ISTRUCTION SET
---------------------------------------...
iadd
int1,int2 => result
"somma 2 interi"
fadd
flo1,flo2 => result
"somma 2 float"
dsub
dou1,dou2 => result
"sottrae 2 double"
iaload aref,indx => value
"carica un int da un array"
...
JVM - caratteristiche (2)
• La JVM non sa nulla del linguaggio Java, riconosce solamente il formato binario class (o bytecode) che contiene
le istruzioni macchina, una tabella dei simboli e altre informazioni
magic: il numero magico che idenifica il formato
minor_version, major_version: numeri maggiore e
minore di versione
constant_pool[]: tabella di nomi di classe, dei
campi ...
constant_pool_count: numero di entry nella tabella
access_flags: maschera di flag per denotare
proprietà di accesso
this_class: entry valida nella tab constant_pool
super_class: entry valida nella tab constant_pool
...
Formato del bytecode
Il formato class contiene un’unica “struttura”:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 fields_count;
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
6
JVM - caratteristiche (3)
• Allo start-up, dopo alcune inizializzazioni (dipendenti dalla piattaforma), collega la classe iniziale, e invoca il
metodo public void main della stessa
– crea una classe iniziale piattafoma-dipendente usando il bootstrap class loader
– linka la classe di partenza, la inizializza e invoca il suo metodo pubblico void main(String[])
– da esso dipende la catena di invocazioni di metodi che normalmente causano il linking (e la creazione) di
altre classi ...
JVM - caratteristiche (4)
• Effettua il loading, il linking e l’inizializzazione di classi e interfacce
– il loading (effettuato dal ClassLoader) significa reperire il bytecode di una classe o interfaccia e creare una
rapp interna della stessa (constant pool, area dei metodi,... )
– il linking implica tre operazioni essenziali: verifica (check sulla validità del bytecode sulla base di vincoli strutturali), preparazione (creazione di campi statici e inizializzazioni di vars ai valori di defaults) e
risoluzione (determina dinamicamente i valori reali per i link simbolici)
– l’inizializzazione comporta l’invocazione di porzione di codice dedicato ad inizializzare la classe (porla in
uno stato consistente con il thread e l’ambiente runtime) e i campi statici (definiti in essa)
Vantaggi: portabilità del bytecode
Programma Java
Indipendente
dalla
piattaforma
Compilatore
class Saluti{
...
}
bytecode
Interprete
per Windows
Interprete
per Linux
Interprete
per MacOs
Dipendente
dalla
piattaforma
Windows
MacOS
Linux
Ulteriore vantaggio di questo meccanismo
Saluti.java
_____________
_____
________
_______
_________
Interprete
(java)
0110010...
Compilatore
(javac)
Network
Saluti
Saluti.class
___________
_____
________
_______
_________
7
La portabilità
• E’ difficile sviluppre software che funzioni in modo corretto ed efficiente!
• Quando un programma svolge bene il prorpio compito in un dato ambiente, è preferibile non dover rifare tutto
quando lo si deve trasferire ad un diverso compilatore, processore o sistema operativo (portabilità)
• In generale: programma portabile = programma migliore (dipende dalle circostanze d’uso)
3
Uso delle librerie
3.1
Importazione di package
Un esempio (1)
/* Il nostro primo programma */
class BuonInizio {
// il metodo main
public static void main(String [] args) {
prog.io.ConsoleOutputManager out =
new prog.io.ConsoleOutputManager();
out.println("Ti auguro una buona giornata!");
}
}
Questo programma utilizza la classe ConsoleOutputManager che appartiene al package prog.io. Quindi deve
essere chiamata esplicitamente mediante il suo nome completo
Importare classi
Se in un programma Java si vuole utilizzare una classe che appartiene ad un package, bisogna informare esplicitamente sia il compilatore sia la macchina virtuale
• Direttiva di importazione:
import nomeDellaClasse;
dove:
• import: è una parola riservata del linguaggio
• nomeDellaClasse: è il nome completo della classe che include il nome del package e il nome della classe
• la direttiva di importazione viene conclusa dal carattere ’;’
• il package java.lang viene importato implicitamente
Un esempio (2)
/* direttive di importazione */
import prog.io.ConsoleOutputManager;
class BuonInizioATe {
// il metodo main
public static void main(String[] args) {
ConsoleOutputManager out = new ConsoleOutputManager();
out.println("Ti auguro una buona giornata!");
}
}
8
Quale differenza con il codice precedente? ... e quali vantaggi?
Direttiva import
La direttiva di importazione informa il compilatore e la JVM su dove trovare le classi utilizzate nel programma
• Il compilatore ha bisogno delle informazioni contenute nel bytecode della classe per verificare che all’interno
del nostro programma tale classe sia utilizzata in modo corretto
• La JVM ha bisogno del codice (bytecode) della classe durante l’esecuzione
Argomento della direttiva import
import nomeDellaClasse;
• nomeDellaClasse indica un percorso nell’albero delle directory. Java usa il carattere ’.’ come separatore
delle directory
• Ad esempio in un sistema Windows
prog.io.ConsoleOutputManager
corrisponde al path relativo:
prog\io\ConsoleOutputManager.class
• Indica quindi che la classe ConsoleOutputManager da importare è presente in una sottodirectory del
filesystem di nome prog\io\
Reperimento delle librerie
prog.io è una package (libreria), cioè un insieme di classi raggruppate in base alle funzionalità
Dove reperire la libreria prog.io?
Cioè dove si trova la directory prog\io\?
• In genere le librerie vengono raggruppate in una o più sottodirectory, organizzate dal programmatore secondo
un qualche criterio gerarchico
• Il compilatore e la JVM devono sapere dove si trovano le librerie per poter reperire, mediante le direttive di
importazione, le classi utilizzate in un programma ...
La variabile di sistema CLASSPATH
• Il compilatore e la JVM sanno già dove trovare i package forniti con la distribuzione di Java.
• Per i package aggiunti dall’utente bisogna indicare dove si trovano, definendo opportunamente la variabile di
sistema CLASSPATH
E’ una variabile di sistema. Cioè una variabile il cui valore è memorizzata dal sistema operativo, e che viene utilizzata
dal compilatore e dalla JVM per reperire informazioni sull’ambiente all’interno del quale vengono eseguiti.
Contiene una lista di directory separatare da un carattere:
• ; - nei sitemi Windows
• : - nei sitemi Unix (Linux)
9
La variabile di sistema CLASSPATH (2)
Se organizziamo i nostri package in una directory di nome, ad esempio,
C:\javalib
allora potremmo definire
CLASSPATH = .;C:\javalib;
In questo modo stiamo dicendo al compilatore e alla JVM che quando importiamo una classe devono:
• iniziare a cercarla in . (la directory corrente)...
• ... se non la trova deve provare a cercarla in C:\javalib
Istallare i package prog
Fornisce classi utilizzate nel libro di testo e classi per la gestione dell’input/output
• I package sono contenuti nel file prog.tar del CD ROM
• Si tratta di un archivio da cui i file possono essere estratti mediante WinZip (tar xfv in Unix)
• di avere predisposto una directory di nome C:\javalib dove conservare i package Java
• Estraiamo i file dall’archivio all’interno di questa directory
La struttura delle directory
C:\
Documentazione
|
javalib
|
prog
____________________|___________________
|
|
|
|
|
Punto di ingresso
c02 c03
....
utili
|
docs
alla documentazione
|
|
|
io
_____|_____
... ...
...
|
|
|
|
index.html
...
____|____
|
|
|
Contengono i file
|
|
...
con il bytecode delle
| ConsoleInputManager.calss
ConsoleOutputManager.class
classi
Compilatore e direttiva import
import prog.io.ConsoleOutputManager
Il compilatore:
• Individua il nome relativo del file prog\io\ConsoleOutputManager.class
• Forma il nome completo giustapponendo quello relativo ai percorsi specificati nella variabile CLASSPATH
Se
CLASSPATH = .;D:\mylib;C:\javalib;
cercherà nell’ordine i file .\prog\io\ConsoleOutputManager.class D:\mylib\prog\io\ConsoleOutputManager.c
C:\javalib\prog\io\ConsoleOutputManager.class
10
Nome completo della classe
C:
Percorso specificato
dal CLASSPATH
....
javalib
....
prog
io
....
ConsoleOutputManager.class
Percorso specificato
dalla direttiva di
importazione
....
Errori di compilazione
class BuonInizio {
// il metodo main
public static void main(String [] args) {
ConsoleOutputManager out = new ConsoleOutputManager();
out.println("Ti auguro una buona giornata!");
}
}
grossi[˜/lez01/java]->javac BuonInizio.java
BuonInizio.java:7: cannot find symbol
symbol : class ConsoleOutputManager
location: class BuonInizio
ConsoleOutputManager out = new ConsoleOutputManager();
ˆ
BuonInizio.java:7: cannot find symbol
symbol : class ConsoleOutputManager
location: class BuonInizio
ConsoleOutputManager out = new ConsoleOutputManager();
ˆ
2 errors
Errori di esecuzione
Compilazione ...
grossi[˜/lez01/java]->javac BuonInizio.java
grossi[˜/lez01/java]->
Esecuzione ...
grossi[˜/lez01/java]->java -classpath
/home/grossi/lib BuonInizio
Exception in thread "main"
java.lang.NoClassDefFoundError: BuonInizio
Cosa è successo??
11