CHE COS’È JAVA • È un linguaggio (e relativo ambiente di programmazione) definito dalla Sun Microsystems … • … per permettere lo sviluppo di applicazioni sicure, performanti e robuste su piattaforme multiple, in reti eterogenee e distribuite (Internet) IL LINGUAGGIO JAVA: CARATTERISTICHE • • • • • • • • • Semplice e orientato agli oggetti Interpretato Architetturalmente neutro e portabile Robusto Distribuito Sicuro Dinamico Ad elevate prestazioni Concorrente (multithread) SEMPLICE E OO • Sintassi simile a C e C++ (facile da imparare) • Elimina i costrutti più "pericolosi" di C e C++ – – – – – aritmetica dei puntatori (de)allocazione esplicita della memoria strutture (struct) definizione di tipi (typedef) preprocessore (#define) • Aggiunge garbage collection automatica • Conserva la tecnologia OO di base di C++ • Rivisita C++ in alcuni aspetti (C++--==) INTERPRETATO • Il compilatore produce un codice di tipo intermedio per una “Java Virtual Machine” (“byte-code”) ... • … che viene interpretato codice codice sorgente sorgente compilatore compilatore byte bytecode code interprete interprete BYTECODE: ESEMPIO void spin ( ) { int i; for (i = 0; i < 100; i++) { ; } 0 } 1 2 5 8 9 11 14 iconst_0 // push int constant 0 istore_1 // store into local 1 (i=0) goto 8 // first time, don’t increment iinc 1 1 // increment local i by 1 (i++) iload_1 // push local 1 (i) bipush 100 // push int constant (100) if_icmplt 5 // compare, loop if < (I<100) return // return void when done ARCHITETTURALMENTE NEUTRO • Il byte-code è indipendente dall’architettura hardware (ANDF: Architecture Neutral Distribution Format) • Pertanto, un programma bytecode può essere eseguito su qualsiasi sistema su cui giri un ambiente run-time Java ESEMPIO Sistema tradizionale compilatore compilatore macchina macchinaAA codice codice sorgente sorgente compilatore compilatore macchina macchinaBB eseguibile eseguibile macchina macchinaAA eseguibile eseguibile macchina macchinaBB ……. Sistema ANDF compilatore compilatore macchina macchinaAA codice codice sorgente sorgente compilatore compilatore macchina macchinaBB ……. interprete interprete macchina macchinaAA byte bytecode code interprete interprete macchina macchinaBB ……. ESEMPIO • Il formato dei dati è specificato esattamente, e non “di minima”, come nel C: – byte – short – int – long – float – double – char 8 bit complemento a 2 16 bit “ 32 bit “ 64 bit “ 32 bit IEEE 754 floating 64 bit “ 16 bit Unicode PORTABILE • Il sistema Java (compilatore + interprete + librerie run-time) è facilmente portabile su piattaforme diverse codice codice sorgente sorgente compilatore compilatore byte bytecode code interprete interprete libreria libreria – il compilatore Java è scritto in Java – l’ambiente run-time è scritto in ANSI C con interfacce standard (POSIX) verso il sistema operativo – nessuna “implementation dependency” S.O. ROBUSTO • Controlli estensivi a compile-time e a run-time, per rilevare gli errori quanto prima possibile (es.: type checking) • Per questo, le caratteristiche insicure di C e C++ sono rimosse: – Nessuna gestione esplicita dei puntatori (no aritmetica dei puntatori, no malloc e free esplicite, …) – Gestione della memoria con garbage collection – Array e stringhe “veri” • Verifica del byte-code a load-time DISTRIBUITO • Pensato per essere eseguito in rete • L’ambiente run-time incorpora funzioni di rete (sia di basso livello: TCP/IP, che di alto livello: HTTP, …) • La rete è facilmente accessibile (come i file locali) SICURO • L’ambiente di esecuzione si protegge da bytecode potenzialmente “ostile” • Esempi: – il bytecode viene verificato prima dell’interpretazione (“theorem prover”), in modo da essere certi di alcune sue caratteristiche – gli indirizzamenti alla memoria nel bytecode sono risolti sotto il controllo dell’interprete COMPILE-LOAD-RUN Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Rete Verifica Verificadel del byte-code byte-code Interprete Interprete Compilatore Compilatore Byte-code Byte-code Java Java Ambiente Ambiente run-time run-time hardware hardware ELEVATE PRESTAZIONI • La verifica del bytecode permette di saltare molti controlli a run-time: l’interprete è pertanto efficiente • Per maggiore efficienza, possibilità compilazione on-the-fly del bytecode in codice macchina COMPILAZIONE ON-THE-FLY Loader Loader delle delleclassi classi Sorgente Sorgente Java Java Rete Interprete Interprete Generatore Generatore di dicodice codice Compilatore Compilatore Byte-code Byte-code Java Java Verifica Verificadel del byte-code byte-code Ambiente Ambiente run-time run-time hardware hardware DINAMICO • Il codice è eseguibile anche in assenza di alcuni moduli: • … le classi necessarie per la esecuzione di un programma Java possono essere caricate e collegate dinamicamente quando servono Esempio: nuove release di moduli caricabili automaticamente dalla rete quando servono CONCORRENTE • Multithreading parte integrante del linguaggio: – Applicazioni interattive più facili a scriversi – Migliore "reattività" (anche se non real-time) Esempio: caricamento asincrono di immagini nei browser di rete riduce i tempi di attesa RICCO La Standard Library Java contiene una ricca collezione di classi e di metodi preconfezionati: –Language support –Utilities –Input/output –Networking –Abstract Window Toolkit (AWT) JAVA E INTERNET WEB BROWSER E SERVER Server abc.com Server xyz.com Client Hyperlink Browser program to xyz.com Disk HTTP used over this TCP connection Internet Disk HTTP Server HTTP Server URL: Uniform Resource Locator <protocollo> :// <nome del server> <nome del file> Esempio: deve essere risolto in un http://www.dsi.unimi.it/DSI/corsi/programmi/F2 indirizzo internet (IP) 8005/index.html con l’aiuto di un Domain Name Server (DNS) HTML: ESEMPIO <HTML> <HEAD> <TITLE> Esempio </TITLE> Esempio </HEAD> Testo <BODY> DSI <P> Testo <A HREF=“http://www.dsi.unimi.it”> DSI </A> </BODY> </HTML> APPLET JAVA • Sono programmi Java riferiti da link in pagine HTML • Vengono caricati e interpretati dal browser (se questo supporta Java) • Permettono di “animare” le pagine web HTML con APPLET: ESEMPIO <HTML> <HEAD> <TITLE> Esempio </TITLE> Esempio </HEAD> Testo <BODY> Hallo! <P> Testo <APPLET CODE=“HelloWorld.class WIDTH=300 HEIGHT=80> Qui c’è un applet che ti saluta </APPLET> testo che esce se il browser non supporta gli applet </BODY> </HTML> JAVA BROWSER rete TCP / IP http client interprete HTML ftp ftp client client java loader interprete JAVA I/O library local disk UI library UN NUOVO PARADIGMA: NETWORK COMPUTING Approccio tradizionale DATI PROGRAMMI RETE PC Network computing PROGRAMMI E DATI load and run RETE NC “Installazione del kit di sviluppo di Java (SDK) ed esecuzione del primo programma” Installazione del JDK sul disco fisso • Ricerca o download dell’eseguibile JDK • Doppio click sull’icona del file A questo punto partirà la procedura automatica d’installazione. Seguire le istruzioni a video. Installazione del JDK sul disco fisso Se l’installazione va a termine correttamente sul disco fisso sarà presente la directory Jdk1.X.X con le seguenti sotto directory: • • • • bin, contente il compilatore e gli altri eseguibili; demo, contente alcuni demo; lib, etc. jre: contiene l’interprete, estensioni, ed altre informazioni di configurazione • docs: contiene la documentazione (N.B.: da scaricare separatamente) PATH e CLASSPATH • Cosa è una variabile di ambiente: – Una variabile del sistema operativo e visibile da tutte le applicazioni – Può essere settata temporaneamente in una finestra – Può essere settata per l’intero sistema • PATH: contiene la lista delle directory dove il sistema operativo cerca i comandi da eseguire • CLASSPATH: contiene la lista delle directory dove il compilatore java e l’interprete cercano le classi • JAVA_HOME: per far sapere ad applicazioni che utilizzano JAVA dove si trova la cartella di Aggiornamento delle variabili di ambiente Prima di poter scrivere ed eseguire un programma Java è necessario aggiornare le variabili di ambiente per permettere al sistema operativo di trovare il compilatore Java e le classi di sistema. Bisogna aggiornare quindi il PATH e aggiungere una variabile di ambiente detta CLASSPATH 2.1- Aggiunta nel Path di Jdk\bin La procedura è leggermente diversa a seconda del sistema operativo adoperato: • Sotto Windows 98 si deve inserire nella variabile path dell’AUTOEXEC.BAT il percorso “drive”:\jdk1.XX\bin. Ad esempio la linea set path= C:\WINDOWS;C:\WINDOWS\COMMAND; diventa: Set path=C:\WINDOWS;C:\WINDOWS\COMMAND;c:\jdk1.XX\bin Aggiunta nel Path di Jdk\bin • Sotto Windows XP/2000 si deve aprire il control panel, selezionare System (o Sistema nella versione Italiana), quindi Environment (o Ambiente). Scorrere la lista fino a trovare la variabile chiamata PATH e aggiungere il testo “drive”\jdk1.XX\bin all’inizio o alla fine della linea. Dove “drive” è il disco su cui si è installato il Jdk Attenzione il Sistema Operativo cerca in Ordine …..!!!! 2.2-Aggiunta della variabile ClassPath La procedura è identica al caso precedente, con la differenza che la variabile d’ambiente deve essere aggiunta in quanto non presente in genere fra quelle standard. Sotto Win98 quindi bisogna aprire l’AUTOEXEC.BAT e aggiungere la linea: SET CLASSPATH=.;c:\Nome_dir_lavoro\ Aggiunta della variabile ClassPath • Sotto WinXP/2000 bisogna aprire il pannello di controllo, quindi aprire l’icona System e selezionare la scheda Environment . Nel campo Variabile scrivere: CLASSPATH Nel campo valore: .;c:\Nome_dir_lavoro\ Aggiunta della variabile ClassPath Con il punto s’indica al compilatore Java di cercare le eventuali altre classi nella stessa directory dove si trova il file sorgente. La stringa “Directory_Lavoro” si dovrà sostituire con il nome dato alla directory che conterrà i file .class (mentre inserire il punto nel ClassPath è necessario, indicare una directory di lavoro è opzionale) Scrittura del programma di esempio Il modo più semplice per editare un file sorgente Java è quello di adoperare un programma di scrittura come Notepad o WordPad di Windows. Supponiamo di voler scrivere il seguente programma Java, che stampa a video un messaggio di saluto: Testo del primo programma public class HelloWord { public static void main (String[] args) { System.out.println(“Hello world”); } } Generazione del bytecode Una volta scritto con un editor il testo si salvi il file con il nome HelloWorld.java (in Java è obbligatorio chiamare il file sorgente con lo stesso nome della classe che contiene il main). N.B.: Visualizza estensioni Aprire una finestra Dos, posizionarsi nella directory dove si è salvato il file sorgente e lanciare il “Compilatore” (in realtà non è un vero compilatore in quanto non genera codice oggetto ma bytecode). 3.2-Generazione del bytecode Il comando da eseguire è: javac HelloWorld.java Si ricorda che Java distingue tra maiuscole e minuscole, quindi i nomi helloWorld, helloworld e Helloworld sono tutti e tre errati. •Perche trova javac ? •Perche trova HelloWord. java? 3.3-Esecuzione del bytecode Per eseguire il file HelloWorld.class generato si deve lanciare la Java Virtual Macchine. Il comando da adoperare sarà: java HelloWorld Si noti che non deve essere presente l’estensione .class •Perche trova java ? Quale Java usa ? •Perche trova HelloWord ? •Se mi trovassi altrove ? 4-Un altro esempio In questo secondo esempio si adopererà la libreria grafica di Java, creando una dialog box per l’immissione di alcuni dati. Lo scopo del programma è solo quello di mostrare un primo esempio di output grafico, non è necessario comprendere tutte le istruzioni. Il testo sorgente è: Testo secondo esempio import javax.swing.*; public class InputTest { public static void main(String[] args) { String nome=JOptionPane.showInputDialog (“Come ti chiami?”); System.out.println(“Salve “+nome); System.exit(0); } } Compilazione ed esecuzione del secondo esempio Il file va salvato con lo stesso nome della classe con in più l’estensione .java (InputTest.java). Per la generazione del bytecode il comando sarà: javac InputTest.java Per l’esecuzione: java InputTest Esecuzione del programma Eseguendo il programma compare la seguente finestra di input: Esecuzione del programma Immettendo dei caratteri e premendo OK si otterrà un output su console.