Инструменты: 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.