Post on 15-Feb-2019
CHE COS’È JAVA
• È un linguaggio (e relativo ambiente di programmazione) definito dalla Sun Microsystems …
• … per permettere lo sviluppo di applicazioni sicure, performanti e robustesu piattaforme multiple, in reti eterogeneee 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++--==)
• Il compilatore produce un codice di tipo intermedio per una “Java VirtualMachine” (“byte-code”) ...
• … che viene interpretato
INTERPRETATO
codicesorgentecodice
sorgente byte codebyte codecompilatorecompilatoreinterpreteinterprete
BYTECODE: ESEMPIOvoid spin ( ) {
int i;for (i = 0; i < 100; i++) {
;}
} 0 iconst_0 // push int constant 01 istore_1 // store into local 1 (i=0)2 goto 8 // first time, don’t increment5 iinc 1 1 // increment local i by 1 (i++)8 iload_1 // push local 1 (i)9 bipush 100 // push int constant (100)11 if_icmplt 5 // compare, loop if < (I<100)14 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
ESEMPIOSistema tradizionale
codicesorgentecodice
sorgente
eseguibilemacchina Aeseguibile
macchina Acompilatoremacchina A
compilatoremacchina A
Sistema ANDF
eseguibilemacchina Beseguibile
macchina B
compilatoremacchina B
compilatoremacchina B
…….
codicesorgentecodice
sorgente byte codebyte code
compilatoremacchina A
compilatoremacchina A
compilatoremacchina B
compilatoremacchina B
…….
interpretemacchina Ainterprete
macchina A
interpretemacchina Binterprete
macchina B
…….
ESEMPIO
• Il formato dei dati è specificato esattamente, e non “di minima”, come nel C:
– byte 8 bit complemento a 2– short 16 bit “– int 32 bit “– long 64 bit “– float 32 bit IEEE 754 floating– double 64 bit “– char 16 bit Unicode
• Il sistema Java (compilatore + interprete + librerie run-time) è facilmente portabile su piattaforme diverse
PORTABILE
– 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”
codicesorgentecodice
sorgente byte codebyte codecompilatorecompilatore interpreteinterprete
librerialibreria S.O.
ROBUSTO
• Controlli estensivi a compile-time e a run-time, per rilevare gli errori quanto prima possibile (es.: typechecking)
• 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
CompilatoreCompilatore
Byte-codeJava
Byte-codeJava
Rete
hardwarehardware
Loaderdelle classi
Loaderdelle classi
InterpreteInterprete
Ambienterun-time
Ambienterun-time
Verifica delbyte-code
Verifica delbyte-code
SorgenteJava
SorgenteJava
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
CompilatoreCompilatore
Byte-codeJava
Byte-codeJava
Rete
hardwarehardware
Loaderdelle classi
Loaderdelle classi
InterpreteInterprete
Ambienterun-time
Ambienterun-time
Verifica delbyte-code
Verifica delbyte-code
SorgenteJava
SorgenteJava
Generatoredi codice
Generatoredi codice
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)
WEB BROWSER E SERVER
HTTP used overthis TCP connection
Internet
Disk Disk
Hyperlink
to xyz.com
HTTPServer
HTTPServer
Client
Server abc.com Server xyz.com
Browserprogram
URL: Uniform Resource Locator
<protocollo> :// <nome del server> <nome del file>
Esempio:http://www.dsi.unimi.it/DSI/corsi/programmi/F2
8005/index.htmldeve essere risolto in un indirizzo internet (IP) con l’aiuto di un DomainName 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>
</BODY></HTML>
testo che esce se il browser non supporta gli applet
JAVA BROWSER
httpclient
ftpclient
ftpclient
javaloader
UI library
TCP / IP
interpreteJAVA
I/Olibrary
local disk
rete
interpreteHTML
UN NUOVO PARADIGMA:NETWORK COMPUTING
Approccio tradizionale
Network computing
PROGRAMMIDATI
RETE
PROGRAMMI E DATI
RETE
PC
NC
loadand run
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:
CLASSPATHNel 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 ilnome 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 bytecodePer 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 dialogbox 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 esempioimport 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.javaPer l’esecuzione:
java InputTest