GPG - Copertina - GIMP |
Articoli
Java sotto Linux
2.1 Java è un linguaggio OOP
Java è un linguaggio di programmazione effettivamente
Object Oriented; diversamente
dal C++, in cui la implementazione Object Oriented consistente fondamentlmente
nella possibilità di costruire con un certo agio nuovi tipi di dati,
Java implementa le caratteristiche più proprie e peculiari della
programmazione Object Oriented quali, ad esempio, il multithrading,
l'effettivo overloading e un controllo strettissimo dell'accesso
ai dati interni di un particolare oggetto da
parte di altri oggetti. I principali costrutti sintattici (cicli for,
while, do...while, gli operatori di: incremento ++, decremento
--, etc.) dei due linguaggi sono formalmente simili; tuttavia,
occorre tener ben presente che tale somiglianza è, appunto,
esclusivamente formale (sintattica, per la precisione) e si riferisce unicamente
al modo in cui tali strutture ed operatori appaiono, per così dire,
nel file sorgente.
Ad esempio, tanto per rendere l'idea, il seguente frammento di
codice Java:
for(pluto=1 ; pluto<10 ; pluto++)in un file sorgente C/C++ apparirebbe come:
System.out.println("Java stampa sullo stream out");
for(pluto=1 ; pluto<10 ; pluto++)Dunque, le somiglianze sintattiche tra Java è C++ si riducono, sostanzialmente, ad analogie di questo tipo. Naturalmente, entrambi i linguaggi implementano i concetti di Classe e Oggetto, seppure con alcune differenze sintattiche. Inoltre, Java non implementa i puntatori ed i costrutti struct e union.
printf("C++ stampa sullo stream out");
2.1.1 Java ha Class, oggettivamente
In quanto segue si descrivono sommariamente i concetti di Classe e Oggetto,
caratteristici della programmazione OOP . Chi
avesse bisogno di familiarizzarsi ulteriorermente con gli elementi della
programmazione Object Oriented, o volesse approfondirne gli aspetti
più avanzati, può seguire il link OOP.
Il concetto di classe è fondamentale nella programmazione Object
Oriented; un oggetto è, in sostanza, una istanza particolare di
una data classe. Una Classe costituisce un modello generale
attraverso il quale vengono descritte le caratteristiche universali
di una determinata struttura. Tali caratteristiche universali sono
precisamente quelle che ciascun Oggetto particolare, modellato sulla Classe,
deve condividere con gli Oggetti appartenenti alla sua classe.
Si consideri, ad esempio, un oggetto tipico della vita quotidiana:
il tavolo. A titolo di esemplificazione, le caratteristiche più
generali che individuano e caratterizzano un tavolo possono essere ridotte
alle seguenti:
public class Tavolo {Nella prima parte della Classe sono definite le variabili che caratterizzano in modo generico un tavolo, indicandone le due caratteristiche distintive: il piano di appoggio (areapiano: l'area della superficie del piano d'appaggio) e le gambe (lungamba: lunghezza delle gambe del tavolo). Nella seconda parte, quella che segue il commento Costruttore della classe, c'è il codice attraverso cui, ogni volta si crei un Oggetto della Classe Tavolo, a tale Oggetto vengono assegnati: l'area della superficie del piano d'appoggio, in questo caso uguale a 2 volte l'unità di misura di superficie; la lunghezza delle gambe, pari, nel presente esempio, a 1 volta l'unità di misura di lunghezza. Tale codice è detto costruttore della Classe e deve essere dichiarato con lo stesso nome della Classe. Ogni Classe può avere più di un costruttore, ognuno dei quali può essere invocato per inizializzare, in modo peculiare, un particolare oggetto. Tutti i costruttori hanno lo stesso nome della Classe; Java distingue i costruttori dal numero e dal tipo di argomenti, diversi per ciascun costruttore. Ad esempio, per rendere la Classe di utilità più generale, la si può dotare di un costruttore attraverso il quale è possibile, quando necessario, creare un Oggetto del tipo Tavolo assegnandogli, di volta in volta, misure per l'area e lunghezza diverse da 2 e 1, rispettivamente; il codice per un tale costruttore potrebbe essere:public int areapiano = 0; // area del piano
public int lungamba = 0; // lunghezza delle gambe
// Costruttore della Classepublic Tavolo() {this.areapiano = 2;
this.lungamba = 1;}}
public Tavolo(int sup, int lung) {}this.areapiano = sup;
this.lungamba = lung;
Il codice della Classe, con entrambi i costruttori, è:
public class Tavolo {public int areapiano = 0; // area del piano
public int lungamba = 0; // lunghezza delle gambe
// Costruttori della Classe Tavolo
Ora, usando la classe sopra definita, è possibile creare (istanziare, nel gergo di Java) Oggetti Tavolo con qualsiasi area della superficie d'appoggio e qualsiasi lunghezza delle gambe.public Tavolo() {public Tavolo(int sup, int lung) {this.areapiano = 2;
this.lungamba = 1;}
}this.areapiano = sup;
this.lungamba = lung;
}
Viceversa, per istanziare un Oggetto con misure standard di 2 e 1, deve essere usato il seguente codice:public Tavolo da-cucina = new Tavolo(sup,lung);
}if(areapiano == 0)
System.out.println("Tavolo senza piano");if(lungamba == 0)
System.out.println("Tavolo senza gambe");
La Classe completa ha la forma seguente:
public class Tavolo {public int areapiano = 0; // area del piano
public int lungamba = 0; // lunghezza delle gambe
// Costruttori della Classe Tavolo
public Tavolo() {public Tavolo(int sup, int lung) {this.areapiano = 2;
this.lungamba = 1;}
}this.areapiano = sup;
this.lungamba = lung;
//Metodi della Classe Tavolopublic static void main(String args[]) {if(areapiano == 0)}
System.out.println("Tavolo senza piano");if(lungamba == 0)
System.out.println("Tavolo senza gambe");
}
2.1.2 Java ha, addirittura, una Virtual Machine ...
... attraverso cui può girare su tutte le pi...attaforme
hardware. A parte il gioco di parole, la caratteristica più importante
e peculiare dei programmi Java è la assoluta indipendenza
del codice sorgente dalle caratteristiche hardware e software di
un particolare computer; in altri termini, ciò significa che lo
stesso codice sorgente viene compilato ed eseguito, senza necessità
di alcuna modifica, su ogni computer e sotto qualsiasi sistema operativo
per il quale Java sia stato implementato. Tale caratteristica non è,
ovviamente, frutto del caso ma, naturalmente, è il risultato di
un preciso e deliberato proposito: progettare un linguaggio di programmazione,
tale che i programmi scritti con esso potessero essere distribuiti
attraverso una qualsiasi rete, e girassero senza problemi su ciascuna delle
più diverse piattaforme costituenti i nodi della rete medesima.
L'applicazione attualmente più diffusa di questo progetto è
costituita dagli applet Java che girano sotto browser web in cui
siano implementati la Virtual Machine e la libreria API di
Java; un esempio di un tale browser è rappresentato dalle
più recenti versioni di Netscape. In effetti, la Sun
ha sviluppato il browser HotJava
proprio come piattaforma su cui far girare gli applet. Gli applet sono
programmi di dimensioni contenute, appositamente scritti per arricchire
e rendere interattive le pagine web; le applicazioni,
più complesse e di maggiori dimensioni, sono dei veri e propri programmi,
attraverso i quali si può implementare qualsiasi risorsa
software si desideri: Java è un vero e proprio linguaggio di programmazione!
La caratteristica che rende Java un linguaggio assolutamente multipiattaforma
consiste nella sua peculiare struttura e progettazione e nel modo particolare
in cui il linguaggio è implementato sulle diverse piattaforme hardware.
Java è, tecnicamente, una piattaforma software; cioè:
Java è costituito da un insieme di programmi e funzioni di libreria
scritti secondo le caratteristiche e le peculiarità di ciascuna
piattaforma hardware su cui si vogliono far girare i programmi Java; tali
programmi e funzioni di libreria implementano i due componenti principali
di Java: la libreria API e la Virtual
Machine. Dunque, per portare Java su una particolare piattaforma hardware
(Windows, piuttosto che Linux o DEC) è necessario scrivere la libreria
API e la Virtual Machine per la particolare
piattaforma, in modo che la libreria API fornisca un
insieme di strumenti (propriamente, tali strumenti sono classi,
con i relativi metodi, e interfacce) completo per il controllo e l'uso
di tutte le risorse messe a disposizione dalla particolare piattaforma
hardware; ad esempio, la libreria API dovrà contenere
strumenti per gestire la particolare interfaccia GUI,
il suono, la gestione dei flussi di input e output, etc., oltre ad implementare,
naturalmente, tutte le altre funzioni più generali, come, ad esempio:
le funzioni trigonomeriche, la gestione delle stringhe, e via di seguito.
Attraverso gli strumenti forniti dalla libreria API,
la Virtual Machine controlla ed usa, conformemente
alle istruzioni del programma, le risorse hardware e software della particolare
piattaforma hardware su cui gira il programma medesimo; lo stesso programma,
senza alcuna modifica al codice sorgente, può girare su piattaforme
completamente diverse, proprio grazie al fatto che la Virtual
Machine fa da tramite tra il codice del programma (sempre lo
stesso) e le risorse della piattaforma hardware usando gli strumenti
forniti dalla libreria API. Dunque, lo stesso
codice sorgente gira sia sotto Linux che sotto Windows che sotto ogni qualsiasi
altra piattaforma hardware dotata della sue proprie particolari libreria
API e Virtual Machine.
In pratica, compilando il codice sorgente di un programma Java non
si ottiene immediatamente il file eseguibile sulla particolare piattaforma;
piuttosto, si ottiene una sorta di rappresentazione simbolica intermedia
del programma, detta bytecode. Successivamente, attraverso il comando java,
che invoca l'interprete, il bytecode viene interpretato
dalla Virtual Machine per produrre i risultati
per cui il programma è stato scritto. Dunque, ogni programma Java
viene prima compilato, per ottenere la rappresentazione nella forma del
bytecode; successivamente, ogni volta che lo si richede invocando l'interprete
Java (con il comando java), la Virtual Machine interpreta il
bytecode e, come illustrato sopra, esegue le operazioni codificate nel
programma usando le risorse del computer attraverso i servizi forniti
dalla libreria API.
Ad esempio, per implementare l'interfaccia grafica di un programma
scritto in C++ (o in qualsiasi altro linguaggio che non sia Java) sotto
Linux, occorre conoscere: il ToolKit che implementa
le risorse GUI (Graphical User Interface) sotto
Xwindow (da non confondersi con Microsoft Windows);
l'interfaccia grafica di Linux e le relative funzioni di libreria della
particolare implementazione del C++ sotto Linux. Analogamente dicasi per
l'implementazione dell'interfaccia grafica dello stesso o di un qualsiasi
altro programma che debba girare sotto Microsoft Windows. Ora, poichè
Xwindow e Microsoft Windows sono assolutamente incompatibili, per
portare da Linux a Microsoft Windows un qualsiasi programma dotato di interfaccia
GUI, fatte eventualmente salve incompatibilità di altra natura,
occorre comunque riscrivere completamente l'interfaccia grafica per
adattarla alle caratteristiche delle risorse hardware e software
che implementano la GUI di Microsoft Windows. Per
Java, tale riscrittura non è necessaria: lo stesso codice sorgente
di un qualsiasi programma viene compilato su ogni piattaforma. In sostanza,
i dettagli per la gestione delle risorse GUI
implementate di Java sono uguali, dal punto di vista del programmatore,
per ogni sistema, che sia esso Linux o Xwindows, o qualsiasi altra piattaforma;
tali risorse sono implementate attraverso i metodi e le interacce
dell' Abstract Window Toolkit ( AWT ); l'AWT fa parte
della libreria API.
2.1.2.1 La libreria API
La libreria API (Application Programming Interface)
è un insieme completo di classi ed interfacce che implementano tutte
le funzioni necessarie per scrivere programmi Java senza restrizione alcuna.
Dal punto di vista del programmatore Java, la libreria API
è uguale su tutte le piattaforme su cui Java è implementato;
naturalmente, a livello macchina piattaforma la libreria è implementata
su ciascuna piattaforma conformemente alle caratteristiche della piattaforma
medesima. La descrizione completa e dettagliata della libreria si trova
nella documentazione fornita insieme al JDK.
Come si è detto, la Virtual Machine è la parte dell'implementazione
del linguaggio che fornisce un ambiente dentro cui gira il programma
Java e, attraverso i servizi della libreria API, costituisce una
sorta di interfaccia tra la rappresentazione simbolica, universale e generale
delle risorse software ed hardware di un calcolatore e le concrete, peculiari,
caratteristiche software ed hardware del particolare sistema su cui il
programma gira effettivamente.
Ad esempio, nel pacchetto JDK l'interprete
java e l'applicazione appletviewer (consente di lanciare
un applet senza dover usare un browser Java-compatibile) quando invocati
lanciano la Virtual Machine che interpreta il codice dell'applicazione
o dell'applet che sia.
2.1.3 Scheletro di una tipica applicazione
Java
Per l'apprendimento di un linguaggio di programmazione è molto utile studiare il codice sorgente di programmi completi; il principale ostacolo in tal senso, soprattutto per i principianti della programmazione, è costituito dalla difficoltà di comprendere la funzionalità e l'organicità del particolare modo in cui sono disposte le varie parti di codice in un programma scritto nel determinato linguaggio di programmazione. Viceversa, conoscendo il criterio con cui le parti di codice sono disposte, risulta molto più agevole riuscire a capire il funzionamento di un programma, anche nella circostanza in cui si abbia una conoscenza superficiale della sintassi del paricolare linguaggio. Per tale motivo, in questa sezione si dà la descrizione della struttura di una tipica applicazione Java.
import java.io.*;
/*Fine Sezione Header Files */
/* Dichiarazione della Classe Madre */
class Skel{
// da qui comincia la classe principale
/* Dichiarazione delle Variabili della Classe
*/
/* Fine Sezione Dichiarazione Variabili della Classe */
/* Inizio Sezione Costruttori della Classe */
//corpo del costruttore
}
/*Fine Sezione Costruttori della Classe */
/* ***Inizio Sezione Metodi della Classe*** */
/*Metodo Principale*/
public static void main(String args[]) {
/* Dichiarazione delle Variabili interne del Metodo */
/*Inizion Corpo del Metodo */
System.out.println("\nE' una bella giornata" + k + ","+i);
i += 1 ;
k += 1 ;
}
while( k + i < 100);
}
/* Altri Metodi */
/* ***Fine Sezione Metodi della Classe*** */
/* Fine della Classe Principale*/
} // Qui finisce la Classe Principale e l'applicazione
/* Inizio Dichiarazione Di eventuali Classi Accessorie Usate dalla
classe Principale. */
/* Fine Dell'applicazione o dell'applet */
GPG - Copertina - GIMP |