Вы когда-нибудь задумывались, что произойдет, если вы попытаетесь запустить программу JS, написанную в 1997 году, в среде ES2020? Или, может быть, вы хотели бы знать, сможете ли вы запустить программу, совместимую с ES2020, в среде 10-летней давности? Если да, то в этом посте я хотел бы познакомить вас с темой совместимости языка JavaScript.

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

Обратная совместимость означает, что среда JS, поддерживающая данную спецификацию, должна иметь возможность запускать программу, совместимую с любой предыдущей или той же спецификацией (конечно, пока эта программа лишена критических ошибок). Это означает, что любое изменение, единожды принятое как часть официальной спецификации, должно оставаться в языке навсегда. Я написал «следует», потому что из этого правила есть некоторые исключения, но их влияние на сеть тщательно контролируется и оценивается с точки зрения преимуществ и потенциальных угроз. Таким образом, если программа была написана правильно в прошлом (даже в 1997 году), она должна работать без ошибок и в современных средах.

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

Хорошо, но как современные среды должны запускать «последующие» программы, содержащие фрагменты кода, несовместимые с текущей спецификацией? Это возможно в случае технологий декларативного характера (таких как HTML или CSS), где пропуск неизвестных фрагментов оказывает минимальное влияние на другие объявления. В случае JS невозможно пропустить неизвестные части кода, потому что нельзя гарантировать, что эти части не понадобятся где-либо еще в программе. Таким образом, нет гарантии, что программа, совместимая с ES2020, будет корректно работать в среде ES2015. Наиболее распространенные ошибки, которые вы можете ожидать, связаны с неизвестным синтаксисом или нераспознаваемым API.

Чтобы предотвратить синтаксические ошибки, мы можем использовать инструмент под названием транспайлер (отличный пример — Babel) для перевода синтаксиса из более новой спецификации в более старую. Это означает, что если мы хотим, чтобы наша программа работала в среде ES2015, мы должны использовать транспилятор для перевода нашего исходного кода в среду, совместимую с ES2015. Проблемы API, с другой стороны, могут быть решены с помощью шаблона полифилла, что означает, что наша программа предоставит целевой среде неизвестные определения API (например, через цепочку прототипов). Таким образом, мы можем изучить целевую среду тех элементов API, которые отсутствуют в старой спецификации. Часто транспилятор сам может автоматически определять, какие полифилы требуются целевой среде, и предоставляет их в процессе генерации выходного кода.

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

Спасибо за уделенное время. Я надеюсь, что этот короткий пост помог вам лучше понять совместимость языка JS. Увидимся в моих следующих постах.

Источник: https://github.com/getify/You-Dont-Know-JS/blob/2nd-ed/get-started/ch1.md