Поддерживаемые версии ECMAScript

Архитектура трансформаций SWC ориентирована на строгую привязку к спецификациям ECMAScript и их эволюции. Поддержка языковых стандартов реализуется через систему парсинга, AST-представление и набор преобразований, которые могут быть включены или отключены в зависимости от целевой версии JavaScript.

Модель совместимости ECMAScript

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

Ключевой особенностью является разделение:

  • синтаксической поддержки (парсинг новых конструкций)
  • семантических трансформаций (преобразование новых возможностей в старые конструкции)
  • генерации кода под заданный target

Такой подход позволяет поддерживать несколько поколений ECMAScript без необходимости дублирования логики компиляции.

Поддерживаемые поколения ECMAScript

ES3 и ES5

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

  • функции стрелочного типа преобразуются в function expressions
  • классы транслируются в прототипную модель
  • модули преобразуются в CommonJS при соответствующей настройке
  • строгий режим ES5 учитывается при генерации кода

ES5 рассматривается как минимальная целевая версия для большинства legacy-сценариев.

ES2015 (ES6)

Поддержка ES2015 является фундаментальной для большинства проектов. Внутри SWC этот уровень включает трансформации:

  • let и constvar (при необходимости по target)
  • классы → функции-конструкторы с прототипами
  • шаблонные строки → конкатенация или оптимизированные строки
  • деструктуризация → последовательные присваивания
  • параметры по умолчанию → явные проверки undefined
  • spread/rest → вспомогательные операции над массивами

Особое внимание уделяется сохранению семантики областей видимости и временной мёртвой зоны (TDZ), что влияет на точность преобразований.

ES2016–ES2019

Этот диапазон включает относительно небольшие синтаксические изменения, которые в SWC реализуются через точечные трансформации:

  • оператор возведения в степень **Math.pow
  • async/await → генераторы с runtime-обвязкой (в зависимости от конфигурации)
  • улучшенные возможности объектов (Object spread/rest)
  • optional catch binding (без параметра catch)

Async-функции требуют дополнительной поддержки runtime, так как преобразование затрагивает управление потоком выполнения.

ES2020

ES2020 добавляет более сложные конструкции, требующие расширенной трансформационной логики:

  • optional chaining (?.) → условные проверки цепочек свойств
  • nullish coalescing (??) → проверка на null и undefined
  • dynamic import → преобразование в совместимый формат модулей при необходимости
  • BigInt → частично поддерживается на уровне парсинга, но трансформация зависит от окружения

Optional chaining и nullish coalescing являются одними из наиболее часто используемых преобразований в современных пайплайнах SWC.

ES2021–ES2024

Современные версии ECMAScript в SWC поддерживаются по мере стабилизации спецификаций. Подход основан на инкрементальном добавлении синтаксических возможностей:

  • logical assignment operators (&&=, ||=, ??=)
  • numeric separators
  • private class fields и методы
  • top-level await (в модульном контексте)
  • статические блоки классов
  • новые методы массивов и объектов

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

Целевая трансформация (target)

Ключевой механизм управления поддержкой ECMAScript — параметр целевой версии. Он определяет глубину трансформации кода.

Типичная логика:

  • если target >= ES2017 — async/await может не преобразовываться
  • если target >= ES2020 — optional chaining может сохраняться
  • если target <= ES5 — применяется максимальная деградация синтаксиса

SWC использует стратегию минимально необходимого преобразования, избегая лишней генерации вспомогательного кода.

Связь парсера и трансформеров

Поддержка ECMAScript в SWC не ограничивается трансформацией. Парсер должен уметь корректно распознавать синтаксис даже при отсутствии включённых трансформаций.

Это приводит к разделению:

  • parser stage: понимание синтаксиса всех поддерживаемых версий
  • transform stage: адаптация под target environment
  • codegen stage: генерация финального JavaScript

Такой pipeline позволяет обрабатывать код будущих версий ECMAScript без немедленной трансформации.

Конфигурация поддержки ECMAScript

Поведение задаётся через конфигурационные файлы, где ключевую роль играет параметр целевой среды:

  • выбор версии ECMAScript target
  • включение отдельных трансформаций (decorators, class fields)
  • управление модульной системой (ESM, CommonJS)
  • включение полифиллов через внешние инструменты

Гранулярность настроек позволяет адаптировать компиляцию под разные окружения: браузеры, Node.js, серверные рантаймы и embedded-системы.

Особенности реализации синтаксических расширений

Некоторые конструкции ECMAScript требуют не только синтаксического анализа, но и изменения структуры выполнения:

  • decorators влияют на метаданные классов
  • private fields требуют скрытого хранения состояния
  • async iteration изменяет модель итераторов
  • generators требуют state machine трансформации

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

Совместимость с экосистемой

Поддержка ECMAScript в SWC ориентирована на совместимость с инструментами сборки и рантаймами:

  • интеграция с bundlers (например, webpack, turbopack)
  • совместимость с Node.js LTS-ветками
  • поддержка современных браузеров без лишних трансформаций
  • возможность замены Babel в большинстве сценариев

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

Поведение при нестабильных спецификациях

Некоторые предложения ECMAScript находятся в стадии proposal. SWC обрабатывает их через:

  • stage-based поддержку (Stage 0–4)
  • экспериментальные флаги
  • изоляцию нестабильных трансформаций

Такой подход предотвращает нарушение обратной совместимости при изменениях спецификации.