Существует множество различных реализаций JavaScript. Как подходит ECMAScript?

ECMAScript - это JavaScript, но название ECMAScript указывает на тот факт, что Европейская ассоциация производителей компьютеров (ECMA) является руководящим органом, контролирующим спецификацию. Это сложнее, и в конечном итоге на спецификацию влияет сообщество в целом, но именно отсюда и произошло название.

Однако путаница по поводу того, какое имя использовать, является результатом проблем с брендом и товарным знаком (не). Рекомендуется использовать JS, а не JavaScript или ES20 ##. Мы используем JS, потому что он обходит проблему (не) торговой марки, и ES20 ##, потому что, начиная с ES2016, это правильный способ ссылаться на спецификацию.

При этом мы знаем, что говорим о следующем.

… Объектно-ориентированный язык программирования для выполнения вычислений и управления вычислительными объектами в среде хоста.

Несмотря на то, что все мы знаем, как писать JS, я хочу дать общий взгляд на спецификацию; как разработан язык и объем спецификации. Для этого я приведу некоторый исторический контекст и сделаю ссылку на некоторые вводные абзацы из самой спецификации.

История происхождения ECMAScript

Брендан Эйх - создатель JavaScript. Он разработал язык в Netscape для их браузера Navigator 2.0. В конце концов, Генеральная ассамблея Ecma в июне 1997 года приняла первое издание, которое позже было переработано во втором издании в 1998 году.

В 2002 году вышло третье издание. Это издание, когда язык начал получать широкое распространение.

Сегодня этот язык принят практически всеми браузерами.

Механизмы ECMAScript

Нет единственной реализации JS. В каждом браузере может быть своя собственная реализация механизма ECMAScript.

Итак, чем же могут отличаться движки ECMAScript друг от друга?

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

Например, Array.prototype.sort должен быть стабильным алгоритмом сортировки, но не обязательно конкретным алгоритмом сортировки. Это означает, что у каждого браузера может быть разница в том, сколько времени и памяти потребляет алгоритм сортировки.

В других случаях стандарт предполагает очень специфическую функциональность. Например, каждый движок должен будет правильно преобразовать следующее выражение typeof null в "object", даже если изначально это была ошибка.

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

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

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

Хотя у расширения спецификации есть свои границы.

Соответствующая реализация ECMAScript не должна реализовывать какое-либо расширение, указанное как Запрещенное расширение в подпункте 16.2.

Это имеет смысл, потому что полностью расширяемый стандарт, честно говоря, вовсе не стандарт.

Хост-среды

Если вы когда-нибудь слышали о Node.js, то знаете, что JS используется не только в браузерах. Вот почему описание JS включает эту общую фразу.

… В среде хоста.

Эта фраза также не требует от среды хоста запуска JS. Ниже приводится более подробное описание того, как предполагается использовать JS.

ECMAScript, как здесь определено, не предназначен для вычислительной самодостаточности ...

Итак, мы обычно думаем, что среда хоста - это браузер, но это может быть Node.js или что-то еще. Дело в том, что должен быть хозяин.

Имейте в виду, что хост не определяется спецификацией. Другими словами, среда хоста абстрагируется.

[Среда хоста]… будет предоставлять не только объекты и другие возможности, описанные в этой спецификации, но также определенные объекты, относящиеся к среде, описание и поведение которых выходят за рамки данной спецификации, за исключением того, чтобы указать, что они могут предоставлять определенные свойства, которые могут быть доступ и определенные функции, которые могут быть вызваны из программы ECMAScript.

Подводя итог всему сказанному, мы должны иметь среду хоста, которая следует определенному интерфейсу, чтобы JS и хост могли «разговаривать» друг с другом. Подумайте о доступе к DOM через ваш javascript. Это конкретная реализация того, о чем мы говорим, но хороший пример того, как JS общается с хостом.

Заключение

Я надеюсь, что это поможет построить более полную мысленную модель того, как JS подключается к браузерам, Node.js и любой другой среде хоста. Это должно помочь объяснить, почему могут быть различия между разными движками, а также между пакетами JS.