Java: un linguaggio per applicazioni di rete Moreno Falaschi Dipartimento di Ingegneria dell’Informazione e Scienze Matematiche Università di Siena March 3, 2014 1 Caratteristiche di Java • (SUN) Linguaggio semplice, orientato agli oggetti, distribuito, interpretato, indipendente dall’architettura, portabile, alte-prestazioni, multi-thread, dinamico. Le caratteristiche di Java per applicazioni di rete: • Un programma Java (applet) (sottoclasse della classe di sistema APPLET) può essere richiamato mediante alcune istruzioni (TAG apposito) inserite in un documento HTML eseguibili su un qualsiasi WEB-browser abilitato per Java. • Un programma Java puo accedere a files contenenti suoni, immagini, testi ed altri programmi Java ovunque situati sulla rete WEB, mediante dei riferimenti basati su indirizzi WEB (URL). 2 Caratteristiche di rete: Permette una programmazione interattiva (creazione e gestione di finestre, movimenti del mouse, bottoni, menu, ecc...), indipendente dalla architettura! Queste caratteristiche non fanno parte del linguaggio, ma sono aggiunte mediante un gran numero di classi di sistema. L’esecuzione dei programmi Java caricati sulla rete avviene con il metodo della “migrazione del codice”. Il codice Java eseguibile viene caricato dal WEB-browser prelevandolo dal sito remoto e viene eseguito sulla propria macchina. Non si aggravia il server remoto. L’esecuzione locale è efficiente (alternative?) Quindi il costo maggiore (con le reti attuali, lente) risiede nel trasferimento del codice. 3 Java: caratteristiche linguistiche Linguaggio object-oriented, con una sintassi simile a C e C++. • per permettere ai programmatori di linguaggi diffusi ed efficienti come C e C++ di passare “agevolmente” alla programmazione in Java È cosi agevole? C è procedurale, non è semplice passare ad una programmazione in stile O.O. Un programmatore C++ trova meno difficoltà però vi sono diverse differenze per le caratteristiche O.O. Linguaggio interpretato. Il compilatore Java produce codice intermedio indipendente dalla macchina (bytecode) che verrà poi interpretato dall’interprete Java (sulla macchina astratta Java). La indipendenza dall’architettura è fondamentale dato che il codice Java deve essere eseguito su architetture diversissime sulla rete. 4 Codice portabile: applicazioni sviluppate in Java eseguibili ’ovunque’. Tutti i tipi di dato primitivi (ad esempio i tipi numerici) sono definiti mediante degli standard. i compilatori Java devono rispettarli (a differenza del C++) 5 Caratteristiche di Java È un linguaggio dinamico in quanto permette di caricare classi durante l’esecuzione con opportuni metodi. Linguaggio distribuito: il package java.net (contenente la classe URL..) permette di caricare files distribuiti trattandoli come fossero locali. La versione Java 1.0 non dava nessuna possibilità di esecuzione distribuita in senso classico. Nella versione 1.1 è stata aggiunta la possibilità di invocare un metodo remoto contenuto in un oggetto Java su un sito remoto. Linguaggio semplice: pochi costrutti, semplici e sintatticamente simili a C e C++. Importanti rimozioni dal linguaggio: goto, puntatori, istruzioni esplicite per recuperare segmenti di memoria dinamica allocata per le strutture dati. 6 Caratteristiche linguistiche di Java Linguaggio Robusto: permette lo sviluppo di software affidabile Controllo dei tipi forte (quasi tutto statico) Assenza di puntatori Conversioni di tipo esplicite sugli oggetti controllate a run-time. Garbage collection, incrementale: meno errori gestione memoria. Meccanismi linguistici per la gestione delle condizioni di errore (eccezioni) 7 Sicurezza: • l’esecuzione del codice avviene sul proprio computer quindi bisogna evitare di caricare virus. Ovviamente non c’e’ mai una garanzia totale, però: – il bytecode non puo’ contenere operazioni di accesso alla memoria (niente puntatori) – l’interprete Java effettua un controllo accurato da questo punto di vista sul codice potenzialmente “non sicuro” verificando che il bytecode sia tutto codice eseguibile. – Le richieste di risorse di sistema (come per esempio la gestione dei file) vengono monitorate da una classe di sistema ‘SecurityManager’ . Molte limitazioni. – In Java 1.1 si può aggiungere una ‘firma’ digitale (di garanzia) crittografata al codice Java, per poter eseguire il codice in ‘sicurezza’. 8 Velocità e esecuzione parallela/distribuita • Alta velocità: 20 volte più lento di codice C (in Java 1.0), 10 volte (in Java 1.1) – Si puo’ compilare a run time in codice nativo. Alcuni interpreti Java includono compilatori Just in time – Ci sono metodi in Java che permettono di interfacciarsi con codice compilato C o C++ (ovviamente perdendo la portabilita’) Linguaggio Multithread Quindi permette programmazione concorrente basata su thread (programmi sequenziali) eseguibili in parallelo e sincronizzati mediante il costrutto ’sincronized’. classe di sistema Thread (creazione thread, assegnazione priorita’, ecc..) costrutto ’syncronized’. Permette di marcare regioni critiche e metodi che devono essere eseguiti in mutua esclusione. 9 Conclusioni: • Java è un linguaggio ‘intermedio’ tra scripting languages e linguaggi compilati in codice di basso livello come C e C++ • Introduce un controllo diretto della multimedialità rendendo le operazioni interattive. • È portabile e rende le applicazioni eseguibili ovunque. • Alcune critiche/osservazioni: il linguaggio è semplice ma non è semplice usare le classi di sistema (oltre 500 metodi di sistema nella versione 1.1. Anche spiegare il significato dei parametri risulta complesso) La costruzione di un’interfaccia grafica è meno automatica che in un linguaggio visuale. Il linguaggio non possiede ancora una definizione rigorosa fornita dai progettisti (esistono adesso molti lavori di ricerca che definiscono una semantica formale del nucleo del linguaggio). Le classi di sistema si ‘apprendono’ per esempi. Risulta difficile poi fare modifiche con sicurezza. Sarebbe quindi opportuno avere a disposizione potenti strumenti di sviluppo del software. 10 Il fatto che manchi una definizione rigorosa può portare ad errori anche nell’implementazione. Estensioni per la programmazione distribuita. Strumenti di ottimizzazione del codice Estensione dei tipi in Java. Verifica di correttezza di programmi Java. Utilità di altri linguaggi a più alto livello (linguaggi dichiarativi) compilati su Java, per ampliare l’insieme delle possibili applicazioni: – Intelligenza artificiale, sistemi esperti, problemi di ricerca di soluzioni, soluzione di vincoli. 11