Copyright © 1997 Universita' di Firenze. All rights reserved.
Free license available.
|
|
|
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à.
|
|
|
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 ...
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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:
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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++.
|
|
|
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à.
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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.
|
|
|
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.