javascript rhino ubuntu-10.04 spidermonkey

javascript - rhino vs spidermonkey



ubuntu-10.04 (3)

Me temo que la diferencia es el idioma en el que están escritas, 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 los scripts de JavaScript en clases de Java. Rhino funciona tanto en modo compilado como interpretado. Está diseñado para ser utilizado en aplicaciones del lado del servidor, por lo tanto, no hay soporte integrado para los objetos del navegador que se asocian comúnmente con JavaScript.

Hay tres partes importantes aquí. En primer lugar, no hay DOM (también es válido 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 manera más ad hoc. Finalmente, el Javascript se convierte en una clase al igual que el resto de la jerarquía de clases de Java y puede interactuar con las clases de Java (consulte el ejemplo de código en esa página).

En resumen, podría manipular fácilmente sus POJOs / objetos basados ​​en JPA / Message Beans / como quiera llamar a su clase Java "empresarial", todo desde un javascript ejecutado a través de Rhino. Compare esto con Jython, donde puede usar la sintaxis y las clases de Python para interactuar con Java. Es útil si tiene algunos whizzes 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 funciones adicionales del lenguaje.

En resumen, Rhino le permite a JS interactuar con su código. SpiderMonkey es más como un kit de compilación "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 que solo necesita agregarle sus personalizaciones.

Noté que Ubuntu 10.04 eliminó el paquete spidermonkey. Rhino parece que todavía está allí. ¿Cuáles son las diferencias entre rhino y spidermonkey (además de en qué idioma están escritas)? ¿Y por qué eliminaron spidermonkey?


Sobre la base de los lenguajes que han sido desarrollados, las necesidades del desarrollador manejan explícitamente la memoria usando spidermonkey. Como Rhino se ha desarrollado en Java, que incluye la recolección automática de basura, y JVM [Java Virtual Machine] se han optimizado para una ejecución más rápida que c o c ++ de la versión Java 1.6.


Ya que tengo grandes dificultades para encontrar ejemplos básicos sobre shells / intérpretes de JavaScript, especialmente rhino , en Ubuntu. Lo publicaré aquí ...

Básicamente, estaba un poco confundido sobre qué instalar y a qué tipo de línea de comandos debo llamar :)

En primer lugar, encontré el error # 705339 en rhino (Ubuntu): "Rhino shell se bloquea con NullPointerException" , y me di cuenta de que OpenJDK en realidad instala un archivo de rhino.jar Java. Así que si tienes eso, puedes hacerlo inmediatamente en el shell de 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 todo esto es lo suficientemente bueno para cosas básicas ... Sin embargo, si desea usar el objeto de la window DOM o la función setTimeout() , en esencia, esas son "implementaciones específicas del navegador" ( para setTimeout , vea también SO:7286178 ), y un motor de secuencias de comandos sin un navegador no "sabría" sobre ellos.

Sin embargo, al menos para rhino , que es remediado por la biblioteca Envjs ''browser environment'', cuya última versión - 1.2 para rhino es env.rhino.js ( ver SO:6170676 para setTimeout en rhino ).

Entonces 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, eso se aclara en No se puede ejecutar 1.2 debido al error getCurrentContext. - Env.js | Grupos de Google :

Lo sentimos, Envjs no puede ejecutarse con el rinoceronte incluido en Java. Necesitará usar 1.7rc2 disponible 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 que como indica la lista de archivos de rhino , este paquete instala js-1.7R2.jar . El paquete también instala un script rhino , que básicamente es un envoltorio de shell para estos archivos Java (ver less $(which rhino) ), por lo que podemos usarlo convenientemente, 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 como un script, llamémoslo test.js :

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

y trata de llamar al rhino

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

Oh querido - falla otra vez, ¿ahora qué? :) Bueno, afortunadamente, incluso esto está algo insinuado en la Guía de Envjs ( nota: permita javascript para esa página, de lo contrario el código será apenas visible ) - en particular:

# Ejecutando 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

Bien, finalmente, simplemente agregamos 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 puede usar console.log() para escribir en stdout. EDITAR: para ejecutar el depurador de rhino Java, vea usar less $(which rhino) donde están instalados los .jars particulares, y luego llame directamente a java ( el script del rhino usa un conjunto diferente de interruptores de la línea de comandos, por lo que no se puede convencerlo para que llame el depurador ):

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

Si intenta ejecutar la misma secuencia de comandos ahora con spidermonkey (consulte también las instrucciones de PPA en ¿ Mejor manera de obtener spidermonkey js en Ubuntu 11.04? ), Obtendrá:

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

... es decir, spidermonkey no funcionará con env.rhino.1.2.js .

Bueno, espero que esto ayude a alguien,
¡Aclamaciones!