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 есть зависимости, и порядок реализации мы выбрали так, чтобы заниматься возможностями по мере возрастания их сложности.