wazero/wazero
GitHub: wazero/wazero
wazero是Go开发者的零依赖WebAssembly运行时。
Stars: 6206 | Forks: 334
# wazero:Go 开发者的零依赖 WebAssembly 运行时
[](https://pkg.go.dev/github.com/tetratelabs/wazero) [](https://opensource.org/licenses/Apache-2.0)
WebAssembly 是一种在安全环境中运行其他语言编译代码的方式。运行时
执行 WebAssembly 模块(Wasm),这些模块通常是具有 `.wasm` 扩展名的二进制文件。
wazero 是一个用 Go 编写的符合 WebAssembly 核心规范 [1.0][1] 和 [2.0][2] 的运行时。它具有 *零依赖性*,不依赖于 CGO。
这意味着您可以在其他语言中运行应用程序,同时仍然保持交叉
编译。
导入 wazero 并使用任何语言编写的代码扩展您的 Go 应用程序!
## 示例
学习 wazero 的最佳方式是尝试我们的 [示例](examples/README.md)。最 [基本示例](examples/basic) 通过在 WebAssembly 中定义的附加函数扩展了 Go 应用程序。
## 运行时
wazero 支持两种运行时配置:_编译器_ 是默认配置:
默认情况下,通过 `wazero.NewRuntime(ctx)`,如果支持,将使用编译器。您也可以强制使用解释器,如下所示:
```
r := wazero.NewRuntimeWithConfig(ctx, wazero.NewRuntimeConfigInterpreter())
```
### 解释器
解释器是基于解释器实现的 Wasm 虚拟机的简单实现。它的实现没有平台(GOARCH、GOOS)特定的代码,因此 _解释器_ 可以用于 Go 可用的任何编译目标(例如 `riscv64`)。
### 编译器
编译器在 `Runtime.CompileModule` 期间预先将 WebAssembly 模块编译成机器代码(AOT)。这意味着您的 WebAssembly 函数在运行时以原生方式执行。编译器比解释器快得多,通常快一个数量级(10x)或更多。这是在不使用主机特定依赖项的情况下完成的。
### 符合性
两个运行时都在支持的平台上的 WebAssembly 核心 [1.0][3] 和 [2.0][4] 规范测试中通过:
| 运行时 | 使用 | amd64 | arm64 | others |
|:-----------:|:--------------------------------------:|:-----:|:-----:|:------:|
| 解释器 | `wazero.NewRuntimeConfigInterpreter()` | ✅ | ✅ | ✅ |
| 编译器 | `wazero.NewRuntimeConfigCompiler()` | ✅ | ✅ | ❌ |
## 支持策略
以下支持策略侧重于将 wazero 嵌入其 Go 应用程序的用户兼容性问题。
### wazero
wazero 的 [1.0 版本][8] 于 2023 年 3 月发布,并被许多项目和生产站点使用。
我们通过语义版本化提供 API 稳定性保证。换句话说,我们承诺不会在不增加主版本的情况下破坏任何导出函数签名。这并不意味着没有创新:新功能和行为以次要版本增量发生,例如 1.0.11 到 1.2.0。我们还会通过补丁版本修复错误或更改内部细节,例如 1.0.0 到 1.0.1。
您可以通过以下方式获取 wazero 的最新版本。
```
go get github.com/tetratelabs/wazero@latest
```
如果您最终使用 wazero,请给我们一个 [star][10]!
### Go
wazero 除了 Go 和 `x/sys`[12] 没有其他依赖项,因此您项目中 wazero 的使用冲突的唯一来源是 Go 版本。
wazero 遵循与 Go 的 [发布策略][5] 相同的版本策略:两个版本。wazero 将确保这些版本正常工作,并且如果有当前 Go 版本的问题,则问题有效。
### 平台
wazero 有两种运行时模式:解释器和编译器。唯一支持的操作系统是我们测试的操作系统,但这并不意味着其他操作系统版本不会工作。
我们目前测试 Linux(Ubuntu 和 scratch)、MacOS 和 Windows(由 [GitHub Actions][6] 打包),以及运行在 Linux 上的嵌套 VM,用于 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工具, Apache许可证, EVTX分析, Go语言, SOC Prime, WebAssembly, 动态执行, 安全执行, 开发工具, 开源, 性能优化, 技术栈, 文档, 日志审计, 检测绕过, 模块化, 生成式AI安全, 示例代码, 社区资源, 程序破解, 编译器, 编译时优化, 虚拟机, 解释器, 跨语言开发, 运行时, 零依赖