2010-08-25 11 views
24

Ho notato che Ubuntu 10.04 ha rimosso il pacchetto spidermonkey. Rhino sembra che sia ancora lì comunque. Quali sono le differenze tra rhino e spidermonkey (oltre alla lingua in cui sono scritte). E perché hanno rimosso lo spidermonkey?rhino vs spidermonkey

+1

Rapporto bug relativo a Ubuntu discusso [qui] (https://bugs.launchpad.net/ubuntu/+source/xulrunner-1.9.2/+bug/536950) – richaux

risposta

18

Ho paura che la differenza sia la lingua in cui sono scritti o che cosa significhi. Le persone usano C/C++ per scrivere ogni sorta di cose (come Firefox) mentre Java è più diffuso in Application Server. Da http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29:

Rhino converte script JavaScript in classi Java. Rhino funziona sia in modalità compilata sia in modalità interpretata. È destinato all'utilizzo nelle applicazioni lato server , quindi lo non è un supporto integrato per gli oggetti del browser comunemente associati con JavaScript.

Ci sono tre parti importanti qui. Innanzitutto, non esiste un DOM (anche vero per SpiderMonkey). In secondo luogo, lato server è l'uso previsto. Dovresti essere in grado di usare Rhino nella tua grande applicazione enterprise-y per automatizzare roba su una base più ad-hoc. Infine, Javascript diventa una classe come il resto della gerarchia di classi Java e puoi interagire con le classi Java (vedi il codice di esempio su quella pagina).

In breve, è possibile modificare facilmente i POJO/oggetti basati su JPA/Message Beans/qualunque cosa si voglia chiamare la classe Java "enterprise", tutto da una sessione javascript attraverso Rhino. Confronta questo con Jython, dove puoi usare la sintassi e le classi Python per interagire con Java. Pratico se hai qualche stereotipo JavaScript/Python che calcia in ufficio senza niente da fare.

SpiderMonkey, al contrario, è più simile a LUA. È un linguaggio di scripting. Qual è la differenza? Beh, dubito che tu abbia accesso direttamente a printf, per esempio. Piuttosto che essere in grado di accedere direttamente alle classi Java, non si accede direttamente alle classi C/C++. Piuttosto, usi C/C++ per programmare funzioni extra della lingua.

In breve, Rhino consente a JS di interagire con il codice. SpiderMonkey è più simile a un kit di compilazione fai-da-te con l'ulteriore vantaggio che un linguaggio standard che molte persone conoscono è già stato creato e basta aggiungere le personalizzazioni ad esso.

+1

Grazie - interessante e utile, ma Ubuntu spesso ha più di un pacchetto per affrontare un particolare problema, quindi rimane la domanda: "perché hanno rimosso spidermonkey"? – nealmcb

+1

@nealmcb Onestamente non sono sicuro. Forse chi ha mantenuto il pacchetto per Ubuntu ha smesso di farlo e l'ha lasciato cadere? Credo che il requisito di essere in "main" sia sufficiente manutenzione regolare e tracciamento a monte ecc. È passato un po 'di tempo da quando ho scritto questo, e da quando ho usato Ubuntu, ma quando ho fatto, ricordo che un certo numero di pacchetti era lasciato da "principale" a "universo" a causa di problemi di manutenzione. Sospetto che data l'ascesa di PPA, puoi probabilmente ottenere SpiderMonkey se vuoi. –

-1

In base alle lingue sviluppate, gli sviluppatori devono gestire esplicitamente la memoria utilizzando spidermonkey. Poiché il rhino è stato sviluppato in java, che include la raccolta automatica dei rifiuti e JVM [Java Virtual Machine] è stato ottimizzato per un'esecuzione più rapida di c o C++ dalla versione 1.6 di Java.

+2

-1 per falsa dichiarazione: "lo sviluppatore ha bisogno di gestirlo esplicitamente memoria usando spidermonkey ". JavaScript è un linguaggio garbage-collected, indipendentemente dalla lingua in cui è implementato. La shell Spidermonkey in particolare ha la seguente funzione esposta sull'oggetto globale: gczeal (livello) - "Quanto zelante deve essere il garbage collector". Quindi chiaramente Spidermonkey ha anche la garbage collection. Inoltre, la citazione aveva bisogno di una dichiarazione: "Le JVM sono state ottimizzate per un'esecuzione più rapida di c o C++ dalla versione 1.6 di Java". Non è vero nella maggior parte dei casi, secondo http://bit.ly/fyyrTX – jbeard4

+0

Si aggiornerà una volta ottenuto il collegamento .. grazie per le informazioni –

+0

https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips questo collegamento fornisce chiaramente alcuni consigli per la gestione della memoria! Inoltre, immagino che la domanda riguardasse l'integrazione con l'API. Si prega di rivedere –

6

Dal momento che ho grandi difficoltà a trovare esempi di base circa conchiglie JavaScript/interpreti, in particolare rhino, su Ubuntu - Vi posto questo qui ...

In sostanza, ero un po 'confuso su cosa installare e che tipo di riga di comando chiamare :)

Prima di tutto, ho trovato Bug #705339 in rhino (Ubuntu): “Rhino shell crashes with NullPointerException” e mi sono reso conto che OpenJDK installa effettivamente un archivio Java rhino.jar. Quindi, se si dispone di che, si può immediatamente fare nella shell del terminale bash:

$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar 
Rhino 1.7 release 2 2010 11 17 
js> print("answer " + 42.0); 
answer 42 
js> quit() 

 

E questo è tutto abbastanza buono per cose di base ...Tuttavia, se si desidera utilizzare DOM window oggetto, o setTimeout() la funzione - in sostanza, questi sono "implementazioni specifiche del browser" (per setTimeout, puoi anche SO:7286178), e un motore di scripting senza un browser non "sapere" su di loro .

 

Tuttavia, almeno per rhino, che è sanata dal 'ambiente del browser' Envjs biblioteca, la cui Latest release - 1.2 per rhino è env.rhino.js (vedere SO:6170676 per setTimeout in rhino).

modo che possiamo fare qualcosa di simile:

wget http://www.envjs.com/dist/env.rhino.1.2.js 
$ java -jar /usr/lib/jvm/java-6-openjdk/jre/lib/rhino.jar 
Rhino 1.7 release 2 2010 11 17 
js> load('env.rhino.1.2.js'); 
js: "env.rhino.1.2.js", line 1247: uncaught JavaScript runtime exception: TypeError: Cannot call property getCurrentContext in object [JavaPackage org.mozilla.javascript.Context]. It is not a function, it is "object". 
    at env.rhino.1.2.js:1247 
    at <stdin>:2 

js> ^C 

... ooops e - non funziona :) Tuttavia, ciò viene chiarito Can't run 1.2 due to getCurrentContext error. - Env.js | Google Groups:

Siamo spiacenti, Envjs può corro con il rinoceronte in bundle con java. avrete bisogno di utilizzare 1.7rc2 disponibili da qui:

http://www.mozilla.org/rhino/download.html

Fortunatamente, invece di costruire dai sorgenti, in Ubuntu possiamo direttamente fare:

sudo apt-get install rhino 

... dal come afferma lo rhino filelist, questo pacchetto installa js-1.7R2.jar. Il pacchetto installa anche uno script rhino, che è essenzialmente una shell wrapper per questi archivi Java (vedi less $(which rhino)) - in modo che possiamo comodamente utilizzare che, invece di digitare java -jar ... ecc:

$ rhino 
Rhino 1.7 release 2 2010 11 17 
js> load('env.rhino.1.2.js'); // takes a while to load 
[ Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ] 
js> print("loaded " + 1.2); 
loaded 1.2 
js> window; 
[Window] 
js> ^C 

 

Tuttavia, ora provate tra cui queste stesse linee come uno script, chiamiamolo test.js:

load('env.rhino.1.2.js'); // takes a while to load 
print("loaded " + 1.2); 
print(window); 

e provare a chiamare rhino su di esso:

$ rhino test.js 
loaded 1.2 
js: uncaught JavaScript runtime exception: ReferenceError: "window" is not defined. 

 

Oh cara - non riesce ancora una volta, e adesso? :) Beh, per fortuna, anche questo è un po 'accennato nel Envjs Guide (Nota: consentire JavaScript per quella pagina, altrimenti il ​​codice sarà poco visibile) - in particolare:

# Esecuzione env.rhino. js da uno script o dalla riga di comando
# Nota l'impostazione di ottimizzazione
java -jar lib/js.jar -opt -1 myscript.js

destra - così finalmente, abbiamo semplicemente aggiungere questa impostazione di ottimizzazione, e:

$ rhino -opt -1 test.js 
[ Envjs/1.6 (Rhino; U; Linux i386 2.6.38-11-generic; en-US; rv:1.7.0.rc2) Resig/20070309 PilotFish/1.2.13 ] 
loaded 1.2 
[Window] 

... finalmente funziona :) EDIT: con env.rhino.1.2.js, è anche possibile utilizzare console.log() di scrivere su stdout . MODIFICA: per eseguire il debugger Java rhino, vedere less $(which rhino) dove sono installati i particolari .jars e quindi chiamare direttamente java (lo script rhino utilizza un diverso set di opzioni della riga di comando, quindi non può essere persuaso a chiamare il debugger) :

java -cp /usr/share/java/js.jar org.mozilla.javascript.tools.debugger.Main test.js 

 

Se si tenta di eseguire lo stesso script ora con spidermonkey (vedi anche le istruzioni PPA in Best way to get spidermonkey js on Ubuntu 11.04?), si otterrà:

$ js test.js 
env.rhino.1.2.js:1247: ReferenceError: Packages is not defined 

... ovvero spidermonkeynon funziona con env.rhino.1.2.js.

 

Beh, spero che questo aiuta qualcuno,
Cheers!

+0

hai reso la mia giornata, grazie! – Rafa