[precedente] GPG - Copertina - GIMP [successivo]

Articoli


Java sotto Linux

  1. Presentazione

  2.  
    Il presente articolo  è il primo di una serie di contributi dedicati al linguaggio di programmazione; tali articoli saranno pubblicati sul Pluto Journal. L'intenzione di questo progetto è, innanzitutto, diffondere la conoscenza e l'uso di Java sulla piattaforma Linux; dunque, la prospettiva  degli articoli sarà molto generale, almeno per quanto riguarda questa prima serie. Negli articoli che via via  si succederanno si punterà l'attenzione, in modo particolare, sugli aspetti più generali del linguaggio e saranno dati i riferimenti attraverso i quali trovare informazioni, documentazione e software relativi a Java e disponibili gratuitamente su Internet. In tal modo, dopo una prima, generale panoramica fornita dagli articoli,  chiunque lo desiderasse potrà approfondire autonomamente quegli aspetti del linguaggio che, per qualsiasi motivo,  più lo interessano e lo appassionano. Almeno per il momento, dunque,  nessuno degli articoli affronterà gli aspetti più particolarmente attinenti alla programmazione propriamente detta. Inoltre, nella stesura degli articoli medesimi si darà per scontata una qualche familiarità con i linguaggi C/C++ e con gli elementi della programmazione Object Oriented; tale familiarità, pur non essendo pregiudiziale per la comprensione degli scritti consentirà, comunque, di seguire l'esposizione con più agio. 
     
     
     
  3. Caratteristiche di Java
  4. 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++)  
      System.out.println("Java stampa sullo stream out"); 
     
    in un file sorgente C/C++ apparirebbe come: 
     
    for(pluto=1 ; pluto<10 ; pluto++)  
      printf("C++ stampa sullo stream out"); 
     
    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. 
    Occorre prestare attenzione a non confondere Java  e Javascipt; la presenza del termine Java ammicca, falsamente, ad una parentela che effettivamente non esiste: Java e Javascript sono due linguaggi distinti ed indipendenti

     

    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: 
     

    Queste due caratteristiche sono sufficienti per descrivere un tavolo nella sua forma più generale. In Java, la creazione di un modello generale per il concetto di tavolo così schematizzato si attua usando la struttura di Classe; sintatticamente, e nella forma più semplice, una classe che definisce un tale generico tavolo potrebbe avere la forma seguente: 
     
     
    public class Tavolo {  
    public int areapiano = 0; // area del piano 
    public int lungamba = 0; // lunghezza delle gambe 
     
    // Costruttore della Classe 
    public Tavolo() { 
    this.areapiano = 2; 
    this.lungamba =  1; 
    }
    } 
     
     
    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 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
    public Tavolo() { 
    this.areapiano = 2;  
    this.lungamba =  1;  

    }

    public Tavolo(int sup, int lung) { 
    this.areapiano = sup;  
    this.lungamba = lung;
                    } 
    } 

     

    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. 
    Ad esempio, per creare l' Oggetto (il tavolo) da-cucina, di tipo Tavolo,  con area della superficie di appoggio di sup volte l'unità di superficie e lunghezza delle gambe di lung volte l'unità di lunghezza, occorre il seguente codice: 
     
     
    public Tavolo da-cucina = new Tavolo(sup,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(); 
         

         

    Il compilatore individua il particolare  costruttore da invocare dal numero e dal tipo dei paramentri usati nella chiamata alla Classe, chiamamta con cui  si istanzia il particolare Oggetto. Il codice new Tavolo(sup, lung) crea, istanziando la Classe Tavolo, un Oggetto di tipo Tavolo, assegnandogli l'area della superficie del piano di appoggio e la lunghezza delle gambe attraverso il costruttore public Tavolo(int sup, int lung); il codice public Tavolo dichiara da-cucina come Oggetto di tipo Tavolo; infine, l'operatore = assegna all'Oggetto (al tavolo) da-cucina l'area di superficie e la lunghezza delle gambe, in questo caso sup e lung rispettivamente. 
    Dunque, la classe Tavolo è un modello attraverso il quale (istanziadolo opportunamente) si  costruiscono gli Oggetti (i tavoli, per rimanere nella metafora) di tipo Tavolo; una Classe può essere considerata come un progetto secondo cui vengono costruiti gli Oggetti particolari, analogamente a  quanto accade nella realtà, in cui vari esemplari di un determinato prodotto vengono costruiti a partire da un unico disegno tecnico. 
    Oltre agli elementi già descritti, una Classe contiene anche le procedure per manipolare ed elaborare le informazioni contenute nelle sue variabili e nelle sue strutture dati interne; tali procedure vengono chiamate metodi nel gergo della Programmazione Object Oriented. Le applicazioni e gli applet Java elaborano le informazioni attraverso i metodi forniti dagli oggetti che li costituiscono; in particolare, una applicazione o un applet Java possono  essere costituiti da uno unico oggetto che contiene in se i dati e tutte le procedure (metodi) per elaborare e manipolare tali dati. Ad esempio, si potrebbe dotare la Classe Tavolo e, quindi, ogni Oggetto da essa istanziato, con un metodo per controllare che le misure fornite per definire l'oggetto non siano assurde: 
     
     
     
      public static void main(String args[]) { 
    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() { 
    this.areapiano = 2;  
    this.lungamba =  1;  

    }

    public Tavolo(int sup, int lung) { 
    this.areapiano = sup;  
    this.lungamba = lung;
                    } 
     
    //Metodi della Classe Tavolo
    public static void main(String args[]) { 
     if(areapiano == 0) 
    System.out.println("Tavolo senza piano"); 

    if(lungamba == 0) 
     System.out.println("Tavolo senza gambe");

                    } 
    } 
     
     
    Si osservi che un programma Java non è, esso stesso,  altro se non una Classe che contiene il metodo main: l'esecuzione del programma comincia dal metodo main e termina quando l'esecuzione raggiunge la fine del metodo, ovvero quando finisce ogni sottoprocesso (thread) lanciato dal metodo main. Dunque, la Classe principale (programma) deve necessariamente contenere il metodo main. 
    Si osservi, inoltre, che per usare i metodi e le strutture di una Classe occorre innanzitutto istanziare la Classe creando un Oggetto. In pratica, si usano i metodi e le strutture dell'Oggetto istanziato, non quelle della Classe; la Classe è solo un modello conformemente al quale gli Oggetti vengono costruiti per poterne usare i metodi e le strutture dati. 
     
     

    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
     

     
    2.1.2.2 La Virtual Machine 

    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. 

     
     
     
  5. Java sotto Linux
 
   

di Francesco Barbuto


[precedente] GPG - Copertina - GIMP [successivo]