ELEMENTI DEL LINGUAGGIO HTML

Il linguaggio Java

Java è un linguaggio di programmazione introdotto dalla Sun Microsystems, la cui caratteristica fondamentale è di produrre programmi del tutto indipendenti dall'hardware su cui girano, che pertanto può essere un normale PC, un Mac, un sistema UNIX o Solaris, ecc..

Fin qui, Java è stato utilizzato per costruire programmi (applets) in alternativa ai programmi (scripts) CGI. La principale differenza fra le due metodologie di sviluppo sta nella modalità di esecuzione dei programmi.
Gli script CGI vengono eseguiti sul server a cui ci si collega con conseguente sovraccarico dello stesso in caso di numerosi connessioni contemporanee: ciò può penalizzare il lavoro delle persone collegate (in locale od in remoto) allo stesso server.
Le applicazioni scritte in Java vengono invece richiamate sul computer client e qui eseguite.

Chiaramente chi si connette deve possedere un interprete Java che permetta l'esecuzione delle applets. Per rendere possibile quanto detto, Java incorpora delle caratteristiche che ne fanno il principale candidato quale più diffuso linguaggio di Internet per il prossimo futuro.
La principale di queste caratteristiche è la sua portabilità, scopo che viene raggiunto rendendo l'esecuzione delle applets indipendente dall'architettura che le esegue. Ciò è possibile grazie la fatto che Java è fondamentalmente un linguaggio interpretato: le applets non vengono compilate in codice macchina (che le renderebbe dipendenti dall'hardware) ma ciascuna istruzione è sostanzialmente una chiamata ad una opportuna routine implementata nell'interprete.
Inoltre possiamo vedere che Java non permette, su di una particolare macchina, l'implementazione dei tipi fondamentali (come gli interi) diversamente da quanto specificato dal linguaggio.
In realtà per ragioni di efficenza, prima di essere eseguite, le applets vengono compilate in un codice intermedio, detto "bytecode". Il codice intermedio prodotto dal "compilatore" Java non è altro che il codice macchina di una Java Virtual Machine (JVM) che è una specifica per un ipotetico processore che esegue il codice Java.

L'interpretazione consente una pressochè totale indipendenza dall'hardware, ma allo stato puro i programmi interpretati sono poco efficienti. D'altronde, la compilazione, pur producendo programmi molto più efficienti, rende il prodotto finale hardware-dipendente e la ricompilazione del sorgente non è sempre sufficiente per superare il problema.
Ad esempio, un linguaggio compilato come il C++, che fa largo uso dei puntatori, ha nei puntatori stessi il principale limite alla portabilità in quanto questi sono utilizzati direttamente per localizzare le celle di memoria senza alcuno strato intermedio al di sopra della nuda macchina. Java invece "elimina" i puntatori fornendo un diverso meccanismo di gestione della memoria. Dato che l'obiettivo di un programma scritto in Java e' di essere caricato ed eseguito automaticamente, sarebbe inaccettabile che ci fosse la possibilità che un'applicazione possa avere un bug che blocchi il sistema: per esempio scrivendo sopra lo spazio di memoria riservato al sistema operativo. Per evitare, ad esempio, un accesso a locazioni di memoria riservate, il compilatore Java controlla che un programma non vada ad indirizzare zone di memoria fuori da quelle che gli sono state messe a disposizione (array bound). La gestione della memoria avviene tramite un garbage collector automatico che tiene traccia di tutti gli oggetti e dei riferimenti ad essi di un programma Java. Quando un oggetto non ha più riferimenti, viene rimosso dal garbage collector.

Essendo nato come linguaggio per sistemi distribuiti, Java necessita di un alto livello di sicurezza. Questa viene garantita attraverso parecchie protezioni e verifiche che l'ambiente esegue a tempo di esecuzione. A tempo di compilazione, subito prima dell'esecuzione del codice, il compilatore controlla che il programma esegua le sue operazioni secondo le regole previste dal linguaggio, onde evitare operazioni che possano compromettere l'integrità del sistema. Il codice prodotto viene comunque ricontrollato prima di essere eseguito poichè questo potrebbe essere stato, intenzionalmente o meno, cambiato tra la fase di compilazione e quella di esecuzione. Successivamente l'interprete Java determina la disposizione in memoria delle classi. Inoltre il caricatore di classi mette ogni classe caricata dal Network nella sua propria area di memoria. Ancora, il compilatore verifica che le classi caricate non accedano al file system, eccetto che nei modi specifici loro consentiti dal client o dall'utente.
Tutto ciò dovrebbe costringere gli sviluppatori a scrivere del codice "buono", ovvero privo di funzioni pericolose o particolarmente "maliziose".

Generalmente il costo della portabilità, sicurezza e robustezza di un linguaggio, si paga a tempo di esecuzione: la soluzione mista di Java, almeno in parte, rimedia a ciò implementando l'anzidetta JVM. La JVM produce codice molto simile al codice macchina di un processore reale (tanto che qualcuno sta già lavorando alla produzione di processori JVM per un'esecuzione hardware del bytecode). Java cerca di ottimizzare a tempo di esecuzione operazioni come il garbage collecting semplicemente eseguendole durante le attese. E' infatti raro che un programma impegni constantemente la CPU: più facilmente questo sarà soggetto ai tempi di attesa dell'input, come l'inserimento di dati da tastiera da parte dell'utente o la lettura degli stessi da memorie di massa.

Per finire, Java è semplice e immediato: pur avendo preso molto dal C++, ha eliminato tutte quelle features a basso livello che avrebbero creato impedimenti e ne avrebbero minato la sicurezza. In questo modo si è ottenuto un linguaggio senz'altro meno potente (poichè a più alto livello rispetto il C++), ma più pulito, facile e sicuro.
Java vanta già un potente insieme di librerie di classi che forniscono molte delle funzionalità che servono per sviluppare un'applicazione velocemente ed efficacemente.
Nescape Navigator include un JVM fin dalla versione 2.0.

Il linguaggio JavaScript

JavaScript è un linguaggio di programmazione orientato agli oggetti come Java, ma in realtà, mancando le raffinate strutture di questo, deve essere piuttosto considerato come una particolare estensione del linguaggio HTML.
Javascript consente di scrivere script i quali vengfono integrati nella pagina HTML, al pari di qualsiasi TAG HTML, portando sul client tutta una serie di attività, come i controlli sui form ecc, che prima richiedevano l'invio dei dati sul server, l'esecuzione di script CGI, la risposta ecc. In ultima analisi, nelle nuove versioni di Netscape, JS potrà interagire con eventuali applet Java.
Javascript è molto più limitato di Java, non può ad esempio comunicare su di un socket, non ha la gestione di finestre, dell I/O ecc. Con JS non è possibile creare applicazioni stand alone al contrario di Java.

Le sfere di azione di Javascript sono:

il BROWSER, con le sue componenti (finestre, frame), loro attributi (toolbar, statusbar ecc), le loro locazioni (cioè l'URL che contengono)
il DOCUMENTO (cioè l'HTML): JS può creare un nuovo documento in un frame e andarci a srivere le linee HTML dentro, con infinite possibilità condizionali ecc.
i LINK e gli EVENT HANDLERS: è possibile abbinare istruzioni JS a dei link
es: &ltA HREF="javascript:unaFunzione()"&gtUna Funzione&ltA> o a degli eventi particolari
i FORM: JS può effettuare controlli sui campi immessi nei form, o gestirli attraverso event handlers come OnFocus (quando il cursore entra in un campo di input), OnClick, onSubmit ecc
la SESSIONE: JS ha a disposizione l'history della sessione corrente, con la quale è possibile andare avanti e indietro tra le pagine visitate.

Le tipiche applicazioni di JavaScript sono:

gestione di frame e finestre: aprire un certo documento in un frame o una finestra in base ai dati immassi in un altro. Apertura di nuove finestre.
controllo della congruità dei dati immessi in un form
imagemap sul client
apertura di 'finestre di aiuto'
orologi vari
giochini vari, matematici e basati su testo
quelle amenissime scritte scorrevoli sulla barra di stato (BASTAA!!)
pagine personalizzate per i visitatori abituali, che hanno firmato un guestbook e tornano a rivedere il sito (con i Cookies)
contabilizzazione del totale degli acquisti online nei famosi CyberMall (shopping centers cybernetici?)
ecc. ecc.

Cosa non si può fare con Javascript?

Non è possibile creare animazioni nel senso vero della parola. Javascript agisce solo su una finestra od un frame intero, non su aree di questo. L'alternativa è creare un piccolo frame e ricaricarlo N volte quanti sono i fotogrammi dell'animazione, ma i risultati sono però deludenti, lo sfarfallio fastidioso. Oppure utilizzare GIF animati.
Qualcosa di simile alle animazioni è possibile creare utilizzando i caratteri del browser, facendo scorrere per esempio delle scritte colorate ingrandite in un frame.
Con Javascript non è possibile aprire, salvare, in genere operare sui file, sia in locale che sul server, per ovvie ragioni di sicurezza.
Un'altra cosa che non sarà più possibile fare, a partire dai prossimi release di Netscape, è accedere alla locazione dei documenti puntati dall'history del browser, cioè sapere quali siti sono stati precedentemente visitati. Questo per ovvi motivi di privacy. Nè è possibile far inviare allo script messaggi di e-mail senza che l'utente ne dia conferma.

Su quali versioni di bowser gira Javascript?

Per rimanere ai browser più diffusi, Javascript gira su tutte le versioni di Netscape 2.0 che supportano i frame, comprese quelle per Windows 3.1 che non supportano invece Java. E gira anche su Internet Explorer a partire dalla versione 3.0.

È possibile avere un contatore di accessi scritto in Javascript?

Si, è possibile, ma conterà solo gli accessi dei browser che possono far girare Javascript stesso. Ed ha comunque bisogno di un programma CGI sul server per scrivere il file del contatore.

Esempi

Vediamo infine qualche piccolo script in modo da comprendere come vengano inseriti all'interno dei documenti HTML e constatare le possibilità che Javascript offre.

Cominciamo dalle funzioni, che non sono difficili da capire e sono molto utili.
E' conveniente dichiarare le funzioni tra i tag <head> della pagina HTML. Le funzioni vengono invocate dagli eventi attivati dall'utente, quindi è ragionevole tenere le loro dichiarazioni tra i tag <head>, in modo tale che vengano caricate prima che un utente possa fare qualcosa che le invochi.
Gli script possono essere posti all'interno di un commento per fare in modo che i browser più vecchi, che non supportano Javascript, non li considerino.

<html>
<head>
  <script language="JavaScript">
     function pushbutton() {
       alert("Ciao!");
  }
 </script>
</head>
<body>
<form>
  <input type="button" name="Button1" value="Clicca qui" onclick="pushbutton()">
  </form>
</body>
</html>


Per provare subito questo script, usando un browser che supporta Javascript, cliccare sul pulsante.

Questo script crea un pulsante che risponde al clic con una finestra con la scritta 'Ciao!'. Ma che cosa succede con la presenza di questo script? Come prima cosa la funzione viene caricata e tenuta in memoria, quindi viene creato un pulsante con i classici tag <form> (HTML). A questo punto si deve notare qualcosa di nuovo tra i parametri del tag <input>: la presenza del parametro onclick. Questo parametro dice al browser quale funzione invocare quando si clicca sul pulsante (naturalmente soltanto se il browser supporta Javascript). Nell'intestazione viene dichiarata la funzione pushbutton() che viene eseguita quando si clicca sul pulsante.
C'è anche un'altra novità nello script: il metodo alert. Questo metodo è già dichiarato in Javascript, si deve quindi soltanto invocarlo. (il metodo alert nonè stato certo pensato per l'uso che ne abbiamo fatto qui, che è puramente didattico). Ci sono diversi altri metodi a disposizione.

Vediamo ora come poter leggere ciò che un utente ha inserito in una form.

<html>
<head>
<script language="JavaScript">
<!--  nascondiamo lo script ai vecchi browser
  function getname(str) {
    alert("Ciao, "+ str+"!");
  }
// fine del commento -->
</script>
</head>
<body>
Inserisci il tuo nome:
<form>
  <input type="text" name="name" onBlur="getname(this.value)" value="">
</form>
</body>
</html>


Ora si provare questo script:

Inserisci il tuo nome:

In questo script sono stati utilizzati altri nuovi elementi.
Per prima cosa si noti l'inserimento dello script all'interno del commento, per nascondere lo script ai vecchi browser che non possono eseguirli. E' necessario seguire l'ordine mostrato: l'inizio del commento deve trovarsi subito dopo il primo tag <script> e il commento deve terminare subito prima del tag </script>.
In questo documento HTML vi è una form in cui l'utente può inserire il proprio nome. Il parametro onBlur del tag <input> indica al browser quale funzione invocare quando qualcosa viene immesso nella form. La funzione getname(str) verrà invocata quando questo elemento della form perde il focus o quando viene premuto il tasto 'Invio' dopo aver inserito qualcosa. La funzione acquisisce la stringa immessa tramite il comando getname(this.value). 'This.value' indica il valore che è stato immesso in questo elemento della form.

Il prossimo esempio mostra l'implementazione di una funzione che gestisce la data di un documento, così che sarà il browser a visualizzare la data di ultima modifica della pagina HTML, senza costringere il creatore della pagina a scrivere la data nel documento.

<html>
<body>
Questa e' una semplice pagina HTML.
<br>
Ultima modifica:
  <script language="JavaScript">
  <!--  nasconde lo script ai vecchi browser
    document.write(document.lastModified)
  // fine del commento -->
  </script>
</body>
</html>

Ecc....

Eccetera, questo non è un manuale del linguaggio Javascript....