Разъяснения насчёт JavaScript, ECMA–262, TC39 и транскомпиляторов ECMAScript

Введение

Что такое JavaScript? На этот вопрос есть множество верных ответов, но я думаю, что самым современным, кратким и точным ответом будет такой: JavaScript — это реализация спецификации ECMAScript.

JavaScript схож с HTML и CSS тем, что все они являются реализациями очень хорошо определённых спецификаций. Держу пари, что лучший способ понять что-то и стать в этой области экспертом — полностью прочесть и понять спецификацию, на которой это что-то основывается. Именно это побудило меня написать статью.

Так что же такое ECMAScript?

ECMAScript — это стандарт, который развивается и поддерживается ассоциацией ECMA International1. Он был принят Генеральной Ассамблеей Ecma в июне 1997. А если точнее, ECMAScript — это стандарт ECMA-262, который называется «Спецификация языка ECMAScript», и у которого было несколько редакций. На настоящий момент актуальна редакция 5.1, она была принята Генеральной Ассамблеей и опубликована в июне 2011. Стандарт создавался на основе оригинальной версии JavaScript от Брендана Айха из Netscape и интерпретатора JScript от Microsoft, но с тех пор значительно развился2.

Как уже упоминалось, JavaScript — это реализация спецификации ECMAScript. Это означает, что по мере того, как у спецификации появляются новые черновики или опубликованные редакции, разработчики браузеров и фреймворков вроде Node.js должны последовательно внедрять новый функционал. Для этого вносятся изменения в движки, которые эти браузеры и фреймворки используют для интерпретирования и выполнения кода JavaScript.

Зачем нужна спецификация? В различных браузерах используются различные движки JavaScript, например, V8 в Chrome, SpiderMonkey в Firefox, и так далее. Когда вы пишете на JavaScript, вы ожидаете, что все движки во всех окружениях будут разбирать и выполнять ваш код абсолютно одинаково. Без стандартизованной спецификации любой из этих движков был бы волен исполнять JavaScript как ему вздумается, очевидно, что это не очень хорошо.

Откуда взялась cпецификация ECMA-262?

Ecma International Technical Committee 39 (он же TC39) — комитет очень умных людей3, он связан с группой участников, которые в свою очередь тоже очень умны4. Они собираются вместе на встречах комитета приблизительно раз в два месяца и обсуждают заранее подготовленные списки вопросов.

Задачей TC39 является поддержка и обновление упомянутой ранее спецификации ECMAScript, после обсуждения и всеобщего согласия. Сюда относятся синтаксис языка, семантика, библиотеки и сопутствующие технологии, на которых основывается язык5.

Этот процесс определён TC396. Всё начинается с наброска функционала, расширяющего или изменяющего спецификацию. Такие наброски часто исходят от сообществ разработчиков, или же от самих участников TC39. Если предложение оказывается достойным, набросок получает статус официального предложения, и за него начинают нести ответственность один или несколько «чемпионов».

Затем на своём пути от идеи до публикации предложение проходит несколько определённых стадий. Они пронумерованы от нуля до четырёх: «Чучело», «Предложение», «Черновик», «Кандидат» и «Завершено». Переход на любую следующую стадию требует одобрения TC39. Если предложение добралось до стадии 4, можно ожидать, что его включат в следующую официально опубликованную редакцию спецификации стандарта ECMA-262, и в итоге оно появится в окружении, которое выполняет JavaScript. Больше об этом процессе вы можете узнать на сайте Ecma7.

Совместимность с текущей редакцией ECMAScript

ECMAScript 6 (он же ES.Next) уже движется по направлению к повсеместному применению. Напомню, текущая версия ECMAScript — 5.1, а так называемая «Harmony» включает в себя возможности из предстоящих 6 и 7 версий.

Хотя множество возможностей, которые предоставляет Harmony, уже есть в современных браузерах и Node.js с флагом --harmony, есть другие фичи, которые требуют компилятора/транскомпилятора (мы вернёмся к этой теме).

Юрий @kangax Зайцев, автор блога Perfection Kills, создал и поддерживает отличный набор сводных таблиц по совместимости ECMAScript8. При помощи этих таблиц можно выбрать фичу ECMAScript и узнать, насколько с ней совместимы компиляторы, десктопные браузеры разных версий, серверные фреймворки (Rhino, PhantomJS, Node.js) и операционная система iOS.

В дополнение к этому на MDN часто можно найти таблицы совместимости для десктопных и мобильных браузеров9.

Можно ли уже сейчас пользоваться функционалом из будущей редакции ECMAScript?

Да, можно. Часть возможностей уже есть в некоторых браузерах и в Node, но многие другие требуют стороннего транскомпилятора ECMAScript. Эти транскомпиляторы часто называют просто компиляторами. Но технически между транскомпилятором и обычным компилятором есть разница10.

Для транскомпиляторов ECMAScript исходный язык — это будущая версия спецификации (т.е., ES 6), который далее компилируется в предыдущую, более стабильную и распространённую версию той же спецификации (т.е., ES 5.1). Далее в этой статье я буду называть их просто транскомпиляторами.

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

Стоит ли сейчас использовать функционал будущей редакции ECMAScript?

Ответ зависит от того, что вы собираетесь делать: поизучать и поиграться с новыми фичами, или по-настоящему использовать транскомпилятор и новый функционал в продакшне.

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

Чем более зрелым и проработанным становится функционал, тем больше вероятность, что он останется неизменным при окончательной публикации стандарта. Однако, множество фич (ES 7, «Чучело», и т.п.) всё ещё находятся в ранних стадиях процесса, и могут быть изменены или удалены из окончательной спецификации. В этих случаях пользоваться функционалом, который может не войти в финальную версию или значительно измениться, — не самая разумная мысль.

В первом же случае, мне кажется, пользоваться транскомпилятором и быть на острие прогресса — это замечательно. Люди часто говорят о том, что следует подновлять свои навыки, изучая последние технологии, и это неспроста, учитывая как часто всё меняется. Изучение особенностей будущего ECMAScript даёт вам большие преимущества в том смысле, что вы изучаете что-то не ретроактивно и вынужденно, а ещё до того, как это официально выпущено. Это более проактивный подход к профессиональной разработке, и такие возможности попадаются не так уж и часто.

Помните, что этот функционал добавляется в язык неспроста. Причины, по которым умные люди из TC39 это делают — улучшение качества языка, абстрагирования, удобства пользования и другие. Изучите эти новшества заранее, и к тому моменту, как они будут официально опубликованы и станут везде поддерживаться, вы сможете не теряя времени сразу приняться за работу. Вы также можете позиционировать себя как эксперта по JavaScript в своей организации, способного предложить новые особенности языка, позволяющие улучшить как код, так и сам продукт.

Заключение

JavaScript — удивительный, мощный и широко распространённый язык. Чтобы стать настоящим экспертом в области JavaScript, я рекомендую прочитать спецификацию ECMA-262, на которой он основан. Также важно понимать, откуда эта спецификация берётся, как она поддерживается и какие процессы применяются при развитии языка. Наконец, понимание того, что такое транскомпиляторы и как ими пользоваться, без сомнения даст вам преимущество. Кто знает, может быть, вы или я когда-нибудь станем членами TC39.

Читайте также о ECMAScript Harmony


Примечания

1. Что такое Ecma International

2. Стандарт ECMA-262: Язык ECMAScript®, редакция 5.1

3. Члены комитета TC39

4. Участники TC39

5. Домашняя страница TC39

6. Процесс TC39

7. Процесс Harmony

8. Таблица совместимости ECMAScript 6 от Kagnax

9. Таблицы совместимости на MDN

10. Статья на Википедии: Транскомпилятор