EnglishРусский Map

WebAssembly

title
WebAssembly
type
concept
summary
Портативная песочница и целевой формат компиляции: базовая спецификация, интерпретатор против AOT, fallback на wasm2js
tags
webassembly, sandboxing, compilers
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
Sub-pages