# Rhino (interprete JavaScript)

Rhino è un interprete JavaScript libero e open source, scritto completamente in Java e creato da Norris Boyd. È gestito interamente da Mozilla, che lavorò anche su SpiderMonkey, altro interprete scritto in C++ ed utilizzato in Mozilla Firefox.
Rhino deve il suo nome alla figura di un rinoceronte (in inglese rhino) presente sulla copertina del manuale JavaScript edito da O'Reilly Media.

## Storia

Il progetto Rhino fu lanciato da Netscape nel 1997. All'epoca Netscape stava pianificando lo sviluppo di una versione di Netscape Navigator scritta completamente in Java, denominata Javagator, pertanto necessitava di un'implementazione di JavaScript scritta in Java. In seguito Netscape interruppe il lavoro su Javagator e il progetto Rhino venne ceduto a Mozilla nell'aprile 1998, riconvertendolo in un'interprete JavaScript. Da allora alcune grandi aziende (tra cui Sun Microsystems) concessero in licenza Rhino per l'uso nei loro prodotti e pagarono Netscape per farlo, consentendo la prosecuzione dei lavori sul progetto.
Originariamente Rhino compilava tutto il codice JavaScript in bytecode Java nei file di classe Java generati. Ciò produsse le migliori prestazioni, spesso battendo l'implementazione C++ di JavaScript eseguita con la compilazione just-in-time, ma soffriva di due punti deboli. Innanzitutto il tempo di compilazione era lungo, poiché la generazione del bytecode e il caricamento delle classi generate era un processo ad alta intensità di risorse. Inoltre l'implementazione soffriva di memory leak, poiché la maggior parte delle Java virtual machine non effettuavano la garbage collection sulle classi inutilizzate o le stringhe ricopiate come risultato del caricamento di un file di classe. Di conseguenza, nell'autunno del 1998 Rhino aggiunse una modalità interpretativa e il codice di generazione del file di classe venne spostato in un pacchetto facoltativo caricato dinamicamente.
Originariamente la generazione dei file di classe non era inclusa in Rhino, ma successivamente i suoi licenziatari la integrarono pubblicando interamente Rhino come open source; da allora Rhino è stato impiegato in vari ambiti e un numero crescente di persone ha contribuito allo sviluppo del codice. A partire dalla versione 1.7R11 (maggio 2019), Rhino supporta Java 8 e versioni successive ed è compatibile con numerose funzionalità ECMAScript ES6/ES2015.

## Usi

Rhino viene impiegato per implementare JavaScript in Java, convertendo il sorgente in bytecode Java. È concepito per essere utilizzato in applicazioni desktop o lato server, quindi non esiste un supporto integrato per gli oggetti browser comunemente associati a JavaScript.
Rhino possiede due modalità di esecuzione:
* Modalità compilata: compilazione del codice sorgente JavaScript in classi di Java. Questa caratteristica era presente dall'inizio del progetto; attualmente viene mantenuta come funzione opzionale.
* Modalità interpretata: interpretazione diretta di JavaScript. Questa modalità fu aggiunta nel 1998 per via dei problemi di efficienza riscontrati nella modalità compilata.
Rhino può essere utilizzato come debugger utilizzando la shell di Rhino. La shell JavaScript fornisce un modo semplice per eseguire script in modalità batch o all'interno di un ambiente interattivo per la programmazione esplorativa e può essere utilizzata nelle applicazioni incorporando Rhino.
Una versione leggermente modificata di Rhino 1.6r2 è stata fornita in bundle con la versione Sun Microsystems di Java SE versione 6, pubblicata nel dicembre 2006. Ciò ha semplificato l'integrazione di JavaScript come parte dei programmi Java e l'accesso alle risorse Java da JavaScript.