Перейти к основному содержимому
Chapter content StyleChapter Difficulty13 min

«Even if you know JavaScript, reading its language specification ... can be pretty daunting».

Marja Hölttä,

v8 blog, 20201

Глава 3.0: Начало языка

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

Содержание

Немного теории

Для того, чтобы понять язык, мы должны разобрать его на смысловые части, из которых он состоит. Так, например, у нас есть буквы, которые складываются в слова, или одна буква уже может быть словом; слова складываются в словосочетания или предложения (например, предложение из одного слова); предложения складываются в абзац, а они — в текст, если мы будем дальше продолжать эту цепочку.

Для понятного построения всех вышеперечисленных контрукций необходимы какие-то границы и правила, а иначе мы получим безграничное количество слов и впоследствии — предложений, которые технически будут состоять из известных нам букв, но никто не поймёт их смысла. Чтобы придать этот самый смысл, необходимо следовать каким-то правилам, например, грамматике языка. Обратимся к определнию слова "грамматика":

In linguistics, a grammar is the set of rules for how a natural language is structured, as demonstrated by its speakers or writers. Grammar rules may concern the use of clauses, phrases, and words. The term may also refer to the study of such rules, a subject that includes phonology, morphology, and syntax, together with phonetics, semantics, and pragmatics.

~ wiki

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

Следите за руками

Итак, введём два основных направления разговора.

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

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

An interesting fact...

После выхода версии ES3 следующей версией оказалась ES5. Так уж вышло, что разные компании имели свои рычаги давления на комитет TC39. Вышедшая в 1999 году первая версия ES4 создала большое противоборство сил влияния.

Со многими исправлениями были не согласны, в частности компания Microsoft имела много претензий к вновь вышедшему стандарту. Хотя эти новаторские изменения всё равно были удовлетворены в будущем, в 2008 году было принято в качестве следующего этапа переименовать редакцию ES3 в ES5.

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

Второе направление — язык спецификации ECMAScript. Проще говоря, вместо того, чтобы сразу изучать язык ECMAScript, мы вынуждены изучать язык спецификации, описывающий сам язык ECMAScript. То есть целых 2 языка вместо одного. Таков путь выбрал в своё время комитет TC39 и пока не собирается менять курс.

К делу

Без знаний ЯЗЫКА СПЕЦИФИКАЦИИ ECMAScript нам не удастся правильно прочитать СПЕЦИФИКАЦИЮ ЯЗЫКА ECMAScript. То есть в этой главе мы будем изучать грамматику языка спецификации. Не путать с синтаксисом (часть грамматики). Вся сложность спецификации ECMAScript заключается лишь в том, что она написана отдельным языком, разработанным на страницах этой же спецификации. Это порождает абсолютную путаницу среди разработчиков других сфер, где такого экзотического явления не наблюдается.

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

Как тогда быть?

К счастью (или к сожалению), способы передачи информации не стоят на месте. Для экстремально усложнённой спецификации, какой она ещё не была на момент создания, но стала в текущее время, появилось множество решений "быстрого" обхода непонятных почти всем её конструкций. Такими темпами современное комьюнити дошло до того, что в интернете и жизни появилось бесконечно много "искаверканых" интерпретаций, в которых не просто забыли об основах языка, а изменили их под свои нужды удобного объяснения и быстрого вывода "специалиста" на рынок. Например, почти ни в одной из известных коммерчески успешных интерпретаций вы не услышите такого понятия, как Record, вокруг которого построен весь язык.

И кстати, с точки зрения бизнеса всё пошло в гору. На рынок выплюнуло много специалистов с хорошими знаниями интерпретаций языка ECMAScript. Все как будто убедили себя, что он такой и есть. Люди, пришедшие с других языков, стали экспертами по созданию всё новых и новых интерпретаций вплоть до того, что из полностью компилируемых языков, таких как C++ и др., безнаказанно перетянули почти всё в скриптовые, такие как наш JavaScript. Но так ли полезны все эти интерпретации языка? Что ещё в них есть такое, кроме быстроты обучения?

Ляпы интерпретаций

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

  1. Почти всё описано терминами из других языков. "Примитивные типы (primitive data type)", "боксинг (boxing)", "переменные (variable)" и другие термины пришли в JavaScript "со стороны".

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

  3. Отличные от других языков техники, которые не получается описать просто в рамках какой-либо интерпретации, названы "ошибкой" или "магией" языка JavaScript. Например, утверждение: typeof null выводит в консоль строку object, а не null, потому что это якобы ошибка языка2.

  4. Упрощение, упрощение и ещё раз упрощение. Попытки сократить, опустить и переписать оригинальную спецификацию допустимы, но не в таких объёмах, как это сделано сейчас в коммерчески успешных интерпретациях. Это заставляет людей учить сначала далёкую от реальности интерпретацию, а потом всё равно с опытом приходить к оригинальной спецификации и учить уже её.

И так далее...

А как же эта интерпретация?

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

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

К выводу

Давайте подытожим эту главу, как первую и пока наиболее близкую к реальности с технической стороны.

  • Для того чтобы понять спецификацию языка ECMAScript, необходимо сначала понять язык спецификации ECMAScript. И никак иначе!
  • В современном мире был выбран курс на интерпретирование спецификации так, как кому-либо выгодно. Это породило бессчётное количество интерпретаций в тысячах онлайн-школах и курсах, готовых коммерчески продвигать "свой JavaScript" в массы. Встаёт вопрос о том, что стоит за такими интерпретациями: пустые слова ради денег или сложные термины со ссылками на первоисточники?
  • Согласно этой документации, мы будем развивать свою собственную интерпретацию спецификации, максимально близкую к первоисточнику со всеми возможными ссылками и возможностью проверки и редактирования представленной в ней информации.
  • Рано или поздно любая интерпретация станет недостаточной при решении ряда сложных задач оптимизации. Так что за нахождением решения необходимо идти в саму спецификацию.

Footnotes

  1. Цитата специалиста компании Google из статьи блога инженеров V8.

  2. Это полностью неверное утверждение, коих в нашем мировом информационном поле уже много. Они будут разобраны в следующих главах.