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.