От автора: я попробовал загуглить «разница между JS и ECMAScript». В итоге мне пришлось разгребать море двусмысленных и, казалось бы, противоречивых результатов…
«ECMAScript — стандарт», «JS — стандарт», «ECMAScript — спецификация», «JS – реализация стандарта ECMAScript», «ECMAScript – язык», «JS – диалект ECMAScript», «ECMAScript – это JS»…
Сдерживая проступающие слезы, я решил разобраться в этом вопросе.
Эта статья представляет мое текущее понимание того, чем отличается язык скриптов JavaScript от ECMAScript. Статья предназначена для людей, которые знают JS, но хотели бы четче понять его связь с ECMAScript, веб-браузерами, Babel и т.д. Также вы узнаете о языках скриптов, движках JS и о времени выполнения JS. В общем, приготовьтесь.
Словарь JS/ECMAScript
Ниже приведен список определений, разработанных с упором на согласованность и четкость. Определения не 100% конечны, они созданы, чтобы предоставить высокий уровень понимания связи и отношения JS и ECMAScript. Без разглагольствований начнем.
Ecma International
Организация, создающая стандарты для технологий.
Чтобы проиллюстрировать пример «стандарта» (но не от Ecma), подумайте обо всех клавиатурах, которыми вы пользовались. На подавляющем большинстве клавиши были расположены в одном порядке, был пробел, клавиша enter, стрелки и числа в верхней части? Все это потому, что большинство производителей клавиатур разрабатывают дизайн на основе стандарта макета QWERTY.
ECMA-262
Стандарт, опубликованный Ecma International. Он содержит спецификацию для общего языка сценариев.
ECMA-262 – стандарт, как QWERTY, но вместо спецификации макета клавиатуры он представляет спецификацию языка сценариев под названием ECMAScript. Думайте о ECMA-262, как о ссылочном номере на ECMAScript.
Язык сценариев
Язык программирования, спроектированный специально для работы с существующей системой.
Чтобы понять, что делает язык программирования языком сценариев, представьте команды «ходить», «бегать» и «прыгать». Для выполнения этих действий нужен какой-то объект, возможно, человек, собака или персонаж компьютерной игры. Без объекта, выполняющего команды «ходить», «бегать» и «прыгать», эти команды не имеют смысла. Этот набор действий аналогичен языку сценариев, который сосредоточен на манипулировании внутренними сущностями.
ECMAScript
Спецификация, описанная в ECMA-262, для создания общего языка сценариев. Синоним: спецификация ECMAScript
Так как ECMA-262 – название стандарта, то оно представляет спецификацию языка сценариев ECMAScript. ECMAScript предоставляет правила, детали и руководящие принципы, которые должен соблюдать язык сценариев, чтобы быть совместимым ECMAScript.
JavaScript
Общий язык сценариев, совместимый со спецификацией ECMAScript. Это диалект языка ECMAScript.
JS – кофейный язык, на котором я очень люблю программировать. ECMAScript – спецификация, на которой он основан. Прочитав спецификацию ECMAScript, вы узнаете, как создать язык сценариев. Прочитав документацию JavaScript, вы узнаете, как использовать язык сценариев.
Когда люди говорят, что JS – диалект языка ECMAScript, они имеют в виду то же самое, что и для диалектов английского, французского или китайского. Диалект берет большую часть своей лексики и синтаксиса от родительского языка, но имеет достаточно много отклонений, чтобы считаться отдельным языком.
По большей части JS реализует спецификацию ECMAScript, как описано в ECMA-262, но в нем есть немного изменений. Mozilla описывает функции JS, не удовлетворяющие языку ECMAScript, здесь:
Движок JS
Программа или интерпретатор, понимающий и выполняющий код JS. Синонимы: интерпретатор JS, реализация JS
JS движки, по большей части, можно найти в браузерах. Это V8 в Chrome, SpiderMonkey в firefox и Chakra в Edge. Каждый движок похож на модуль языка для его применения, который позволяет поддерживать определенную часть языка JS.
Движок JS для браузера похож на механизм понимания языка у человека. Если вернуться к примеру с действиями ходить, бегать и прыгать, то движок JS является частью «сущности», которая понимает, что эти действия значат.
С помощью этой аналогии можно объяснить пару вещей о браузерах:
Разница в производительности браузеров
Два человека могут знать команды прыгать, но один может отреагировать на нее быстрее, потому что он понимает и выполняет команду быстрее другого. Точно так же два браузера могут понимать код JS, но один браузер запускает его быстрее, так как его движок JS реализован более эффективно.
Разница в поддержке браузеров
Между людьми, говорящими на одном языке, есть различия. Даже если очень много людей говорят на английском, некоторые могут знать слова, выражения и синтаксис, который другие не знают, и наоборот. С браузерами все так же. Даже если движки JS всех браузеров понимают JS, некоторые браузеры понимают язык лучше других. Разница заключается в самом способе поддержки языка браузерами.
С точки зрения поддержки в браузерах люди обычно говорят о «совместимости с ECMAScript», а не о «совместимости с JS», несмотря на то, что движки JS парсят и выполняют… JS код. Это может немного запутать, но на все есть свое объяснение.
Если вспомнить, то ECMAScript – спецификация языка сценариев. Релиз новой версии ECMAScript не означает, что все движки JS внезапно станут поддерживать эти новые функции. Все зависит от групп или организаций, ответственных за обновление движков JS до последней спецификации ECMAScript и применение изменений.
Поэтому разработчики, как правило, спрашивают «какую версию ECMAScript поддерживает этот браузер?» или «какие функции ECMAScript поддерживает этот браузер?» Они хотят узнать, удалось ли Google, Mozilla и Microsoft обновить движки JS браузеров – например, V8, SpiderMonkey и Chakra – до функций, описанных в последней спецификации ECMAScript.
Таблица совместимости ECMAScript ответит на эти вопросы.
Если выходит новая версия ECMAScript, движки JS не интегрируют все обновление разом. Они подключают новые функции ECMAScript постепенно, что видно из выдержки лога изменений firefox JS:
Время выполнения JS
Окружение, в рамках которого запускается и интерпретируется код JS движком. Время выполнения предоставляет объекты, с которыми Js может оперировать и работать. Синонимы: хост-среда
Время выполнения JS – это и есть «существующая сущность или система», о которой говорится в определении языка сценариев. Код проходит через движок JS, и после парсинга и распознавания сущность или система выполняет интерпретируемые действия. Собака идет, человек бежит, персонаж компьютерной игры прыгает (или как на скриншоте выше ломает).
Приложения становятся доступны для сценариев JS, предоставляя хост-объекты во время выполнения. Со стороны клиента время выполнения JS – это браузер, где хост-объекты типа window, HTML document становятся доступны для манипуляций.
Вы когда-нибудь работали с хост-объектами window или document? Объекты window и document, на самом деле, не являются частью ядра языка JS. Это Web API, объекты, предоставляемые браузеров, действующим как хост-среда JS. Со стороны сервера время выполнения JS – это Node.js. Серверные хост-объекты типа файловой системы, процессов и запросов хранятся в Node.js.
Интересный момент: разные времена выполнения JS могут делить один движок JS. Например, V8 – движок JS, используемый в Google Chrome и Node.js – два крайне разных окружения.
ECMAScript 6
Шестая версия стандарта ECMA-262, основные изменения и улучшения функций в спецификацию ECMAScript. Синонимы: ES6, ES2015 и ECMAScript 2015
Версия ECMAScript, сменившая название с ES6 на ES2015, так как 2015 Ecma International решила переключиться на ежегодные релизы ECMAScript. Точно так же Ecma International начали по-новому именовать новые версии спецификации ECMAScript по году выпуска. Если коротко, ES6 и ES2015 – это два разных названия одной спецификации.
Babel
Транспайлер, конвертирующий код ES6 в код ES5.
Разработчики могут использовать новейшие функции ES6, но беспокоиться о кроссбраузерной поддержке своих приложений. На момент написания статьи edge и IE не полностью поддерживают функции из спецификации ES6.
Обеспокоенные разработчики могут конвертировать свой код ES6 в функционально эквивалентную версию ES5 с помощью Babel. Все основные браузеры полностью поддерживают ES5, поэтому код будет запускаться без проблем.
Еще одна интересная вещь
Надеюсь, информация о JS и ECMAScript была вам полезна. Прежде чем мы закончим, хотелось бы поделиться еще кое-чем, что необходимо прояснить начинающим разработчикам, как я.
Курица или яйцо
Запутанная история. JS был создан в 1996. Затем он был предложен в Ecma International на стандартизацию в 1997, что вылилось в ECMAScript. В то же время так как JS соблюдает спецификацию ECMAScript, то JS является примером реализации ECMAScript.
Мы получаем забавный факт: ECMAScript основан на JS, а JS основан на ECMAScript. Знаю. Похоже на путешествия во времени, когда люди становятся родителями сами себе. Ненадежно, но забавно.
Все хорошее
Все мы хорошо повеселились, и очень много информации необходимо усвоить. Здесь я попрощаюсь. Огромное спасибо за чтение!
Автор: Michael Aranda
Источник: //medium.freecodecamp.org/
Редакция: Команда webformyself.