Rhino

Тип |  движок JavaScript
Разработчики |  Mozilla Foundation / Mozilla Corporation
Написана на |  Java
Операционная система  |  Кроссплатформенное программное обеспечение
Первый выпуск |  1997
Аппаратная платформа  |  Java Virtual Machine
Последняя версия |  1.7.15 (апрель 2024 года)
Репозиторий |  github.com/mozilla/rhino
Лицензия |  MPL 2.0/GPL 2.0[1]
Сайт |  mozilla.github.io/rhino/

Rhino — движок JavaScript с открытым исходным кодом. Он написан полностью на Java и поддерживается Mozilla Foundation[2]. Mozilla Foundation также поддерживает другую реализацию движка JavaScript, написанную на C — SpiderMonkey[3].

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

Rhino может использоваться как отладчик при использовании Rhino shell. Он также может использоваться в приложениях при встраивании Rhino.

Незначительно модифицированная версия Rhino 1.6r2 поставляется вместе с Sun Microsystems Java SE 6, которая была выпущена в декабре 2006[4]. Это упрощает интеграцию JavaScript в Java программы и доступ к Java-ресурсам из JavaScript. Другие реализации Java 6 могут иметь отличия.

## Содержание

* 1 История
* 2 Применение
* 3 Пример
* 4 Примечания
* 5 Литература
* 6 Ссылки

## История

[править | править код]

Проект Rhino был начат в Netscape в 1997 году. В то время Netscape планировала разработать версию Navigator, написанную полностью на Java и поэтому ей требовалась реализация JavaScript, написанная на Java. Когда Netscape остановила работу над «Javagator», как он был назван, проект Rhino был закончен как JavaScript движок. С того времени несколько крупных компаний (включая Sun Microsystems) лицензировали Rhino для использования в своих проектах и платили для этого Netscape, позволяя продолжать работу над ним.

Изначально Rhino компилировал весь JavaScript-код в байткод Java в сгенерированных файлах классов. Это давало лучшую производительность (при запуске на JIT часто превышавшую производительность C-реализации JavaScript), но страдала от двух недостатков. Во-первых, время компиляции было большим, поскольку генерация Java байткода и загрузка сгенерированных классов были тяжеловесным процессом. Во-вторых, реализация допускала большие утечки памяти, поскольку большинство JVM не собирало неиспользуемые классы или строки, которые интернировались как результат загрузки класс-файла.

Поэтому осенью 1998 в Rhino был добавлен интерпретируемый режим. Генерация кодов класс-файлов была перемещена в опциональную динамически-загружаемую библиотеку. Компиляция ускорилась, и когда скрипты больше не использовались, они могли быть собраны как и любые другие Java-объекты.

Rhino был передан Mozilla Foundation в апреле 1998. В результате перехода Rhino в open source он нашёл различные применения и большее количество людей стало вносить вклад в код[5].

Проект получил своё название от животного (носорога) на обложке книги о JavaScript, изданной O'Reilly Media[5][6].

Начиная с версии 1.7R1, Rhino основывается на платформе Java 5 и поддерживает JavaScript версии 1.7[7].

Фирма Oracle объявила, что ведётся разработка более производительной, чем Rhino, JavaScript-реализации, которая названа Nashorn и была включена в состав Java 8 в 2014 году[8][9].

## Применение

[править | править код]

Rhino и Java Scripting API используются для скриптинга Java-приложений[4]. Это позволяет описывать бизнес-логику на более простом, чем Java, языке (привлекая к этому специалистов в предметной области с базовым навыком программирования), обеспечить модульную, расширяемую за счёт плагинов архитектуру приложения и интеграцию в приложение ранее существующих скриптов[10].

Это также хорошее решение для JavaScript на стороне сервера при использовании Java-хостинга, несколько таких решений было создано в рамках проекта CommonJS[11][12]. В том числе Rhino можно использовать совместно с Google App Engine[13].

Для работы под управлением ОС Android поверх виртуальной машины Dalvik Rhino подходит слабо[14].

## Пример

[править | править код]

Вот пример Java-кода, запускающего JavaScript `print('Hello, world!')`

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

public class RhinoEngine {
public static void main(String[] args) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName("JavaScript");

// Теперь у нас есть экземпляр движка и мы можем выполнить JavaScript
try {
engine.put("name", args[0]);
engine.eval("print('Hello ' + name + '!')");
} catch (ScriptException ex) {
ex.printStackTrace();

ScriptEngineManager — это основной класс, используемый при работе с пакетом скриптинга (большинство других — интерфейсы), путём создания его экземпляров. В случае использования JavaScript-движка Rhino надо задать его имя `"JavaScript"`[10].

## Примечания

[править | править код]

1. ↑ Rhino license - MDC (англ.). Дата обращения: 20 февраля 2010. Архивировано из оригинала 5 декабря 2008 года.
2. ↑ Rhino - JavaScript for Java (англ.). Дата обращения: 20 февраля 2010. Архивировано из оригинала 18 апреля 2012 года.
3. ↑ SpiderMonkey (JavaScript-C) Engine (англ.). Дата обращения: 20 февраля 2010. Архивировано из оригинала 18 апреля 2012 года.
4. ↑ 1 2 John O'Conner. Scripting for the Java Platform  (неопр.). Sun Developer Network (июль 2006). Дата обращения: 14 мая 2012. Архивировано из оригинала 30 июня 2012 года.
5. ↑ 1 2 Rhino History (англ.). Mozilla Foundation. Дата обращения: 21 февраля 2010. Архивировано из оригинала 18 апреля 2012 года.
6. ↑ JavaScript: The Definitive Guide, Fifth Edition - O'Reilly Media (англ.). Дата обращения: 20 февраля 2010. Архивировано из оригинала 18 апреля 2012 года. — обложка книги
7. ↑ New in Rhino 1.7R1 (англ.). Mozilla Foundation. Дата обращения: 21 февраля 2010. Архивировано из оригинала 5 апреля 2008 года.
8. ↑ Java Scripting Enhancements  (неопр.). Дата обращения: 3 мая 2014. Архивировано 3 мая 2014 года.
9. ↑ Paul Krill. Oracle prepping its Nashorn JavaScript engine  (неопр.). InfoWorld (5 октября 2011). Дата обращения: 15 мая 2012. Архивировано из оригинала 30 июня 2012 года.
10. ↑ 1 2 Том МакКвини. Используйте динамические языки динамично: Часть 1. Введение в Java scripting API  (неопр.). IBM developerWorks (29 мая 2008). Дата обращения: 15 мая 2012. Архивировано из оригинала 30 июня 2012 года.
11. ↑ CommonJS  (неопр.). Дата обращения: 15 мая 2012. Архивировано 30 сентября 2013 года.
12. ↑ Avi Deitcher. Simplicity and Performance: JavaScript on the Server // Linux Journal. — April 2011. — № 204. Архивировано 8 мая 2012 года.
13. ↑ Rhino For Webapps Архивная копия от 10 июня 2015 на Wayback Machine, Javascript on AppEngine
14. ↑ Tony Mobily. Writing native Android applications with Javascript? Not yet.  (неопр.) Free Software Magazine[англ.] (15 марта 2012). Дата обращения: 15 мая 2012. Архивировано из оригинала 30 июня 2012 года.

## Литература

[править | править код]

* Том МакКвини. Используйте динамические языки динамично (в 2-х частях)  (неопр.). IBM developerWorks (сентябрь 2008). Дата обращения: 14 мая 2012. Архивировано из оригинала 27 мая 2012 года.
* Андрей Чиорояну. JavaScript EE (в 2-х частях)  (неопр.). IBM developerWorks (июнь 2010). Дата обращения: 14 мая 2012. Архивировано 27 мая 2012 года.
* Ted Neward. 5 things you didn’t know about … the Java Scripting API (An easier way to do scripting on the Java platform)  (неопр.). IBM developerWorks (27 июля 2010). Дата обращения: 14 мая 2012. Архивировано из оригинала 30 июня 2012 года.

## Ссылки

[править | править код]

* Страница проекта на сайте Mozilla (англ.)

Проекты Mozilla

Браузеры|

* Firefox
* 2
* 3
* 3.5
* 3.6
* 4
* история версий
* Mobile
* SeaMonkey

Другие проекты|

* Firefox OS
* Bugzilla
* ChatZilla
* Lightning
* Rust
* Sync
* Thunderbird
* Common Voice
* Mozilla Location Service

Не развиваются|

* Camino
* Sunbird
* Calendar Project
* Minimo
* Mozilla Application Suite
* Nvu
* Prism
* Penelope
* Persona

Инфраструктура|

* Gecko
* Necko
* XBL
* XPCOM
* XPConnect
* XPInstall
* XUL
* XULRunner
* Servo

Компоненты|

* Composer
* NSPR
* Rhino
* SpiderMonkey
* Tamarin
* Venkman

ECMAScript

Диалекты|

* ActionScript
* Caja[англ.]
* JavaScript (движки)
* JScript
* Objective-J
* QtScript
* WMLScript

Движки[англ.]
(сравнение[англ.])|

* Carakan
* Futhark
* InScript[англ.]
* JavaScriptCore
* SquirrelFish
* JScript
* KJS[англ.]
* Linear B
* Narcissus[англ.]
* QtScript
* Rhino
* YAJI
* SpiderMonkey
* TraceMonkey
* JägerMonkey
* Tamarin
* V8
* ChakraCore[англ.]
* (Chakra[англ.])
* Nashorn

Фреймворки,
библиотеки|

| JavaScript
(сравнение[англ.])|

| Client-side

* Dojo
* Echo[англ.]
* Ext JS
* Google Web Toolkit
* jQuery
* Lively Kernel[англ.]
* midori[англ.]
* MochiKit[англ.]
* MooTools
* Prototype
* Pyjs[англ.]
* qooxdoo
* Rialto[англ.]
* Rico
* script.aculo.us
* SmartClient
* SproutCore
* Spry
* YUI Library

|

Server-side

* AppJet[англ.]
* Jaxer
* Node.js

Библиотеки
(список[англ.])|

* SWFObject[англ.]
* SWFAddress[англ.]

ActionScript|

PureMVC[англ.]

Множественные
реализации|

* Cappuccino
* JavaScript
* Objective-J

Люди|

* Брендан Эйх
* Дуглас Крокфорд
* Джон Резиг

Другое|

* DHTML
* Ecma International
* JSDoc
* JSLint
* JSON
* JSSS
* Sputnik[англ.]
* SunSpider
* CommonJS[англ.]