Часть 2. История стандартов JavaScript

Работа над стандартизацией JavaScript началась в 1996 году. Стандарту, над которым работала группа TC-39, был присвоен идентификационный номер ECMA-262. Первый стандарт был выпущен в 1997 году и не включал в себя важные особенности, такие как регулярные выражения, JSON, исключения.

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

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

●      Исключения и try/catch блоки
●      Регулярные выражения
●      Блок do/while
●      Операторы in и instanceOf

Однако вместе с началом работы над ECMAScript 4 в комитете начались разногласия, что в итоге разделило комитет на 2 группы. Одна группа предлагала сделать JavaScript языком для разработки крупных приложений и внести в язык множество новых функций большого объёма. Другая группа была не согласна с таким путём развития языка. В результате началась одновременная работа над двумя стандартами, для чего были созданы два неофициальных комитета. ECMAScript 4 по-прежнему был слишком сложным и закончить его в ближайшее время не представлялось возможным.

Окончательную точку в деле ECMAScript 4 поставили только в 2008 году, после встречи комитета, где обсуждалась дальнейшая судьба ECMAScript и будущее версий 3.1 и 4. На этой встрече приняли решение сфокусироваться на версии 3.1: ECMAScript 3.1 был намного проще и, несмотря на разногласия в ECMA, работа над ним была успешно закончена, а от четвёртого издания всё-таки отказались.

Поскольку ECMAScript 4 считался своеобразным вариантом ECMAScript, несмотря на отсутствие релиза было решено переименовать ECMAScript 3.1 в ECMAScript 5. В целом, ECMAScript 5 был небольшим улучшением, которое приукрасило JavaScript в плане юзабилити как для небольших скриптов, так и для объемных проектов.

Пятая версия стандарта вышла в 2009 году (спустя 10 лет после третьей версии!). В неё, помимо прочих, внесли такие улучшения, как:

●      JSON
●      Неизменяемые глобальные объекты (Undefined, NaN, Infinity)
●      Геттеры/сеттеры
●      Методы массивов (indexOf, every, some, map, filter, reduce)
●      Методы Date (toISOString, now, toJSON)
●      Разделители-запятые в массивах и объектах
●      Привязывание функций

Чтобы оценить, насколько долго длилась эта холодная война между двумя частями комитета, давайте взглянем, сколько всего произошло в мире за это время. Возьмём, например, компанию Google. Когда комитет выпустил третью версию стандарта и разделился на 2 конфликтующие части в 1999 году, Google только-только зародилась и офис компании выглядел очень скромно:

Когда же комитет, наконец, пришёл к консенсусу и выпустил пятую версию стандарта в 2009 году, офис Google уже выглядел так:

Если посмотреть на эту историю в разрезе конкретных дат, то можно увидеть, сколько больших открытий произошло в мире информационных технологий, пока комитет делал всего лишь один шаг:

Проблемы процесса, которого комитет придерживался, были очевидны:

  • Готовые возможности языка долго ждут релиз и разработчики долго ждут новый функционал;
  • Непрозрачность и закрытость процесса (JavaScript-сообществу трудно дать обратную связь и повлиять на процесс, предложить идеи).

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

После ES5 комитет начал переход к новому процессу. Первым таким стандартом стал ES6. Этот стандарт ещё называют «Гармония», потому что он стал местом консенсуса и в него входили некоторые фичи из 4 версии. Релиз был большим и создавался около 6 лет, но включал всё необходимое для перехода к годовому управлению версиями JavaScript. Шестая версия стандарта вышла в 2015 году. В этом релизе можно отметить следующие функции:

●      Классы
●      Promises
●      Стрелочные функции
●      Генераторы и итераторы

После шестой версии процесс принятия нового стандарта устоялся. Так что теперь мы можем наблюдать новую версию стандарта в июле каждого года.

Новый процесс намного более прозрачный и открытый. Настолько, что можно  использовать и тестировать новые возможности из будущей редакции EcmaScript, которые ещё не вошли в релиз. Некоторые JavaScript-движки добавляют поддержку предложенных возможностей до того, как они переходят на финальную стадию принятия стандарта. Так разработчики могут протестировать их и дать фидбэк. Другие улучшения требуют стороннего транспайлера ECMAScript. Таким транспайлером является Babel. Транспайлеры предоставляют возможность компилировать код новой версии языка в код старой версии. Babel поддерживает экспериментальные возможности языка при помощи плагинов. Он публикует список поддерживаемых возможностей ECMAScript в официальном репозитории. Однако пока предложение не достигло финального этапа, нет никаких гарантий, что оно станет частью спецификации. Так что, наверное, не стоит использовать экспериментальные возможности языка в продакшене :)

Как использовать новые возможности, которые не вошли в релиз, мы разобрались. А что, если у вас легаси код, который нужно поддерживать? Для таких случаев есть Lebab. Это программа, которая трансформирует JavaScript-код с традиционным синтаксисом в новый синтаксис ES6. То есть, это точная противоположность тому, что делает Babel.

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

Софья Михайлова, Software Engineer

RSS