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 日 |
#11 in #wai
49,755 个月下载量
用于 25 个包(通过 wai-bindgen-rust)
115KB
2K SLoC
关于
注意:遗憾的是,
wit-bindgen
的维护者不想 添加对 Wasmer 的支持,因此我们不得不进行硬分叉,以便与 Wasmer 一起工作。
此项目是一个 WebAssembly 程序和 WebAssembly 嵌入的绑定生成器框架。它适用于描述模块接口(无论是导入还是导出)的 *.wai
文件。例如,此项目可用于以下情况:
-
您的语言(例如,Rust)编译为 WebAssembly,您想导入 WASI。此项目将为使用
*.wai
描述的 WASI API 生成 Rust 绑定。 -
您的运行时(例如,Wasmer)想要向客户端程序提供 WASI 功能。此项目将为您生成一个 Rust
trait
,您需要实现它以提供 WASI 接口。 -
您正在消费 WebAssembly 模块(例如,在浏览器中),并且不想处理奇特的 ABI 细节。您将使用此项目生成 JS 绑定,该绑定为您提供了一个 TypeScript 接口,用于处理由
*.wai
描述的 WebAssembly 模块的本地 JS 类型。
本项目基于接口类型提议。此存储库将跟踪上游更改。《wai》的目的是为接口类型和标准ABI提供向前兼容的工具链和故事。生成的语言绑定都使用标准ABI进行通信,使WebAssembly模块可以用支持的语言编写,并在任何有语言支持的环境中使用。
演示
如果您想查看给定输入*.wai
生成的绑定外观,您可以在网上探索生成的代码,了解正在生成的内容以及胶水代码的样子。
使用方法
目前,提供了一个CLI工具,主要用于调试和探索目的。它可以与wasmer
CLI轻松使用。
// 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的版本。
不过,您可以通过CLI探索每种语言中绑定的样子。如果您愿意依赖它,请通过Slack联系我们,以便我们为您的用例找到一个比依赖CLI工具更好的方案。
支持的语言
首先,这是一个支持生成使用接口类型的WebAssembly二进制的语言列表。这意味着这些语言支持*.wai
定义的导入和导出。
-
rust-wasm
- 这是用于将Rust编译成WebAssembly的,根据您的用例,通常使用wasm32-wasi
或wasm32-unknown-unknown
目标。在这种情况下,您可能会依赖位于crates/rust-wasm
的wai-bindgen-rust
包,并使用import!
和export!
宏来生成代码。 -
c
- 这是用于将C编译成WebAssembly的,也可以使用上面提到的Rust目标。对于C,wai-bindgen
CLI工具将生成一个*.h
和一个*.c
文件,用于编译到wasm模块中。
此存储库还支持许多宿主语言/运行时,可以用于消费使用接口类型的WebAssembly模块。这些模块需要遵循它们的导出/导入的标准ABI。
-
wasmer
- 这是为使用wasmer
包的Rust用户提供的。此生成器通过位于crates/wasmer
的wai-bindgen-wasmer
包使用,与编译为wasm的Rust支持类似,也有用于生成代码的import!
和export!
宏。 -
js
- 这是为执行 WebAssembly 模块的 JavaScript 用户准备的。这可以在浏览器、Node.js 或 Deno 中进行。从理论上讲,这涵盖了像 web workers 这样的浏览器使用案例。在这种模式下,wai-bindgen
CLI 工具将生成一个*.js
和一个*.d.ts
文件,描述接口并提供必要的 JS 运行时支持以实现标准 ABI。请注意,该语言的长期集成目标是将其编译为 WebAssembly,并发布 NPM 包以将wai-bindgen
集成到流行的 JS 构建系统中。 -
wasmer-py
- 这是为使用wasmer
PyPI 包的 Python 用户准备的。它使用底层的 Wasmer,但您可以使用 Python 来提供 WebAssembly 模块的导入或使用接口类型来消费模块。它生成一个*.py
文件,该文件带有类型注解,用于在mypy
或其他类型检查器中使用。
所有生成器都支持 --import
和 --export
标志。
$ 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
CLI 还支持
markdown
- 从源*.wai
文件中的注释生成可读文档的*.md
和*.html
文件。
请注意,这里支持的编程语言列表是某一时间点的快照,并非最终列表。接口类型提议的目的是在 WebAssembly 模块的编写方式以及消费方式上都具有语言无关性。如果您在这里没有列出运行时,或者您正在将语言编译为 WebAssembly,但您的语言没有在这里列出,这并不意味着它永远不会得到支持!语言绑定生成器旨在不是世界上最难写的事情(但遗憾的是也不是最容易的),而这个存储库中的 crates 和支持主要存在于使编写生成器尽可能容易。
一些其他语言和运行时,例如,目前 wai-bindgen
中没有支持,但将来是可能的(也可能在这里编写)有
-
wasmer-go
- 与wasmer-py
相同,但用于 Go。基本上是为使用wasmer-go
包 的 Go 用户准备的,他们想使用接口类型而不是原始指针/内存等。 -
wasmer-ruby
- 与wasmer-py
相同,但用于 Ruby。基本上是为使用wasmer-ruby
包 的 Ruby 用户准备的,他们想使用接口类型而不是原始指针/内存等。
请注意,这不是一个排他性列表,只是为了让您了解其他绑定可能的样子。有大量运行时和语言可以编译为 WebAssembly,接口类型应该能够与它们一起工作,并且理论上只需一些工作时间即可在 wai-bindgen
中获得支持。
依赖项
~4MB
~112K SLoC