openjdk.ruOpenJDK на русском

JEP 292: Implement Selected ECMAScript 6 Features in Nashorn

Реализация избранных возможностей ECMAScript 6 в Nashorn

ОтветственныйHannes Wallnoefer
ТипFeature
ОбластьJDK
СтатусClosed / Delivered
Выпуск9
Компонентcore-libs / jdk.nashorn
Обсуждениеnashorn dash dev at openjdk dot java dot net
ТрудоёмкостьL
ДлительностьL
РецензентыAlex Buckley, Brian Goetz, Jim Laskey
ОдобренBrian Goetz
Создан2014/11/27 00:31
Обновлён2017/03/09 13:36
Задача8066046

Аннотация

Реализовать в Nashorn избранную часть из множества новых возможностей, появившихся в 6-м издании ECMA-262, известном также как ECMAScript 6, или сокращённо ES6.

Цели

Корректно реализовать значительное количество возможностей ES6 в Nashorn в JDK 9.

Из-за объёма этой работы нам нужно поставлять ES6 в несколько этапов, и JDK 9 будет лишь первым из них. Остальные возможности ES6, вероятно, будут поставлены в выпусках обновлений JDK 9 и в будущих основных выпусках JDK.

Мотивация

ECMAScript 6 был выпущен в июне 2015 года. Пока ни один движок JavaScript не обеспечивает полную поддержку ES6, но основные движки, в том числе Google V8, Mozilla Spidermonkey и JavaScriptCore, недавно заметно продвинулись в реализации ES6.

Мы начали реализовывать ES6 в Nashorn с JEP 203 (let и const) в JDK 8u40. Чтобы не отставать от других движков, мы планируем добавить в JDK 9 поддержку значительной части возможностей ECMAScript 6.

Описание

ECMAScript 6 включает следующие новые возможности:

  • Стрелочные функции: краткий способ определения функций с помощью синтаксиса =>

  • Классы: способ определять классы с использованием наследования, конструкторов и методов

  • Расширенные объектные литералы: поддержка специальных и вычисляемых ключей свойств

  • Шаблонные строки: многострочные строки, вычисляемые динамически

  • Деструктурирующее присваивание: связывание при присваивании с использованием синтаксиса объектов или массивов

  • Параметры по умолчанию, остаточные параметры и оператор расширения: более гибкая передача аргументов

  • let, const и блочная область видимости: объявление переменных и констант с областью видимости в пределах блока

  • Итераторы и циклы for..of: протокол для перебора произвольных объектов

  • Генераторы: особый вид функций для создания итераторов

  • Юникод: полная поддержка Юникода с сохранением обратной совместимости

  • Модули: поддержка определения модулей на уровне языка

  • Загрузчики модулей: поддержка динамической загрузки, изоляции и перехватчиков компиляции

  • Map, Set, WeakMap и WeakSet: различные новые классы коллекций

  • Прокси: позволяют создавать объекты с особым поведением

  • Символы: новый вид уникальных ключей свойств

  • Наследуемые встроенные объекты: от встроенных объектов, таких как Array и Date, можно создавать подклассы

  • Промисы: API для асинхронного завершения в будущем

  • API Math, Number, String и Object: различные новые функции встроенных объектов

  • Двоичные и восьмеричные литералы: новые формы числовых литералов

  • API рефлексии: API для выполнения операций метапрограммирования

  • Хвостовые вызовы: позволяют писать рекурсивный код без неограниченного роста стека

Из этих возможностей мы уже реализовали let, const и блочную область видимости в JDK 8u40 в рамках JEP 203. Для ряда других возможностей созданы прототипы, и их следует добавить в список возможностей ES6, поддерживаемых в первоначальном выпуске JDK 9. К ним относятся:

  • Шаблонные строки
  • let, const и блочная область видимости
  • Итераторы и циклы for..of
  • Map, Set, WeakMap и WeakSet
  • Символы
  • Двоичные и восьмеричные литералы

Для других возможностей прототипы созданы частично, и их завершение представляется возможным в ограниченные сроки. Они могут быть включены в выпуски обновлений JDK 9:

  • Стрелочные функции
  • Расширенные объектные литералы
  • Деструктурирующее присваивание
  • Параметры по умолчанию, остаточные параметры и оператор расширения
  • Юникод
  • Наследуемые встроенные объекты
  • Промисы
  • Прокси
  • API Math, Number, String и Object
  • API рефлексии

Остальные возможности сложнее, и на их реализацию, вероятно, уйдёт больше времени. Хотя часть из них, возможно, удастся включить в выпуски обновлений JDK 9, сейчас мы планируем их для будущих основных выпусков JDK. Это следующие возможности:

  • Классы
  • Генераторы
  • Модули
  • Загрузчики модулей
  • Хвостовые вызовы

Независимо от реализации возможностей ES6, парсер Nashorn в репозитории Nashorn для JDK 9 уже поддерживает синтаксические изменения ES6.

Альтернативы

Вместо предлагаемого здесь поэтапного подхода мы могли бы пока не заниматься ECMAScript 6 и вместо этого сосредоточиться на улучшении нашей существующей реализации на основе ECMAScript 5.

Кроме того, можно было бы попытаться реализовать ES6 за один раз. Однако тогда мы не смогли бы получать обратную связь и находить ошибки на ранних этапах. К тому же объём и количество новых возможностей ES6 делают такой подход непрактичным

Совсем не заниматься ES6 было бы ошибкой, и это стало бы неверным сигналом для пользователей и клиентов.

Тестирование

В ходе работы над реализацией частей ES6 мы разработали базовый набор функциональных тестов, который войдёт в состав этого JEP.

Также начата работа по запуску версии ES6 официального набора тестов на соответствие ECMAScript test262. Первые результаты обнадёживают. Однако перейти с версии ES5.1 набора test262 на версию ES6 в качестве основного набора тестов невозможно, поскольку многие тесты требуют полной реализации ES6.

Во время разработки и интеграции этого JEP мы будем использовать версию ES6 набора test262, чтобы выявлять ошибки и восполнять недостающие части. Мы планируем перейти на версию ES6 в качестве основного набора тестов ES6, когда приблизимся к полной функциональности ES6.

Риски и допущения

Спецификация ECMAScript 6 выпущена, и значительная её часть реализована в различных движках JavaScript, поэтому больше нет риска того, что спецификация будет меняться или что её текст окажется неоднозначным.

Возможно, при выбранной нами расстановке приоритетов не будет реализована какая-то возможность, которая нужна разработчикам. Однако предлагаемый поэтапный подход гарантирует, что со временем будут поставлены все недостающие возможности.

Зависимости

Между различными возможностями ES6 есть зависимости, и порядок реализации мы выбрали так, чтобы заниматься возможностями по мере возрастания их сложности.