WebAssembly
- title
- WebAssembly
- type
- concept
- summary
- Портативная песочница и целевой формат компиляции: базовая спецификация, интерпретатор против AOT, fallback на wasm2js
- tags
- webassembly, sandboxing, compilers
- sources
- anubis-wasm-vendor-binary
- created
- 2026-07-21
- updated
- 2026-09-14
- lang
- ru
- translation_of
- webassembly
- source_updated
- 2026-09-14
- translated
- 2026-09-14
- translator
- lllm/antigravity/gemini-3.7-flash-medium
WebAssembly (Wasm) - это переносимый бинарный формат инструкций, созданный как цель для компиляции. Исходный код на C, C++, Rust, Go и других языках компилируется в модуль .wasm, после чего любой совместимый runtime исполняет его - в браузере, на сервере или будучи встроенным в другую программу. Важнее всего два свойства: переносимость (один и тот же модуль работает везде, где есть runtime) и изолированность (модуль имеет доступ только к той памяти и тем функциям, которые хост явно ему передал, поэтому запуск недоверенного Wasm внутри процесса - это надёжная граница изоляции, а не выстрел себе в ногу).
Поведение зафиксировано в спецификации WebAssembly Core Specification - стандарте W3C с редакциями 1.0 и 2.0. Runtime'ы заявляют, какую из них реализуют, а для проверки соответствия есть официальные наборы тестов. Поверх стандарта накладываются расширения: например, предложение WebAssembly Exceptions добавляет нативные инструкции для обработки исключений вместо ручной раскрутки стека, что критично для C++, где исключения используются постоянно. Runtime'ы и утилиты часто требуют явного включения подобных расширений (и wazero, и wasmtime требуют передать флаг для поддержки исключений).
Runtime'ы: интерпретатор против компилятора
Wasm-runtime исполняет модуль одним из двух способов. Интерпретатор напрямую разбирает байт-код: он работает на любой платформе, под которую собирается сам runtime, и не требует отдельного бэкенда под каждую архитектуру, но работает медленнее. AOT-компилятор (ahead-of-time) транслирует модуль в нативный машинный код при загрузке и затем выполняет его; обычно это на порядок быстрее, но генератор кода нужен под каждую процессорную архитектуру, поэтому список ограничен поддерживаемыми платформами (обычно amd64 и arm64). wazero, чистый Go-runtime, содержит оба варианта и по умолчанию выбирает компилятор там, где это возможно. До каких пределов можно оптимизировать интерпретатор, описано в wasmi-2-interpreter-engineering.
Fallback через wasm2js
Не любое окружение умеет исполнять Wasm - в браузере он может быть отключён. Утилита wasm2js из проекта binaryen рекомпилирует модуль Wasm обратно в JavaScript, позволяя запустить его везде, где работает JS. Результат медленнее нативного Wasm, но задача в итоге выполняется - в этом и смысл запасного варианта. Именно так устроен Anubis: логика проверки proof-of-work пишется один раз на Wasm, используется клиентом и сервером синхронно и кросс-компилируется в JS через wasm2js для браузеров с отключённым Wasm. Сама идея восходит к докладу The Birth and Death of JavaScript, где описывалось будущее, в котором всё компилируется в Wasm, а JS остаётся лишь целевой платформой компиляции последней надежды.
Запуск недоверенного кода
Изолированная песочница - причина, по которой Wasm применяется в инструментах для агентов и системах плагинов: хост-процесс может загрузить модуль и быть уверенным, что тот не прочитает произвольную память, не откроет файлы и не сделает сетевые запросы, если хост явно не пробросил эти возможности. Это делает Wasm одним из вариантов изоляции ИИ-агентов и других сценариев с недоверенным кодом наряду с более тяжёлой изоляцией вроде microVM и контейнеров.
wanix переворачивает эту схему. Вместо того чтобы хост выдавал модулю отдельные права, каждая задача получает пространство имён в стиле Plan 9 и видит ровно те файлы, которые в него примонтированы, - устройства, терминалы, удалённые файловые системы и всё остальное. Песочница и механизм, через который программа читает файлы, становятся одним и тем же примитивом, что компонуется лучше, чем список preopen-директорий.
Связанные страницы
- wazero - pure-Go Wasm-runtime без зависимостей
- wasmi-2-interpreter-engineering - как интерпретатор Wasm на Rust сокращает отставание: threaded dispatch, регистры-аккумуляторы, схема экземпляров на уровне модулей
- anubis-wasm-vendor-binary - Wasm proof-of-work с fallback'ом на wasm2js и борьба за воспроизводимость при вендоринге wasm2js
- sandboxing-ai-agents - Wasm как один из уровней изоляции среди прочих
- wasmer - противоположность wazero: нативный runtime с несколькими бэкендами, собственным реестром пакетов и WASIX, расширяющим WASI потоками и сокетами
- adding-go-to-a-browser-code-runner - почему очевидный путь
GOOS=js GOARCH=wasmне подходит для запуска Golang в браузерной песочнице и что вместо этого даётGOOS=wasip1 - cut-it-out - прикладной пример: модель сегментации ONNX, работающая прямо на странице, благодаря чему изображения не покидают браузер
- foundation-framework - Wasm как декларируемый вычислительный слой внутри contract-first full-stack-платформы наряду с Golang и TypeScript