Programmazione ad Oggetti Java Parte I Overview Caratteristiche generali 1
Caratteristiche generali Un moderno linguaggio orientato agli oggetti Pensato per lo sviluppo di applicazioni che devono essere eseguite in un ambiente eterogeneo connesso in rete Portabile Semplice Robusto Sicuro Multithreaded Portabilità Portabilità del codice sorgente Un programma scritto in un linguaggio ad alto livello per una determinata macchina virtuale (processore, s.o.) può essere riutilizzato in una macchina virtuale differente? Un esempio Livello Semantico Compilatore 1 Macchina 1 Processore 1 Ansi C Compilatore 2 Macchina 2 Processore 2 Gap Semantico Compilatore N Macchina N Processore N 2
Portabilità (2) Il codice sorgente scritto in Ansi C è portabile! ma la portabilità del codice sorgente richiede la ricompilazione su ogni piattaforma Inoltre, cosa succede se un programma C deve invocare API del sistema operativo? La portabilità è limitata a quelle macchine virtuali che supportano quelle specifiche API Portabilità di Java Java garantisce la portabilità del codice eseguibile grazie alla Java Virtual Machine (JVM) Write Once Run Everywhere! Livello Semantico Sorgente Java Eseguibile Java (Byte Code) generato dal compilatore Java JVM JVM JVM Interprete Java 1 Interprete Java 2 Gap Semantico Interprete Java N Macchina 1 Macchina 2 Macchina N Processore 1 Processore 2 Processore N 3
Ciclo di Sviluppo Nome.java Sorgente Compilatore Class Loader Nome.class Bytecode JVM Just in Time Compiler Sistema Operativo Processore Ciclo di Sviluppo (2) Il compilatore non produce codice macchina, ma un insieme ottimizzato di istruzioni detto BYTECODE. Il sistema run-time di Java emula una macchina virtuale (Java Virtual Machine) che esegue il BYTECODE. Ogni architettura per la quale la Virtual Machine sia implementata, può eseguire lo stesso programma Java. L efficienza di esecuzione di Java è superiore rispetto agli altri linguaggi interpretati (Tcl, Perl...), anche se non raggiunge quella dei linguaggi compilati. Inoltre l interprete Java fornisce compilatori just in time per trasformare a runtime il BYTECODE in codice macchina, guadagnando in velocità, ma perdendone la portabilità. 4
Ancora sulla portabilità Oggi possiamo continuare a dire Write Once, Run Everywhere? Java supporta nuovi dispositivi con caratteristiche hardware molto omogenee tra loro Le diverse piattaforme Java 2 Standard Edition (J2SE) E la piattaforma base per workstation e server Java 2 Enterprise Edition (J2EE) E una estensione della piattaforma base arricchita con servizi per la sicurezza, la gestione delle transazioni, Supporta il modello a componenti Enterprise Java Bean (EJB) Java 2 Micro Edition (J2ME) E la piattaforma ridotta per palmari, cellulari, 5
Le diverse piattaforme (2) Portabilità legata alla piattaforma J2SE-JVM ClassLoader Serialization Reflection RMI J2ME-KVM Sicurezza Un eseguibile prodotto da altri e scaricato via rete sulla propria macchina potrebbe trasmettere virus o accedere a dati privati. Un programma Java non può violare la sicurezza! L esecuzione di un BYTECODE Java é confinata nel sistema runtime che lo interpreta. Nel linguaggio non esistono i puntatori. L applet non può scrivere né leggere sul client, né aprire connessioni con altri sistemi. 6
Robustezza 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 Dinamicità 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 7
Concorrenza 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 Ricchezza La Standard Library Java contiene una ricca collezione di classi e di metodi preconfezionati: Language support Utilities Input/output Networking Abstract Window Toolkit (AWT) 8
Package Un package raggruppa un insieme di classi correlate, che possono essere importate nelle applicazioni. L appartenenza ad un pacchetto si realizza inserendo all inizio del file l istruzione : package MyPackage; Per importare in una applicazione le classi del pacchetto: import MyPackage.*; java.lang java.io java.util java.net java.applet java.awt java.awt.image java.awt.peer Semplicità 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++--==) 9
Distribuzione 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) 10