2010-08-25 19 views
24

Noté que ubuntu 10.04 eliminó el paquete spidermonkey. Sin embargo, Rhino parece que todavía está allí. ¿Cuáles son las diferencias entre rhino y spidermonkey (además del idioma en el que están escritos)? ¿Y por qué eliminaron a spidermonkey?rhino vs spidermonkey

+1

Informe de errores de Ubuntu relacionado discutido [aquí] (https://bugs.launchpad.net/ubuntu/+source/xulrunner-1.9.2/+bug/536950) – richaux

Respuesta

18

Me temo que la diferencia es el idioma que están escritos en, o lo que significa. La gente usa C/C++ para escribir todo tipo de cosas (como Firefox), mientras que Java es más frecuente en los servidores de aplicaciones. De http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29:

Rhino convierte secuencias de comandos JavaScript en clases Java. Rhino funciona tanto en el modo compilado como en el modo interpretado. Está destinado a ser utilizado en las aplicaciones del lado del servidor , por lo tanto, no es compatible con los objetos del navegador comúnmente asociados con JavaScript.

Hay tres partes importantes aquí. En primer lugar, no hay DOM (también es cierto para SpiderMonkey). En segundo lugar, el lado del servidor es el uso previsto. Se supone que debes poder usar Rhino en tu gran aplicación empresarial para automatizar cosas de forma más ad-hoc. Finalmente, el Javascript se convierte en una clase como el resto de la jerarquía de clases de Java y puede interactuar con las clases de Java (vea el ejemplo del código en esa página).

En resumen, podría manipular fácilmente sus POJO/objetos basados ​​en JPA/Message Beans/lo que quiera llamar a su clase Java "empresarial", todo desde una secuencia de JavaScript ejecutada a través de Rhino. Compare esto con Jython, donde puede usar la sintaxis y las clases de Python para interactuar con Java. Es muy útil si tiene algunos zumbidos de JavaScript/Python dando vueltas por la oficina sin nada que hacer.

SpiderMonkey por el contrario es más como LUA. Es un lenguaje de scripting. ¿Cual es la diferencia? Bueno, dudo que tengas acceso a printf directamente, por ejemplo. En lugar de poder acceder directamente a las clases de Java, no puede acceder directamente a las clases de C/C++. En su lugar, utiliza C/C++ para programar características adicionales del idioma.

En resumen, Rhino permite a JS interactuar con su código. SpiderMonkey es más como un kit de compilación de "hágalo usted mismo" con la ventaja añadida de que un lenguaje estándar que mucha gente sabe que ya se ha creado y solo necesita agregarle sus personalizaciones.

+1

Gracias - interesante y útil. Pero Ubuntu a menudo tiene más de un paquete para resolver un problema en particular. Entonces la pregunta sigue siendo: "¿por qué eliminaron a spidermonkey"? – nealmcb

+1

@nealmcb Honestamente, no estoy seguro. ¿Tal vez quien mantuvo el paquete para Ubuntu dejó de hacerlo y lo abandonaron? Creo que el requisito de estar en "main" es suficiente mantenimiento regular y tracking upstream, etc. Ha pasado un tiempo desde que escribí esto, y desde que usé Ubuntu, pero cuando lo hice, recuerdo una serie de paquetes que caído de "principal" a "universo" debido a problemas de mantenimiento. Sospecho que dado el aumento de PPA, probablemente pueda obtener SpiderMonkey si lo desea. –

-1

Sobre la base de los idiomas que han sido desarrollados, desarrollador necesita manejar de forma explícita el uso de la memoria spidermonkey. Como el rinoceronte se ha desarrollado en Java, que incluye la recolección automática de basura y la máquina virtual de JVM se han ajustado para una ejecución más rápida que c o C++ desde la versión de Java 1.6.

+2

-1 para la declaración falsa: "desarrollador necesita manejar explícitamente memoria usando spidermonkey ". JavaScript es un lenguaje recogido de basura, independientemente del idioma en el que se implemente. El shell de Spidermonkey en particular tiene la siguiente función expuesta en el objeto global: gczeal (nivel) - "Cuán celoso debe ser el recolector de basura". Entonces claramente Spidermonkey también tiene recolección de basura. Además, cita requerida en la declaración: "Las JVM se han ajustado para una ejecución más rápida que c o C++ desde la versión de Java 1.6". No es cierto en la mayoría de los casos, de acuerdo con http://bit.ly/fyyrTX – jbeard4

+0

Se actualizará una vez que obtenga el enlace .. gracias por la información –

+0

https://developer.mozilla.org/en/SpiderMonkey_Garbage_Collection_Tips este enlace claramente da algunos consejos para manejar la memoria Además, supongo que la pregunta era acerca de la integración con API. Por favor revise –

6

Ya que tengo grandes dificultades para encontrar ejemplos básicos sobre cáscaras de JavaScript/intérpretes, especialmente rhino, en Ubuntu - Voy a poner esto aquí ...

Básicamente, yo estaba un poco confundido sobre lo que debe instalar, y qué tipo de línea de comando llamar :)

Antes que nada, encontré Bug #705339 in rhino (Ubuntu): “Rhino shell crashes with NullPointerException” - y me di cuenta de que OpenJDK realmente instala un archivo Java rhino.jar. Así que si usted tiene que, se puede hacer de inmediato en la cáscara del terminal 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() 

 

y esto es todo lo suficientemente bueno para cosas básicas ...Sin embargo, si desea utilizar el objeto DOM window, o la función setTimeout(), básicamente, esas son "implementaciones específicas del navegador" (para setTimeout, consulte también SO:7286178), y un motor de scripts sin navegador no las "conocería" .

 

Sin embargo, al menos por rhino, que se subsana por la biblioteca Envjs 'navegador medio ambiente', cuyo Latest release - 1.2 para rhino es env.rhino.js (ver SO:6170676 para setTimeout en rhino).

por lo que podemos hacer algo como esto:

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 

... y ooops - no funciona :) Sin embargo, esto se aclara en Can't run 1.2 due to getCurrentContext error. - Env.js | Google Groups:

Lo sentimos, Envjs puede No corras con el rinoceronte empaquetado con java. tendrá que utilizar 1.7rc2 disponibles desde aquí:

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

Afortunadamente, en lugar de construir desde la fuente, en Ubuntu podemos hacer directamente:

sudo apt-get install rhino 

... ya como dice rhino filelist, este paquete instala js-1.7R2.jar. El paquete también instala un script rhino, que en esencia es una envoltura del shell para estos archivos Java (ver less $(which rhino)) - para que podamos usar convenientemente que, en lugar de escribir java -jar ... etc:

$ 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 

 

Sin embargo, ahora intente incluir estas mismas líneas que una secuencia de comandos, vamos a llamarlo test.js:

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

e intentar llamar rhino en él:

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

 

Oh - la falla de nuevo, y ahora qué? :) Bueno, por suerte, incluso esto se hace alusión alguna a en Envjs Guide (nota: no permitir Javascript para esa página, de lo contrario el código será apenas visible) - en particular:

# Ejecución de env.rhino. js desde un script o la línea de comando
# Tenga en cuenta la configuración de optimización
java -jar lib/js.jar -opt -1 myscript.js

derecha - por lo que finalmente, sólo tenemos que añadir esta configuración de optimización, y:

$ 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 funciona :) EDIT: con env.rhino.1.2.js, también se puede utilizar console.log() escribir en la salida estándar . EDIT: Para ejecutar el depurador rhino Java, consulte usando less $(which rhino) dónde están los .jars particulares instalados, y luego llamar java directamente (el guión rhino utiliza un conjunto diferente de parámetros de línea de comandos, por lo que no puede ser persuadido para llamar al depurador) :

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

 

Si intenta ejecutar el mismo guión ahora con spidermonkey (ver también las instrucciones de PPA en Best way to get spidermonkey js on Ubuntu 11.04?), obtendrá:

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

... es decir, spidermonkeyno funcionan con env.rhino.1.2.js.

 

Bueno, espero que esto ayude a alguien,
Salud!

+0

has hecho mi día, gracias! – Rafa