Инструменты: WABT, wasmtime, рантаймы

Собираем рабочий набор инструментов для работы с Wasm.

WABT (WebAssembly Binary Toolkit) — это набор утилит для перевода, проверки и анализа Wasm-модулей.

WABT: швейцарский нож

WABT — базовый набор для ручной работы с Wasm. Главные утилиты:

УтилитаЧто делает
wat2wasmкомпилирует текст WAT в бинарь .wasm
wasm2watдизассемблирует бинарь обратно в читаемый WAT
wasm-objdumpпоказывает секции модуля, как objdump для нативных бинарей
wasm-validateпроверяет корректность модуля без запуска
wasm-stripудаляет ненужные секции (имена, отладку) — уменьшает размер
wat2wasm module.wat -o module.wasm   # текст -> бинарь
wasm2wat module.wasm                 # посмотреть бинарь глазами
wasm-objdump -x module.wasm          # разбор секций
wasm-validate module.wasm            # проверка корректности

Автономные рантаймы

Браузер — не единственное место, где живёт Wasm. Чтобы запускать модули на сервере или из командной строки, есть отдельные рантаймы:

  • Wasmtime — эталонный рантайм от Bytecode Alliance, фокус на WASI и безопасности.
  • Wasmer — рантайм с акцентом на встраивание и универсальность, реестр модулей.
  • WasmEdge — рантайм для edge/cloud, оптимизирован под производительность и serverless.
wasmtime module.wasm          # запустить модуль вне браузера
wasmtime run --invoke add module.wasm 2 3   # вызвать функцию add

Считаем то же без файлов

Чтобы не запускать тулчейн, проверим ожидаемую логику простой функции прямо в браузере на JS — это то, что вычислил бы наш модуль:

// что выдал бы wasmtime run --invoke add module.wasm 2 3
function add(a, b) { return a + b; }
console.log("результат add 2 3:", add(2, 3));

Вывод:

результат add 2 3: 5

Онлайн-инструменты

Для обучения удобны браузерные площадки: на WasmFiddle и подобных можно набрать C/WAT слева и сразу увидеть Wasm и результат справа. Это лучший способ потрогать Wasm, не настраивая локальный тулчейн.

Как работает под капотом

Автономные рантаймы вроде Wasmtime включают тот же тип компилятора, что и браузер: они берут .wasm, валидируют, компилируют в машинный код (часто через Cranelift или LLVM) и исполняют. Разница с браузером — в том, какие импорты они предоставляют: вместо DOM и fetch они дают системный интерфейс WASI (файлы, аргументы, время). Поэтому один и тот же модуль ведёт себя предсказуемо, а доступ к внешнему миру определяется набором импортов рантайма.

Частые ошибки

  • Запускать в Wasmtime модуль, ждущий браузерных импортов — он упадёт: в CLI нет DOM, есть WASI.
  • Забыть wasm-validate — проще поймать ошибку модуля статически, чем в рантайме.
  • Оставить отладочные секции в продеwasm-strip заметно уменьшает размер.

Итоги

  • WABT: wat2wasm, wasm2wat, wasm-objdump, wasm-validate, wasm-strip.
  • Вне браузера модули запускают Wasmtime, Wasmer, WasmEdge.
  • Онлайн-площадки (WasmFiddle) — быстрый способ попробовать без установки.
  • Доступ к миру задают импорты рантайма: браузерные API против WASI.
Проверьте себя
1. Что делает утилита wasm2wat?
AКомпилирует WAT в бинарь
BДизассемблирует бинарь .wasm обратно в читаемый текст WAT
CЗапускает модуль
DПроверяет производительность
2. Что такое Wasmtime?
AБраузерный движок
BАвтономный рантайм для запуска Wasm вне браузера (с WASI)
CУтилита сжатия
DЯзык компиляции в Wasm
3. Почему модуль для браузера может упасть в Wasmtime?
AWasmtime слишком медленный
BВ CLI нет браузерных импортов (DOM, fetch) — там WASI
CWasmtime не поддерживает функции
DРазмер модуля слишком велик