5个版本
0.2.3 | 2023年2月15日 |
---|---|
0.2.2 | 2022年12月8日 |
0.2.1 | 2022年11月17日 |
0.2.0 | 2022年11月8日 |
0.2.0-rc.1 | 2022年10月31日 |
#1553 in WebAssembly
43KB
816 行
关于
注意:遗憾的是,
wit-bindgen
的维护者不想添加对Wasmer的支持,因此我们不得不进行硬分叉,以便使Wasmer能够正常工作。
此项目是WebAssembly程序和WebAssembly嵌入的绑定生成器框架。它与描述模块接口的*.wai
文件一起工作,这些文件可以是导入或导出的。例如,此项目可用于以下情况:
-
您的语言(例如,Rust)编译为WebAssembly,您希望导入WASI。此项目将为使用
*.wai
描述的WASI API生成Rust绑定。 -
您的运行时(例如,Wasmer)希望随后向客户端程序提供WASI功能。此项目将为WASI接口为您生成一个Rust
trait
,您需要实现该接口。 -
您正在消费一个WebAssembly模块(例如,在浏览器中),您不想处理奇特的ABI细节。您将使用此项目生成JS绑定,该绑定为您提供了一个TypeScript接口,用于处理由
*.wai
描述的WebAssembly模块的原生JS类型。
此项目基于接口类型提案。此仓库将遵循上游更改。WAI的目的是提供一个兼容性的工具链和故事,用于接口类型和标准ABI。生成的所有语言绑定都使用标准ABI进行通信,使WebAssembly模块可以以支持任何语言的方式编写,并可以在任何具有语言支持的环境中消费WebAssembly模块。
演示
如果您想探索并查看给定输入 *.wai
生成的绑定看起来像什么,您可以在网上探索生成的代码,以了解正在生成什么以及粘合代码的样子。
使用方法
目前,这个命令行工具主要提供用于调试和探索的目的。它可以很容易地与 wasmer
命令行界面一起使用。
// browser.wai
record person {
name: string,
age: u32,
}
// Say hello to either the specified person or the current user
hello: func(who: option<person>) -> string
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- js --import browser.wai
Generating "browser.d.ts"
Generating "browser.js"
Generating "intrinsics.js"
这个工具不一定是为了集成到工具链中。例如,在 Rust 中的使用更有可能通过过程宏和 Cargo 依赖项来完成。在 Web 应用程序中的使用可能需要将 wai-bindgen
编译成 WebAssembly 并发布到 NPM 的版本。
不过,现在您可以通过命令行界面探索每种语言中的绑定看起来像什么。再次,如果您想依赖这个功能且不介意的话,请通过 Slack 联系我们,我们可以为您找到一个比依赖命令行工具更好的解决方案。
支持的语言
首先,这是一个支持生成使用接口类型的 WebAssembly 二进制文件的受支持语言列表。这意味着这些语言支持 *.wai
定义的导入和导出。
-
rust-wasm
- 这是为了 Rust 编译成 WebAssembly,通常使用wasm32-wasi
或wasm32-unknown-unknown
目标,具体取决于您的使用情况。在这种情况下,您可能需要依赖于wai-bindgen-rust
包(位于crates/rust-wasm
)并使用import!
和export!
宏来生成代码。 -
c
- 这是为了 C 编译成 WebAssembly,同样也适用于 Rust。在 C 中,wai-bindgen
命令行工具将生成一个*.h
和一个*.c
文件,这些文件将被编译到 wasm 模块中。
这个仓库还支持一些宿主语言/运行时,可以用来消费使用接口类型的 WebAssembly 模块。这些模块需要遵循它们的导出/导入的规范 ABI。
-
wasmer
- 这是为了使用wasmer
包的 Rust 用户。这个生成器通过wai-bindgen-wasmer
包(位于crates/wasmer
)使用,就像编译成 wasm 的 Rust 支持,有一个import!
和一个export!
宏来生成代码。 -
js
- 这是为了执行 WebAssembly 模块的 JavaScript 用户。这可能是在浏览器、Node.js 或 Deno 中。理论上,这涵盖了像 web workers 这样的浏览器用例。在这种情况下,wai-bindgen
命令行工具将生成一个*.js
和一个*.d.ts
文件,描述接口并提供必要的 JS 运行时支持以实现规范 ABI。请注意,这个语言的长远目标是将其编译成 WebAssembly 并发布 NPM 包,以便将wai-bindgen
集成到流行的 JS 构建系统中。 -
wasmer-py
- 这是为了使用wasmer
PyPI 包的 Python 用户。这使用 Wasmer 作为底层,但您可以在提供 WebAssembly 模块的导入或使用接口类型消费模块时编写 Python。这将生成一个*.py
文件,该文件带有关注类型,用于在mypy
或其他类型检查器中使用。
所有生成器都支持 --import
和 --export
标志,在 wai-bindgen
命令行工具中。
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- js --import browser.wai
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- rust-wasm --export my-interface.wai
$ wasmer run wasmer/wai-bindgen-cli --dir=. -- wasmer --import host-functions.wai
在这里,“导入”意味着“我想导入并调用该接口中的函数”,“导出”意味着“我想定义该接口中的函数供他人调用”。
最后,在一种“杂项”类别中,wai-bindgen
命令行工具还支持:
markdown
- 从源文件*.wai
中的注释生成可读的文档,并生成*.md
和*.html
文件。
请注意,这里支持的语言列表是某一时刻的快照,并非最终版本。接口类型提案的目的是在 WebAssembly 模块的编写以及如何使用它们时都保持语言无关。如果您在这里找不到运行时,或者您正在将代码编译为 WebAssembly 且您的语言未在此列表中,这并不意味着它永远不会被支持!语言绑定生成器旨在不是世界上最难的事情(但不幸的是也不是最容易的),而这个存储库中的 crate 和支持主要是为了使编写生成器尽可能容易。
一些其他语言和运行时,例如,今天在 wai-bindgen
中没有支持但将来可能实现(也可能在这里实现)的是:
-
wasmer-go
- 与wasmer-py
类似,但针对 Go。基本上是为使用wasmer-go
包 的 Go 用户设计的,他们想使用接口类型而不是原始指针/内存等。 -
wasmer-ruby
- 与wasmer-py
类似,但针对 Ruby。基本上是为使用wasmer-ruby
包 的 Ruby 用户设计的,他们想使用接口类型而不是原始指针/内存等。
请注意,这不是一个排他性的列表,只是为了给您一个其他绑定可能看起来怎样的概念。有大量的运行时和语言可以编译为 WebAssembly,接口类型应该能够与所有这些运行时一起工作,理论上只需一些工作小时就能在 wai-bindgen
中提供支持。
依赖项
~22MB
~442K SLoC