носорог против спайдермонки - PullRequest
24 голосов
/ 25 августа 2010

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

Ответы [ 3 ]

18 голосов
/ 12 декабря 2010

Боюсь, разница в том, на каком языке они написаны, или что это значит.Люди используют C / 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 ++.Вместо этого вы используете C / C ++ для программирования дополнительных функций языка.

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

6 голосов
/ 03 сентября 2011

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

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

Прежде всего, я нашел Ошибка # 705339 в Rhino (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, это исправлено библиотекой '1026 * 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.Пакет также устанавливает скрипт 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

Однако теперь попробуйте включить эти же строки в скрипт, назовем его 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 ( примечание: разрешите JavaScript для этой страницы, в противном случае код будет едва видимым ) - в частности:

# Запуск env.rhino.js из скрипта или командной строки
# Обратите внимание на настройку оптимизации
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]

... наконец, это работает :) РЕДАКТИРОВАТЬ: с env.rhino.1.2.js вы также можете использовать console.log() для записи на стандартный вывод.РЕДАКТИРОВАТЬ: Чтобы запустить отладчик Java rhino, посмотрите с помощью less $(which rhino) где установлены конкретные .jars, а затем вызовите java напрямую ( сценарий rhino использует другой набор переключателей командной строки, ипоэтому нельзя убедить вызвать отладчик ):

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

Если вы попытаетесь запустить тот же скрипт сейчас с 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,

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

0 голосов
/ 06 декабря 2010

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

...