Статьи

Представляем Nashorn JavaScript Engine

Nashorn — это новый движок JavaScript, разработанный на языке программирования Java компанией Oracle, выпущенный вместе с Java 8. Цель Nashorn — реализовать облегченную высокопроизводительную среду выполнения JavaScript в Java с собственной JVM. Используя Nashorn, разработчик может встраивать JavaScript в приложение Java, а также вызывать методы и классы Java из кода JavaScript.

Зачем оставлять носорога?

Rhino является предшественником Nashorn. Он начался как проект в 1997 году в NetScape и был выпущен в 1998 году.

С момента выхода Rhino прошло 16 лет, и этот движок JavaScript дожил до наших дней. Поэтому ребята из Java решили повеселиться, разработав новый движок JavaScript с нуля, а не переписывая существующий. Это родило Nashorn (забавный факт: nashorn означает носорог на немецком языке).

Почти все здесь используют JavaScript в браузере, а некоторые используют его на сервере (например, Node.js), но Nashorn разработан для другой цели. Используя Nashorn, разработчик может выполнить магию:

  • Запуск JavaScript как нативный код рабочего стола.
  • Использование JavaScript для сценариев оболочки.
  • Вызовите классы и методы Java из кода JavaScript.

Цели Нашорна

Когда Nashorn был спроектирован, разработчики решили для него ряд целей:

  • Он должен быть основан на спецификации языка ECMAScript-262 Edition 5.1 и должен пройти тесты на соответствие ECMAScript-262.
  • Он должен поддерживать API javax.script (JSR 223).
  • Это должно позволить вызывать Java из JavaScript и наоборот.
  • Он должен определять инструмент командной строки, jjs для оценки кода JavaScript в сценариях «shebang» (которые обычно начинаются с #!/bin/sh ), здесь документы и редактировать строки.
  • Его производительность должна быть значительно лучше, чем у Rhino.
  • Не должно быть никаких угроз безопасности.

Кроме того, никто не решил, что Nashorn не будет включать отладку и не будет поддерживать библиотеки и фреймворки CSS и JavaScript. Это означает, что Nashorn может быть реализован в браузере, не будучи кошмаром.

JavaScript в (ореховой) оболочке

Чтобы использовать JavaScript в оболочке с помощью инструмента jjs от Nashorn, вы должны сначала установить JDK8 , который вы можете скачать бесплатно. Чтобы проверить его установку, выполните:

 >_ javac -version # it should echo # java version "1.8.x" jjs -version # it should echo # nashorn 1.8.x jjs> 

Если у вас возникли проблемы с первой или второй командой, попробуйте добавить JDK в путь

Теперь вы можете использовать JavaScript в качестве сценария оболочки. Проверьте этот простой пример:

 jjs> var a = 1 jjs> var b = 4 jjs> print (a+b) 5 jjs> 

Как вы, возможно, уже поняли, вам не нужно писать код в оболочке jjs . Вы можете записать код в исходный файл JavaScript, а затем вызвать его из оболочки. Рассмотрим следующий код JavaScript:

 var isPrime = function(num) { if (isNaN(num) || !isFinite(num) || num < 2) return false; var m = Math.sqrt(num); for (var i = 2;i <= m; i++) if (num % i === 0) return false; return true; } var numbers = [ 2, 3, 4, 5, 6, 7, 8, 9, 10 ]; for (var i = 0; i < numbers.length; i++) { if (isPrime(numbers[i])) print(numbers[i] + " is prime"); else print(numbers[i] + " is not prime"); } 

Предполагая, что код находится в файле с именем prime.js , мы можем запустить его в оболочке, выполнив:

 >_ jjs prime.js 2 is prime 3 is prime 4 is not prime 5 is prime 6 is not prime 7 is prime 8 is not prime 9 is not prime 10 is not prime 

Это может напоминать вам код Python или скрипты bash, но это JavaScript. И чтобы сделать его более похожим на bash, Nashorn предоставляет переменную arguments для извлечения аргументов командной строки. Рассмотрим этот пример:

 if (arguments.length === 0) print("No command-line arguments."); else { print("Called with these command-line arguments:"); for each (cli_arg in arguments) { print(cli_arg); } } 

Запуск его даст этот вывод (аргументы идут после -- ):

 >_ jjs cliargs.js No command-line arguments. >_ jjs cliargs.js -- ab "cd e" Called with these command-line arguments: a b cde 

Кроме того, JavaScript может использовать классы и методы Java. Посмотрите этот пример многопоточного кода JavaScript:

 var Thread = Java.type("java.lang.Thread"); var Runnable = Java.type('java.lang.Runnable'); var Run1 = Java.extend(Runnable, { run: function() { print("One thread"); print("One thread"); } }); new Thread(function() { print("Another thread"); print("Another thread"); print("Another thread"); }).start() new Thread(new Run1()).start(); 

И вывод будет:

 Another thread Another thread One thread One thread Another thread 

По выводу вы можете сказать, что код многопоточный. Используя Java.type("java.lang.Thread"); мы можем вызывать классы Java внутри кода JavaScript. Nashorn позволяет даже идти в другом направлении, вызывая код JavaScript внутри кода Java.

 package j2js.example; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; public class Main { public static void main(String[] args) { ScriptEngine nashorn = new ScriptEngineManager().getEngineByName("nashorn"); try { nashorn.eval("print('Am I Java or JavaScript?')"); } catch (ScriptException e) { e.printStackTrace(); } } } 

Этот пример просто печатает Am I Java or JavaScript? вопрос в строке 14, но это самый простой пример кода JavaScript в Java. Можно прочитать весь исходный код из файла JavaScript, используя методы Java, а затем передать этот код в качестве параметра String в метод eval() . Это сделало бы код JavaScript для выполнения внутри Java.

Вывод

В настоящее время JavaScript есть везде! Вы можете использовать его для клиентских приложений, серверных приложений и, что еще лучше, иногда как для клиента, так и для сервера . Вы можете использовать его для мобильных приложений или для настройки небольшой IoT . И теперь, с Nashorn, вы можете использовать его как мощный скриптовый язык, похожий на оболочку, используя преимущества простоты JavaScript и богатого API Java.