EnglishРусский Map

wazero

title
wazero
type
toolbox
summary
Среда выполнения WebAssembly на чистом Go без CGO: кросс-компиляция остаётся тривиальной
tags
go, webassembly, runtime, sandboxing
language
Go
license
Apache-2.0
created
2026-07-21
updated
2026-07-21
lang
ru
translation_of
wazero
source_updated
2026-07-21
translated
2026-09-01
translator
lllm/antigravity/gemini-3.7-flash-medium

wazero - это среда выполнения WebAssembly, написанная на чистом Go без CGO. Из-за отсутствия зависимостей от C программа на Go со встроенным wazero кросс-компилируется так же просто, как и любой другой Go-бинарник: без C-тулчейна и без настройки сборки под каждую платформу. Это главная причина предпочесть её runtime'ам на базе CGO (wasmtime-go, wasmer-go) в Go-проекте: как только вы подключаете CGO, GOOS=windows go build на Mac перестаёт быть бесплатным. Она реализует спецификацию WebAssembly Core версий W3C 1.0 и 2.0.

Как устроена

Из зависимостей - только стандартная библиотека Go и golang.org/x/sys, больше ничего. Модули выполняются одним из двух движков:

  • Interpreter - напрямую разбирает байт-код. Платформонезависим, поэтому работает на любой целевой архитектуре Go, включая riscv64. Работает медленнее.
  • Compiler - заранее (AOT) компилирует модуль в машинный код во время Runtime.CompileModule, а затем исполняет его. Используется по умолчанию там, где поддерживается, и обычно работает быстрее интерпретатора в 10 и более раз. Ограничен архитектурами amd64 и arm64, так как требует отдельного генератора кода под каждую архитектуру.

Оба движка проходят наборы тестов спецификации Wasm Core, а сам проект тестируется на Linux, macOS, Windows и BSD.

Использование

ctx := context.Background()
r := wazero.NewRuntime(ctx) // Compiler engine by default on amd64/arm64
defer r.Close(ctx)

mod, err := r.Instantiate(ctx, wasmBytes)
if err != nil {
    log.Fatal(err)
}
add := mod.ExportedFunction("add")
results, err := add.Call(ctx, 2, 3)

Wasm-модуль имеет доступ только к тем функциям хоста и участкам памяти, которые вы явно ему предоставили. Благодаря этому wazero подходит для запуска недоверенного кода внутри Go-процесса - это один из вариантов для песочниц для AI-агентов и систем плагинов.

Ограничения

  • Движок Compiler работает только на amd64/arm64. На остальных архитектурах (riscv64, s390x, ppc64le) приходится откатываться к более медленному Interpreter - там нужно явно вызывать wazero.NewRuntimeConfigInterpreter().
  • Wasm-песочница - это изолирующая граница, а не полноценная виртуальная машина. Она ограничивает память и импорты, но за ограничение возможностей, которые вы действительно экспортируете (файловая система, системные часы, сетевые shim'ы через WASI), отвечаете вы сами.
  • Нюанс с путём импорта: канонический путь к модулю по-прежнему github.com/tetratelabs/wazero, хотя репозиторий теперь находится в организации wazero на GitHub (проект зародился в Tetrate.io). В коде импортируется путь с tetratelabs, а URL репозитория указывает на организацию wazero.

Связанное: в anubis-wasm-vendor-binary отмечается, что wazero, как и wasmtime, требует включать поддержку исключений WebAssembly через флаг в собственном тестовом runner'е, а не включает её по умолчанию.

Репозиторий

github.com/wazero/wazero - Go, Apache-2.0, ~6.3k звёзд. Стабилен с версии 1.0 в марте 2023 года, использует semver со стабильным API во всей линейке 1.x, поддерживает два последних релиза Go.