Плагины на Rust vs плагины на Wasm

В экосистеме SWC расширяемость строится вокруг двух основных подходов: нативные плагины на Rust и плагины на WebAssembly (Wasm). Оба механизма решают задачу модификации AST (Abstract Syntax Tree), трансформации кода и внедрения пользовательской логики в процесс компиляции, но отличаются уровнем доступа к внутренностям компилятора, моделью исполнения и эксплуатационными характеристиками.

SWC изначально написан на Rust, поэтому плагинная система естественным образом тяготеет к нативным расширениям. Однако необходимость безопасного и переносимого расширения функциональности привела к появлению Wasm-слоя, ориентированного на изоляцию и кроссплатформенность.


Нативные плагины на Rust

Уровень интеграции с компилятором

Rust-плагины работают внутри одного адресного пространства с самим SWC. Это означает прямой доступ к внутренним структурам компилятора:

  • AST без промежуточной сериализации
  • типизированные структуры swc_ecma_ast
  • механизмы прохода по дереву (Visit, Fold)
  • контексты трансформации и конфигурации компиляции

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

Производительность

Основное преимущество нативных плагинов заключается в отсутствии границ межпроцессного взаимодействия:

  • отсутствует сериализация AST
  • отсутствует маршалинг данных
  • отсутствует sandbox-обертка

Компилятор вызывает функции плагина напрямую, что делает Rust-расширения оптимальными для:

  • сложных трансформаций TypeScript
  • оптимизаций JavaScript-кода
  • анализа больших AST
  • кодогенерации на уровне билд-систем

Типовая модель реализации

Нативные плагины используют стандартные трейты SWC:

  • VisitMut для мутаций AST
  • Fold для функциональных преобразований
  • Visit для анализа

Пример логики (концептуально):

  • обход дерева
  • проверка узлов Expr, Stmt, ModuleItem
  • изменение структуры или вставка новых узлов

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


Управление зависимостями

Rust-плагины компилируются вместе с SWC или подключаются как crate-зависимости. Это создает следующие свойства:

  • строгая типизация на уровне компиляции
  • возможность использования любых Rust-библиотек
  • отсутствие ограничений песочницы

Однако такая модель усиливает связанность с версией SWC, поскольку изменения AST API могут требовать обновления плагина.


Ограничения нативных плагинов

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

  • отсутствие безопасной изоляции
  • невозможность выполнения в браузере или edge-окружениях
  • необходимость перекомпиляции при обновлениях SWC
  • потенциальная нестабильность ABI при изменениях внутренних структур

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


Плагины на WebAssembly

Модель исполнения

Wasm-плагины выполняются в изолированной виртуальной машине. SWC взаимодействует с ними через слой хост-рантайма, который:

  • сериализует входной AST или его подмножество
  • передает данные в Wasm-модуль
  • получает обратно преобразованный результат

В отличие от Rust-плагинов, здесь существует четкая граница между компилятором и расширением.


Безопасность и изоляция

Ключевая особенность Wasm-модели — sandbox-исполнение:

  • отсутствие прямого доступа к памяти SWC
  • ограниченные системные вызовы
  • контролируемое потребление ресурсов

Это делает Wasm-плагины применимыми в сценариях:

  • онлайн-компиляции кода
  • серверлесс-окружениях
  • пользовательских расширениях в SaaS-платформах
  • небезопасных или недоверенных плагинах

Производительность и накладные расходы

Главный компромисс Wasm-подхода заключается в стоимости взаимодействия:

  • сериализация AST или его фрагментов
  • копирование данных между хостом и Wasm-рантаймом
  • ограничения на использование памяти
  • отсутствие нативных оптимизаций компилятора

Даже при оптимизированных структурах обмена данными Wasm-плагины уступают Rust по скорости трансформаций, особенно на больших проектах.


API и ограничения среды

Wasm-плагины работают в ограниченной среде:

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

Логика плагина строится вокруг предоставленного API SWC, который обычно включает:

  • функции обхода AST
  • методы трансформации узлов
  • утилиты сериализации

Такой дизайн обеспечивает переносимость, но ограничивает сложность операций.


Преимущества переносимости

Главное достоинство Wasm-плагинов — независимость от платформы:

  • одинаковое поведение на Node.js, Deno, браузере
  • отсутствие необходимости в компиляции Rust toolchain
  • возможность распространения как бинарного артефакта

Это особенно важно для плагинов, распространяемых как часть npm-пакетов или облачных сервисов.


Сравнение моделей исполнения

Интеграция с AST

Rust:

  • прямой доступ к структурам
  • работа с оригинальными типами SWC
  • минимальные преобразования данных

Wasm:

  • работа через сериализованные структуры
  • часто упрощенное представление AST
  • необходимость конвертации форматов

Производительность

Rust:

  • близка к нативной
  • отсутствие копирования данных
  • оптимизация компилятором Rust

Wasm:

  • зависимость от runtime
  • overhead на передачу данных
  • ограниченная оптимизация вычислений

Безопасность

Rust:

  • отсутствует изоляция
  • полный доступ к памяти процесса
  • потенциальные риски при сторонних плагинах

Wasm:

  • sandbox-модель
  • строгие ограничения ресурсов
  • безопасное выполнение недоверенного кода

Совместимость и переносимость

Rust:

  • жесткая привязка к версии SWC
  • необходимость пересборки
  • зависимость от toolchain

Wasm:

  • переносимость между окружениями
  • независимость от архитектуры CPU
  • простая дистрибуция

Архитектурные сценарии применения

Инфраструктурные трансформации

Для задач уровня компиляции:

  • tree-shaking сложных модулей
  • оптимизация bundle-структур
  • трансформация TypeScript в высоконагруженных сборках

преимущественно используется Rust-модель. Она обеспечивает минимальные задержки и максимальную гибкость.


Пользовательские расширения

Для сценариев, где код плагина может быть поставлен извне:

  • пользовательские трансформации в редакторах
  • расширения SaaS платформ
  • интеграции в CI/CD без доверенной среды

Wasm-плагины обеспечивают безопасное выполнение и изоляцию.


Гибридные подходы

В ряде архитектур применяется комбинированная модель:

  • Rust реализует ядро трансформаций
  • Wasm выступает как слой пользовательских хуков
  • данные проходят через промежуточный IR

Это позволяет объединить производительность нативного кода и безопасность песочницы.


Стоимость абстракции и границы применимости

Каждый уровень абстракции в плагинной системе SWC добавляет накладные расходы:

  • Rust минимизирует абстракции, но увеличивает сложность сопровождения
  • Wasm увеличивает безопасность, но снижает производительность

Выбор модели определяется не только техническими характеристиками, но и характером среды исполнения:

  • контролируемая инфраструктура склоняется к Rust
  • распределенные или недоверенные среды требуют Wasm

Влияние на эволюцию экосистемы SWC

Разделение плагинов на Rust и Wasm формирует двухуровневую архитектуру расширений:

  • ядро компилятора остается высокопроизводительным и нативным
  • внешняя экосистема расширяется через безопасный интерфейс Wasm

Такое разделение позволяет одновременно поддерживать:

  • высокую скорость сборки крупных проектов
  • расширяемость через сторонние модули
  • безопасную интеграцию пользовательских сценариев