Я заметил, что ubuntu 10.04 удалил пакет spidermonkey. Но Rhino выглядит все еще там. Каковы различия между носорогом и spidermonkey (помимо того, на каком языке они написаны). И почему они удалили 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 можно получить здесь:
К счастью, вместо сборки из источника, в 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.