Telemat Lab's home page

 

 

 



 
 

Copyright © 1997 Universita' di Firenze. All rights reserved.

Free license available.

La programmazione in Java

a cura di Davide Rinaldi, Maurizio Innocenti
Revisori: Paolo Bussotti, Maurizio Lunghi, Franco Pirri

        

La programmazione in Java


 
Indice generale 
Gruppo precedente 
Indice lezione corrente 
 
 
  
 
Slide successiva 
Testo 
 
Slide 1/18

Java è un linguaggio di programmazione ad oggetti nato in tempi recenti, ma che ha già avuto un notevole successo e diffusione in tutto il mondo. La fortuna di questo linguaggio è legata in maniera inequivocabile all'espansione della rete Internet che ne ha valorizzato le caratteristiche e gli ha offerto un vasto campo di sviluppo. Allo stesso modo anche la rete ha ottenuto innumerevoli vantaggi da questo linguaggio che ha portato ad una notevole semplificazione in fase di implementazione di molti servizi, alla semplificazione delle operazioni, ad un miglioramento sostanziale dell'interfaccia utente ed alla introduzione di nuove potenzialità.

 

 
 


 
 Indice generale 
Indice lezione precedente 
Indice lezione corrente 
 
Testo 
 inizio 
Slide precedente 
Slide successiva 
Testo 
 
Slide 2/18

La nascita di Java è avvenuta presso i laboratori di Sun Microsystem nei primi anni 90. Lo sviluppo di un nuovo linguaggio fu intrapreso per venire incontro a determinate esigenze che il C++, che in quel momento era il linguaggio fondamentale dello sviluppo del software, era inadatto a soddisfare. Tali esigenze possono così sintetizzarsi ...

  1. realizzare una reale indipendenza dalla piattaforma, cosa che con il C++ non si sarebbe riusciti mai a raggiungere, in quanto questo linguaggio permette un'accesso alle risorse a livello basso (ex puntatori), e quindi molto strettamente legato all'architettura.
  2.  La possibilità di avere una gestione della grafica più semplice e potente, dato il ruolo sempre più importante di questo settore e la enorme pesantezza di tale gestione con il C++.
  3. la maggiore sicurezza permettendo un accesso più limitato del  C++ alle risorse.
 
 


 
Indice generale 
 
Indice lezione corrente 
 
Testo 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 3/18

Il fattore decisivo per lo sviluppo di Java fu nel 1992 la nascita del WWW. Infatti Java per le caratteristiche che abbiamo detto sopra, prima di tutto l'indipendenza dalla piattaforma, si rivelò subito il miglior linguaggio per sviluppare software in questo nuovo ambito. A tale scopo furono introdotte le "applet" piccole applicazioni destinate al WEB di facile implementazione, essenzialmente per dotare di animazioni le classiche pagine HTML. L'applet è stato senza dubbio l'elemento che ha decretato il successo di Java, portando ad avvicinarsi a tale linguaggio un numero sempre più alto di persone. Nel 1995 vennero distribuiti dalla Sun Microsystems
il browser HOT JAVA e il pacchetto di sviluppo JDK che ebbero un tale successo da costringere  nel giro di pochissimo tempo i produttori di browser a dotare i loro sistemi della caratteristiche necessarie ad eseguire le applets java.
 
 


 
Indice generale 
 
Indice lezione corrente 
 
 
 Inizio 
Slide precedente 
Slide successiva 
Testo 
 
Slide 4/18

Vediamo ora cosa sono queste applets che hanno conquistato Internet. Un'applet è in pratica un piccolo programma in Java che può essere scaricato dalla rete, esattamente come  un'immagine o un suono all'interno di una sessione HTTP. La differenza fra queste e le applet sta nel fatto che l'applet è in realtà un programma e come tale può interagire con l'utente, modificandosi a seconda degli input che riceve.La grossa novità è legata allo sviluppo di HOT JAVA, cioè al fatto di poter far girare un programma Java sul browser andando ad inserirsi in un settore della programmazione completamente scoperto.

 
 


 
Indice generale 
 
Indice lezione corrente 
 
 
 Inizio 
Slide precedente 
Slide successiva 
Testo 
 
 

Slide 5/18

Un'applet viene messa a disposizione da un Server HTTP, da cui attraverso la rete risulta accessibile ad un qualsiasi utente dotato di Client HTTP (browser) opportunamente abilitato. L'applet viene caricata automaticamente e quindi eseguita come parte di un documento WEB. Naturalmente l'applet gira sul client, ma qui per ragioni di sicurezza le vengono impediti gran parte degli accessi, potenzialmente pericolosi alle risorse del sistema (ex: lettura e scrittura su hard disk, apertura di connessioni tcp/ip etc...). Questo avviene per garantire la sicurezza della macchina client verso applicazioni di  dubbia provenienza, che potrebbero essere virus oppure carpire informazioni locali all'insaputa dell'utente.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 6/18

Cominciamo adesso a vedere più in dettaglio questo linguaggio di programmazione. Anche se è nato in modo indipendente, Java mantiene alcune affinità con il C++, che sono state volutamente lasciate per renderlo più familiare e semplice da imparare al vasto numero di programmatori di questo linguaggio. Ma pur mantenendo alcune affinità non bisogna scordarsi che Java nasce proprio dall'esigenza di colmare alcune lacune lasciate proprio dal C++ e cioè un linguaggio che permettesse di utilizzare costrutti più semplici, sicuri e affidabili di questo. Vediamo più in dettaglio quali sono i costrutti più "pericolosi" di C e C++ che Java elimina:

Inoltre Java aggiunge garbage collection (GC) automatica, che elimina la delicata fase di distruzione degli oggetti allocati dinamicamente in C e C++, e conserva la tecnologia OO di base di C++

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 7/18

 Java è un linguaggio object oriented "puro", cioè che rispetta i principi di questo paradigma.  Questo, per esempio, non è vero per il C++ che perde alcune delle caratteristiche del paradigma OOP per mantenere la compatibilità con il C.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 8/18

Una delle caratteristiche fondamentali della programmazione ad oggetti è quella legata alla riusabilità del codice, cioè al fatto che una classe creata per un certo programma possa essere riutilizzata tranquillamente per un altro. Già il C++ permetteva di riusare le funzioni del linguaggio C.
Java, invece, fornisce uno standard per  il codice, sufficientemente elastico da essere efficiente, e vincola la progrqammazione all'OOP.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 9/18

Java è un tipo di linguaggio che per volontà dei propri creatori non privilegia le prestazioni, ma favorisce in generale la semplicità nella gestione di gran parte delle risorse ricorrendo spesso all'automazione di queste. Tale caratteristica fa si che Java risulti più potente, rispetto agli altri linguaggi, nella gestione di parti complesse della programmazione come la gestione della grafica o dei collegamenti in rete. D'altra parte un limite alle prestazioni è dato anche dalla presenza di una macchina virtuale (JVM) che interpretando il meta-codice (bytecode) realizza l'indipendenza dall'architettura.

 
 


 
Indice generale 
 
Indice lezione corrente 
 
 
 Inizio 
Slide precedente 
Slide successiva 
Testo 
 
 

Slide 10/18

Mentre il C e C++ affidano la gestione della memoria al programmatore, Java segue la direzione opposta, affidandola al sistema. Tale decisione scaturisce dal fatto che questa parte è fondamentale per la stesura di un buon software e che al momento rappresenta la più diffusa fonte di errore di programmazione per coloro che usano il C o il C++.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 11/18

L'elemento più significativo della gestione automatica della memori in Java è senza dubbio il garbage collector che si occupa di deallocare dalla memoria gli oggetti che non sono più utilizzati. Il garbage collector usa il multithreading: infatti viene gestito come un task a bassa priorità, che viene mandato in esecuzione nei tempi morti del programma, eliminando quegli oggetti che risultano inutilizzati. Anche in questo caso, si ripresenta la caratteristica di Java di semplificare le caose al programmmatore, a scapito delle potenzialità implementative. Infatti, se è vero che il programmatore qui non deve stare ad preoccuparsi della deallocazione della memoria inutilizzata, è anche vero, che perche avvenga questa operazione deve rimettesi alle modalità ed ai tempi di Java. In realtà, ciò, risulta un grave svantaggiosolo in quelle particolari situazioni in cui l'uso della memoria utilizzata è continuamente sfruttato al limite delle possibilità.  

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 

 

Per realizzare la neutralità dalla piattaforma del linguaggio gli sviluppatori di Java hanno diviso il passaggio dal codice ad alto livello a quello eseguibile in due momenti. In un primo momento il compilatore Java compila il sorgente in un codice intermedio detto bytecode. La Java Virtual Machine (JVM) si occupa di interpretare, in fase di esecuzione, il bytecode in codice eseguibile dalla particolare macchina su cui gira. In pratica è la JVM che rende Java un linguaggio multipiattaforma trasformando il codice intermedio in codice eseguibile dalla particolare macchina su cui si trova. Naturalmente il concetto di indipendenza dalla piattaforma per Java è legato alla presenza o meno di un'implementazione della JVM per una particolare piattaforma.

 

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
 
 
 
Slide 13/18

La Java Virtual Machine è una macchina che ha come codice eseguibile il bytecode. Il difetto più grande di questa soluzione è legato al fatto che la JVM è realizzata su ogni tipo di macchina a livello software cosa che si ripercuote sulle prestazioni che risultano di gran lunga infriori a quelle del C++; si noti infatti che l'utilizzao di una JVM a livello software corrisponde ad una interpretazione del meta-codice.  Per migliorare le prestazioni di Java, Sun Microsystems ha realizzato una macchina Java a livello hardware.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 14/18

Per quanto riguarda la robustezza Java limita la libertà dei programmatori in alcuni settori in modo da diminuire la probabilità di errori e favorire la loro individuazione nelle fasi iniziali della programmazione.

Un'altra importante caratteristica di Java è la dinamicità nella compilazione che permette in caso di modifica di dover ricompilare solo quelle classi che sono state ritoccate in quanto la fase di linking e l'interpretazione avvengono insieme all'esecuzione.

 
 


 
Indice generale 
 
Indice lezione corrente 
 
 
 Inizio 
Slide precedente 
Slide successiva 
Testo 
 
 

Slide 15/18

La sicurezza uno dei principi fondamentali nella progettazione di Java. Infatti Java garantisce una  affidabilità strutturale in questo campo già con la fase di caricamento differenziato delle classi residente in rete. Queste ultime sono sottoposte ad una verifica contro modifiche dolose del codice. inoltre il bytecode può essere certificato.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 16/18

Java presenta ottimi parametri di sicurezza anche per la programmazione in rete, non solo con le applet, ma anche con la gestione delle risorse di rete contenuta nel package java.net . Infatti Java è in grado di interfacciarsi con le risorse di rete e di gestirle. Questo fa si che la sicurezza della connessione passi in mano a Java che permette di stabilire livelli di sicurezza negli accessi, oppure di riconoscere un determinato codice come sicuro, grazie ad una particolare tecnica di crttiografia.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 17/18

La programmazione multi-thread consiste nel dividere un programma in due o più processi che possono essere eseguiti in parallelo. Tali processi vengono chiamati thread, da cui il nome programmazione multi-thread. Per ognuno di questi  il programmatore può stabilire una priorità, in modo tale che il processore dia la precedenza ai thread a priorità più alta rispetto a quelli a priorità più bassa. Questo tipo di programmazione può essere usato in molte situazioni, dalle animazioni alla lettura e scrittura dalla rete, ed in particolare in quelle  operazioni che non impegnano eccessivamente  la CPU. Naturalmente questo approccio è valido finché non crea all'utente fastidiosi ritardi.

 
 


 
Indice generale 
Indice lezione precedente 
Indice lezione corrente 
Gruppo successivo 
 
  
Slide precedente 
Slide successiva 
Testo 
 
Slide 18/18

Questo sistema sfrutta il fatto che molti thread (thread= processo leggero) di elaborazione spendono gran parte del loro tempo ad attendere la disponibilità di una risorsa o un'interruzione. Se si possono trasformare i propri task in thread di controllo indipendenti, e saltare automaticamente da un task che è in attesa ad uno che ha qualcosa da svolgere, allora si può compiere più lavoro nello stesso lasso di tempo. Ci sono poche probabilità che più di uno dei propri task richieda contemporaneamente l'uso della CPU per un tempo abbastanza esteso.Questo è quello che fa la programmazione multi-thread in Java,  permettendo  la realizzazione di programmi mutlitasking.

 

 

 


       Telemat Lab's home page