Носорог против spidermonkey

Я заметил, что ubuntu 10.04 удалил пакет spidermonkey. Но Rhino выглядит все еще там. Каковы различия между носорогом и spidermonkey (помимо того, на каком языке они написаны). И почему они удалили spidermonkey?

Ответ 1

Я боюсь, что разница - это язык, на котором они написаны, или что это значит. Люди используют C/С++ для написания всех вещей (например, Firefox), тогда как Java наиболее распространена в серверах приложений. Из http://en.wikipedia.org/wiki/Rhino_%28JavaScript_engine%29:

Rhino преобразует скрипты JavaScript в Java-классы. Rhino работает в обоих скомпилированный, а также интерпретируемый режим. Он предназначен для использования в серверных приложений, следовательно нет встроенной поддержки браузера объекты, которые обычно связаны с JavaScript.

Здесь есть три важные части. Во-первых, нет DOM (также верно для SpiderMonkey). Во-вторых, серверная сторона - это предполагаемое использование. Вы должны использовать Rhino в своем крупном корпоративном приложении для автоматизации работы на более разовой основе. Наконец, Javascript становится классом, как и остальная иерархия классов Java, и вы можете взаимодействовать с классами Java (см. Пример кода на этой странице).

Короче говоря, вы могли бы легко манипулировать своими объектами POJO/JPA/Message Beans/тем, что вы хотите назвать своим "корпоративным" Java-классом, все из javascript, проходящим через Rhino. Сравните это с Jython, где вы можете использовать синтаксис Python и классы для взаимодействия с Java. Удобно, если у вас есть какие-то ошибки JavaScript/Python, которые пишут вокруг офиса, и ничего не делать.

SpiderMonkey по контрасту больше похож на LUA. Это язык сценариев. Какая разница? Ну, я сомневаюсь, что вы получите доступ к printf напрямую, для одного. Вместо того, чтобы сразу обращаться к Java-классам, вы не можете сразу перейти к классам C/С++. Скорее, вы используете C/С++ для программирования дополнительных функций языка.

Короче говоря, Rhino позволяет JS взаимодействовать с вашим кодом. SpiderMonkey больше похож на набор собственных компиляторов с дополнительным преимуществом, поскольку стандартный язык, о котором многие знают, уже построен, и вам просто нужно добавить свои настройки к нему.

Ответ 2

Поскольку у меня есть большие трудности с поиском базовых примеров о оболочках/интерпретаторах JavaScript, особенно rhino, на Ubuntu - я отправлю это здесь...

В принципе, я был немного смущен тем, что нужно устанавливать, и какую командную строку вызывать:)

Прежде всего, я нашел Ошибка # 705339 в носороге (Ubuntu): "Сбой Rhino с ошибкой NullPointerException" - и понял, что OpenJDK фактически устанавливает архив rhino.jar Java. Поэтому, если у вас есть это, вы можете сразу сделать это в терминальной оболочке 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()

 

И все это достаточно хорошо для базовых вещей... Однако, если вы хотите использовать объект DOM window или функцию setTimeout() - по существу, это "специфические для браузера реализации" (для setTimeout см. также SO: 7286178), а механизм сценариев без браузера не будет "знать" о них.

 

Однако, по крайней мере, для rhino, который исправляется библиотекой Envjs ', где Последняя версия - 1.2 для rhino - env.rhino.js (см. SO: 6170676 для setTimeout в rhino).

Итак, мы можем сделать что-то вроде этого:

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 - это не работает:) Однако это поясняется в Не удается запустить 1.2 из-за ошибки getCurrentContext. - Env.js | Группы Google:

Извините, Envjs не может работать с носорогом в комплекте с java. вам нужно будет использовать 1.7rc2 можно получить здесь:

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

К счастью, вместо сборки из источника, в Ubuntu мы можем напрямую:

sudo apt-get install rhino

... поскольку, поскольку список файлов rhino, этот пакет устанавливает js-1.7R2.jar. Пакет также устанавливает script rhino, который по существу является оболочкой оболочки для этих Java-архивов (см. less $(which rhino)) - поэтому мы можем удобно использовать это вместо ввода java -jar ... и т.д.:

$ 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

 

Однако теперь попробуйте включить те же строки, что и script, позвоните ему test.js:

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

и попробуйте вызвать rhino на нем:

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

 

О, дорогая, снова не получается, что теперь?:) Ну, к счастью, даже это несколько намечено на Envjs Guide (примечание: разрешить javascript для этой страницы, иначе код будет едва видно) - в частности:

# Запуск env.rhino.js из script или командной строки
# Обратите внимание на настройку оптимизации
java -jar lib/js.jar -opt -1 myscript.js

Вправо - так, наконец, мы просто добавляем эту настройку оптимизации и:

$ 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]

... наконец, он работает:) EDIT: с помощью env.rhino.1.2.js вы также можете использовать console.log() для записи в stdout. EDIT: Чтобы запустить отладчик rhino Java, см. Раздел less $(which rhino), где указаны конкретные .jars, а затем напрямую вызовите java (rhino script использует другой набор ключей командной строки и так далее не может быть убежден в вызове отладчика):

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

 

Если вы попытаетесь запустить тот же script теперь с spidermonkey (см. также инструкции PPA в Лучший способ получить spidermonkey js на Ubuntu 11.04?) вы получите:

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

... то есть spidermonkey не будет работать с env.rhino.1.2.js.

 

Хорошо, надеюсь, это поможет кому-то,
Ура!

Ответ 3

На основе языков, на которых они были разработаны, разработчик должен явно обрабатывать память с помощью spidermonkey. Поскольку новинка была разработана в java, которая включает в себя автоматическую сборку мусора и JVM [виртуальная машина Java], были настроены для более быстрого выполнения, чем c или С++ из версии Java 1.6.