Programmazione ad Oggetti Java – Parte I Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR Overview • Caratteristiche generali Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Ansi C Compilatore 1 Compilatore 2 Linguaggio Macchina 1 Linguaggio Macchina 2 Processore 1 Gap Semantico Compilatore N Linguaggio Macchina N Processore 2 Processore N Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR Portabilità di Java • Java garantisce la portabilità del codice eseguibile grazie alla Java Virtual Machine (JVM) – Write Once Run Everywhere! Sorgente Java Livello Semantico Eseguibile Java (Byte Code) generato dal compilatore Java JVM JVM Interprete Java 1 Interprete Java 2 Linguaggio Macchina 1 Linguaggio Macchina 2 Processore 1 JVM Gap Semantico Interprete Java N Linguaggio Macchina N Processore 2 Processore N Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 3 Ciclo di Sviluppo Nome.java Sorgente Compilatore Class Loader Nome.class Bytecode JVM Just in Time Compiler Sistema Operativo Processore Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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à. Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 4 Ancora sulla portabilità • Oggi possiamo continuare a dire “Write Once, Run Everywhere”? – Java supporta nuovi dispositivi con caratteristiche hardware molto omogenee tra loro Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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,… Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 5 Le diverse piattaforme (2) • Portabilità legata alla piattaforma J2SE-JVM ClassLoader Serialization Reflection RMI J2ME-KVM Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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. Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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) Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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 Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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++--==) Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 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) Corso di Programmazione ad Oggetti Ing. Antonio Coronato Seconda Università di Napoli ICAR - CNR 10