Краткая история JavaScript. Часть 2

ECMAScript 1 и 2: на пути к стандартизации

Первый стандарт ECMAScript был основан на версии JavaScript, входившей в состав Netscape Navigator 4 и не включал в себя важные особенности, такие как регулярные выражения, JSON, исключения и важные методы для встроенных объектов. Тем не менее, в браузере он работал намного лучше. Версия 1 была выпущена в июне 1997 года.

Обратите внимание, что наш простой тест прототипов и функций работает правильно. Над Netscape 4 была проделана огромная работа, и JavaScript получил от этого свою выгоду. Наш пример работает абсолютно так же, как он будет работать в любом современном браузере. Это очень важное достижение для первой версии стандарта.

Вторая версия, ECMAScript 2, была выпущена в июне 1998 года, чтобы исправить несостыковки между ECMA и стандартом ISO для JavaScript (ISO/IEC 16262) и не включала в себя никаких изменений самого языка.

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

ECMAScript 3: первые большие изменения

После ECMAScript 2 работа продолжилась и первые большие изменения языка увидели свет. Новая версия включала в себя:

  • Регулярные выражения
  • Блок do-while
  • Исключения и try/catch блоки
  • Больше встроенных функций для строк и массивов
  • Форматирование численных выходных данных
  • Операторы in и instanceof
  • Улучшенная обработка ошибок

ECMAScript 3 был выпущен в декабре 1999 года.

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

Хоть JavaScript использовался практически повсеместно, он всё ещё оставался клиентским языком программирования. Многие из его нововведений позволили ему приблизиться к тому, чтобы вырваться из этой клетки.

Netscape Navigator 6, выпущенный в ноябре 2000 года, поддерживал ECMAScript 3. Спустя почти полтора года был выпущен Firefox, браузер, основанный на кодовой базе Netscape Navigator и также поддерживавший ECMAScript 3. Бок о бок с Internet Explorer эти браузеры делали всё возможное для дальнейшего роста и развития JavaScript.

Рождение AJAX

AJAX (asynchronous JavaScript and XML) — технология, появившаяся на свет в годы ECMAScript 3. Хоть она и не являлась частью стандарта, Microsoft встроила некоторые расширения для JavaScript в Internet Explorer 5. Одним из таких расширений была функция XMLHttpRequest в виде управляющего элемента ActiveX XMLHTTP. Эта функция позволяла браузеру выполнять асинхронные HTTP-запросы серверу, тем самым позволяя страницам обновляться на лету. Хотя само название AJAX было придумано значительно позже, сама техника активно использовалась в то время.

Впервые термин AJAX был использован Джесси Джеймсом Гарреттом в его статье.

Применение XMLHttpRequest оказалось успешным, и годами позже было стандартизировано группами WHATWG и W3C.

Постоянная эволюция функциональности, разработчики, вносящие что-то новое в язык и встраивающие эти новинки в свои браузеры, до сих пор являются основополагающими факторами в развитии JavaScript и связанных с ним стандартов, таких, как CSS и HTML. Связь между отдельными группами в те дни была очень слабая, что привело к задержкам и фрагментации. Честно говоря, в наши дни разработка JavaScript организована куда лучше благодаря процедурам, позволяющим заинтересованным группам вносить свои предложения.

Игры с Netscape Navigator 6

Эта версия поддерживает исключения — основная особенность, без которой страдали все предыдущие версии, что хорошо видно при попытке открыть Google. Невероятно, но даже сегодня Google, открытый в этой версии, представляет собой читаемую работающую страницу. Для контраста мы попробовали открыть Google при помощи Netscape Navigator 4 и получили неполный рендеринг и поехавшую разметку. Даже в те времена веб развивался стремительно.

Игры с Internet Explorer 5

Internet Explorer 5 также справился с современной версией Google. Тем не менее, существует ряд известных различий в плане реализации определённых возможностей между Internet Explorer и другими браузерами. Эти различия многие годы были настоящей болезнью, доводя веб-разработчиков до белого каления, так как им приходилось каждый раз дорабатывать код специально для пользователей Internet Explorer.

Например, чтобы получить доступ к объекту XMLHttpRequest в Internet Explorer 5 и 6, нужно было обратиться к ActiveX. В то же время другие браузеры обрабатывали его как нативный объект.

Несомненно, сама идея использования этого объекта появилась в Internet Explorer 5. Однако только в Internet Explorer 7 Microsoft начала следовать стандартам. Некоторые устаревшие сайты для правильной работы до сих пор требуют использования старых версий Internet Explorer.

ECMAScript 3.1 and 4: годы борьбы

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

Работа над ECMAScript 4 началась вскоре после выхода третьей версии в 1999 году. Большое количество интересных нововведений обсуждалось в Netscape. Однако интерес к ним со временем иссяк, и в 2003 году работа над новой версией ECMAScript остановилась. Был выпущен промежуточный отчёт, и некоторые разработчики, такие, как Adobe (ActionScript) и Microsoft (JScript.NET) использовали его в качестве основы для собственных движков. В 2005 году AJAX и XMLHttpRequest смогли вновь разжечь интерес к новой версии JavaScript и TC-39 возобновила работу. Проходили годы и набор нововведений рос всё больше и больше. В самый разгар разработки ECMAScript 4 включал такие опции как:

  • Классы
  • Интерфейсы
  • Пространства имён
  • Пакеты
  • Опциональные аннотации типов
  • Опциональная статическая проверка типов
  • Структурные типы
  • Объявления типов
  • Мультиметоды
  • Параметризованные типы
  • Хвостовые рекурсии
  • Итераторы
  • Генераторы
  • Интроспекция
  • Разбор типа для обработчиков исключений
  • Связывание констант
  • Правильный обзор блоков
  • Деструктуризация
  • Сжатые функциональные выражения
  • Поддержка массивов

Проектная документация ECMAScript 4 описывает эту версию, как предназначенную для большого программирования. Если вы знакомы с ECMAScript 6/2015, вы можете заметить, что в ней воплощены многие возможности из перечисленных выше.

Несмотря на гибкость и кажущуюся мощность, на практике ES3 оказывается совершенно непригодным для разработки программ большого объёма. Программы, написанные на ECMAScript, становятся крупнее и сложнее благодаря применению Ajax и повсеместному использованию ECMAScript в приложениях в качестве скриптового языка. Разработка больших программ может существенно выиграть благодаря таким нововведениям, как статическая проверка типов, скрытие имен, ранняя связка и прочим оптимизационным приёмам, которые отсутствуют в ES3. — ECMAScript 4 draft

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

Комитет, разрабатывавший ECMAScript 4, включал в себя Adobe, Mozilla, Opera (неофициально) и Microsoft. Yahoo вошла в игру, когда большинство решений по стандартам и возможностям были уже приняты, прислав Дугласа Крокфорда, влиятельного JavaScript-разработчика, который тут же раскритиковал большинство новшеств, получив мощную поддержку со стороны представителя Microsoft.

Оказалось, что у представителя Microsoft были точно такие же сомнения — он тоже считал, что язык становится слишком большим и выходит из-под контроля. Он ничего не говорил до моего присоединения к группе, так как боялся, что если Microsoft попытается выразить эту точку зрения, её обвинят в антиконкурентном поведении. Учитывая поведение Microsoft в прошлом, можно сказать, что у него были причины этого бояться, и как выяснилось, не безосновательные. Однако я убедил его, что Microsoft должна поступить правильно, и он, в свою очередь, смог убедить Microsoft изменить свою позицию относительно ES4.- Douglas Crockford — The State and Future of JavaScript

То, что началось как сомнения, быстро переросло в сильную оппозицию к JavaScript. Microsoft наотрез отказывалась утверждать любую часть ECMAScript 4 и была готова к любым действиям, включая судебные тяжбы, чтобы не дать стандарту возможности быть утвержденным. К счастью, члены комитета смогли избежать судебных разбирательств. Однако из-за разногласий ECMASCript 4 продолжал топтаться на месте.

Microsoft хотела играть по-крупному. Люди в Microsoft собирались завалить комитет бумажной волокитой и начать подавать жалобы в различные инстанции. Я не хотел ничего такого. Мои разногласия с ES4 были исключительно техническими, и я хотел, чтобы они таковыми и оставались. Я хотел разобраться, как всё сделать правильно, поэтому я старался уменьшить напряжение. Тем не менее Microsoft заняли бескомпромиссную позицию, наотрез отказываясь принимать любую часть ES4, из-за чего комитет разбился на два лагеря. Хотя лично мне кажется, что это произошло потому, что команда ES4 не желала рассматривать альтернативные точки зрения. В тот момент комитет раздирали противоречия, и это было очень плохо, так как группа, занимающаяся стандартами, должна пребывать в состоянии полного согласия. Стандарты не должны быть противоречивыми. — Douglas Crockford. — The State and Future of JavaScript

Крокфорд выступил с идеей о создании более простого, уменьшенного набора опций для нового стандарта, такого, с которым все могли бы согласиться: никакого нового синтаксиса, только практичные улучшения, основанные на опыте использования языка. Результатом этого предложения стал стандарт, известный, как ECMAScript 3.1.

В результате началась одновременная работа над двумя стандартами, для чего были созданы два неофициальных комитета. ECMAScript 4 по-прежнему был слишком сложным, споры вокруг него не утихали, и закончить его в ближайшее время не представлялось возможным. ECMAScript 3.1 был намного проще и, несмотря на разногласия в ECMA, работа над ним была успешно закончена.

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

Решения, принятые на этой встрече:

  1. сфокусироваться на работе над ES3.1 при полном сотрудничестве всех участников и выпустить две совместимые версии в начале следующего года;
  2. начать работу над следующим шагом после ES3.1, который будет включать в себя синтаксические расширения, но более скромные, нежели те, которые предлагались для ES4 как в плане семантических, так и синтаксических инноваций;
  3. ради всеобщего блага было решено отказаться от некоторых из предложений ES4: пакетов, пространства имен и ранней связки. Они были признаны бесполезными для веба. Это решение — ключ к Гармонии;
  4. прочие идеи и цели ES4 были перефразированы с целью достичь консенсуса внутри комитета, например, понятие классов, основанное на имеющихся концептах ES3, совмещённых с предлагаемыми улучшениями ES3.1.

В результате ушло почти восемь лет на то, чтобы закончить разработку ECMAScript 4. Тяжелый урок для всех, кто принимал участие.

Слово «Гармония», появившееся в перечисленных решениях, стало названием проекта в будущих версиях. Harmony станет альтернативой, с которой все будут согласны. После выхода ECMAScript 3.1 (в виде версии 5, как будет рассказано чуть ниже) ECMAScript Harmony стала тем местом, где обсуждаются все новые идеи относительно JavaScript.

ActionScript

ActionScript стал языком программирования, основанным на ранней версии ECMAScript 4. Adobe включил его в состав пакета инструментов для Flash-разработки, и это был единственный скриптовый язык, поддерживаемый этим пакетом. Благодаря этому языку Adobe выразила свою позицию относительно ECMAScript 4, впоследствии выпустив его open-source версию (Tamarin) в надежде ускорить разработку ECMAScript 4. Майк Чамберс, работник Adobe, выразил свою позицию по этому поводу:

ActionScript 3 никуда не денется, и мы не будем ничего из него убирать. Мы продолжим следить за развитием ECMAScript, делая всё возможное для дальнейшего развития интернета, как и прежде. — Mike Chamber’s blog

Разработчики ActionScript надеялись, что нововведения, использованные в этом языке, станут впоследствии частью ECMAScript. К сожалению, никто не обратил на них никакого внимания и ECMAScript 2015 был в большинстве своем несовместим с ActionScript.

Некоторые считали подобный ход попыткой Microsoft сохранить за собой контроль над языком и его реализациями. Единственным жизнеспособным движком для ECMAScript 4 на тот момент был Tamarin, поэтому Microsoft, занимавшая 80% рынка интернет-браузеров, могла продолжать использовать собственный движок без необходимости проводить дорогостоящую адаптацию под новый стандарт или пользоваться движком конкурента. Кто-то считал, что возражения Microsoft носили чисто технический характер, как у Yahoo. Движок Microsoft, JScript, на тот момент имел очень много отличий от других реализаций.

ActionScript по сегодняшний день остаётся языком для Flash, который начал терять популярность благодаря приходу HTML5.

ActionScript остаётся ярким примером того, как мог выглядеть ECMAScript 4, если бы он был реализован в популярных движках JavaScript:

Что такое E4X?

E4X — это название, которое получило расширение ECMAScript, выпущенное в годы разработки ECMAScript 4 (2004). Это название, стандартизированное в стандарте ECMA-357, расшифровывается, как ECMAScript for XML. E4X добавило в ECMAScript поддержку и отображение XML-содержимого. В E4X XML рассматривается как примитивный тип данных. Поначалу E4X получил поддержку крупных движков, таких, как SpiderMonkey, но затем был заброшен по причине низкой популярности и убран из 21 версии Firefox.

Кроме цифры 4 в названии, у E4X нет абcолютно ничего общего с ECMAScript 4.

Небольшой пример использования E4X:

Другие форматы данных, такие как JSON, пользовались значительно большей популярностью в сообществе JavaScript, поэтому E4X появился и исчез, не оставив практически никакого следа.

ECMAScript 5: перерождение JavaScript.

В 2008 году, после долгих боев, развернувшихся вокруг ECMAScript 4, сообщество сфокусировалось на работе над ECMAScript 3.1, отправив ECMAScript 4 на свалку. В 2009 году ECMAScript 3.1 был полностью завершён и одобрен всеми участниками комитета. Так как ECMAScript 4 считался своеобразным вариантом ECMAScript несмотря на отсутствие хоть какого-либо релиза, было решено переименовать ECMAScript 3.1 в ECMAScript 5, чтобы избежать недоразумений.

ECMAScript 5 стал одной из самых поддерживаемых версий JavaScript, став также целью компиляции многих транспайлеров. ECMAScript 5 получил полную поддержку в браузерах Firefox 4 (2011), Chrome 19 (2012), Safari 6 (2012), Opera 12.10 (2012) и Internet Explorer 10 (2012).

ECMAScript 5 был достаточно скромным улучшением ECMAScript 3, включавшим в себя:

  • Геттеры/сеттеры
  • Разделители-запятые в массивах и объектах
  • Возможность использовать зарезервированные слова в качестве свойств объекта
  • Новые методы объектов (create, defineProperty, keys, seal, freeze, getOwnPropertyNames и т.д.)
  • Новые методы массивов (isArray, indexOf, every, some, map, filter, reduce и т.д.)
  • String.prototype.trim и доступ к свойствам
  • Новые методы Date (toISOString, now, toJSON)
  • Привязывание функций
  • JSON
  • Неизменяемые глобальные объекты (undefined, NaN, Infinity)
  • Строгий режим
  • Другие небольшие изменения (parseInt игнорирует ведущие нули, функции в throw имеют значение и т.д.)

Ни одно из этих изменений не требовало внесения изменений в синтаксис. Геттеры и сеттеры в то время уже неофициально поддерживались некоторыми браузерами. Новые методы объектов должны были улучшить большое программирование, дав программистам больше инструментов для проверки соблюдения определённых инвариантов (Object.seal, Object.freeze, Object.createProperty). Строгий режим также стал мощным инструментом в этой области, позволив избежать большого числа ошибок. Дополнительные методы массивов улучшили определённые функциональные паттерны (map, reduce, filter, every, some. Ещё одним большим нововведением является JSON: формат данных, основанный на JavaScript, который теперь поддерживается нативно благодаря JSON.stringify и JSON.parse. Другие изменения касаются небольших улучшений, основанных на практическом опыте. В целом, ECMAScript 5 был небольшим улучшением, которое приукрасило JavaScript в плане юзабилити как для небольших скриптов, так и для более объемных проектов. Тем не менее, большое количество хороших идей, предлагавшихся для ECMAScript 4, так и не были реализованы и ждали своего возвращения в ECMAScript Harmony.

ECMAScript 5 получил обновление в 2011 году под названием ECMAScript 5.1. Этот релиз вносил ясность в некоторые неоднозначные пункты стандарта, но никаких новых возможностей в нем не было. Все новые возможности были запланированы для следующего большого релиза ECMAScript.