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