wazero/wazero
GitHub: wazero/wazero
纯 Go 实现的零依赖 WebAssembly 运行时,支持解释器和 AOT 编译两种执行模式。
Stars: 6000 | Forks: 317
# wazero:面向 Go 开发者的零依赖 WebAssembly 运行时
[](https://pkg.go.dev/github.com/tetratelabs/wazero) [](https://opensource.org/licenses/Apache-2.0)
WebAssembly 是一种安全运行其他语言编译代码的方式。运行时执行 WebAssembly 模块,这些模块通常是具有 `.wasm` 扩展名的二进制文件。
wazero 是一个符合 WebAssembly 核心规范 [1.0][1] 和 [2.0][2] 的 Go 语言运行时。它具有*零依赖*,且不依赖 CGO。这意味着您可以运行其他语言的应用程序,同时保留交叉编译能力。
导入 wazero,用任何语言编写的代码来扩展您的 Go 应用程序!
## 示例
学习 wazero 的最好方法是尝试我们的[示例](examples/README.md)。最[基础的示例](examples/basic)使用 WebAssembly 中定义的加法函数扩展了一个 Go 应用程序。
## 运行时
wazero 支持两种运行时配置:默认为 _Compiler_(编译器):
默认情况下,例如 `wazero.NewRuntime(ctx)`,如果支持则使用 Compiler。您也可以像这样强制使用解释器:
```
r := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter())
```
### 解释器
解释器是一个基于简单解释器的 Wasm 虚拟机实现。其实现不包含任何平台(GOARCH, GOOS)特定的代码,因此 _解释器_ 可用于 Go 支持的任何编译目标(例如 `riscv64`)。
### 编译器
Compiler 在 `Runtime.CompileModule` 期间将 WebAssembly 模块提前(AOT)编译为机器码。这意味着您的 WebAssembly 函数在运行时原生执行。Compiler 比 Interpreter 更快,通常快一个数量级(10 倍)或更多。这是在无需宿主特定依赖的情况下完成的。
### 一致性
在支持的平台上,两种运行时都通过了 WebAssembly 核心 [1.0][3] 和 [2.0][4] 规范测试:
| Runtime | 用法 | amd64 | arm64 | others |
|:-----------:|:--------------------------------------:|:-----:|:-----:|:------:|
| Interpreter | `wazero.NewRuntimeConfigInterpreter()` | ✅ | ✅ | ✅ |
| Compiler | `wazero.NewRuntimeConfigCompiler()` | ✅ | ✅ | ❌ |
## 支持政策
以下支持政策主要关注将 wazero 嵌入其 Go 应用程序的开发者的兼容性问题。
### wazero
wazero 的 [1.0 版本][8] 于 2023 年 3 月发布,已被许多[项目][9]和生产站点使用。
我们通过语义版本控制提供 API 稳定性承诺。换句话说,我们承诺在不增加主版本号的情况下,不会破坏任何导出函数的签名。这并不意味着没有创新:新功能和行为会随着次版本号的增加而发生,例如 1.0.11 到 1.2.0。我们也会通过补丁版本修复错误或更改内部细节,例如 1.0.0 到 1.0.1。
您可以像这样获取最新版本的 wazero。
```
go get github.com/tetratelabs/wazero@latest
```
### Go
除了 Go 和 [`x/sys`][12] 之外,wazero 没有其他依赖,因此项目中使用 wazero 的唯一冲突来源是 Go 版本。
wazero 遵循与 Go 的[发布政策][5]相同的版本政策:支持两个版本。wazero 将确保这些版本正常工作,如果当前 Go 版本存在问题,我们将确认 Bug 的有效性。
### 平台
wazero 有两种运行时模式:解释器和编译器。唯一受支持的操作系统是我们测试过的系统,但这并不一定意味着其他操作系统版本无法工作。
目前,我们测试 [GitHub Actions][6] 打包的 Linux(Ubuntu 和 scratch)、MacOS 和 Windows,以及在 Linux 上运行的嵌套虚拟机,用于 FreeBSD、NetBSD、OpenBSD、DragonFly BSD、illumos 和 Solaris。
我们还测试了许多 `GOOS` 和 `GOARCH` 组合的交叉编译。
* 解释器
* Linux 在 amd64 和 arm64(原生)以及通过模拟的 riscv64 上进行测试。
* Windows、FreeBSD、NetBSD、OpenBSD、DragonFly BSD、illumos 和 Solaris 仅在 amd64 上进行测试。
* macOS 仅在 arm64 上进行测试。
* 编译器
* Linux 在 amd64 和 arm64 上进行测试。
* Windows、FreeBSD、NetBSD、DragonFly BSD、illumos 和 Solaris 仅在 amd64 上进行测试。
* macOS 仅在 arm64 上进行测试。
wazero 没有依赖项,也不需要 CGO。这意味着它也可以嵌入到不使用操作系统的应用程序中。这是 wazero 与其他替代方案之间的主要区别。
我们通过在 Docker 的 [scratch 镜像][7] 中运行测试来验证零依赖。这种方法确保了与任何父镜像的兼容性。
### macOS 代码签名权限
如果您正在为 macOS 进行开发并且需要对新应用程序进行代码签名,请阅读议题 [#2393][11]。
wazero 是 Tetrate.io, Inc. 在美国和/或其他国家的注册商标
标签:AI工具, AOT编译, Go语言, Runtime, Wasm, WebAssembly, 后端开发, 嵌入式引擎, 无CGO, 日志审计, 沙箱, 生成式AI安全, 程序破解, 系统编程, 编译器技术, 虚拟机, 解释器, 跨语言互操作, 运行时, 零依赖