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日 |
21 in #wasm-interface
50 每月下载量
在 3 个crate中(直接使用2个) 使用
175KB
3.5K SLoC
关于
注意:不幸的是,
wit-bindgen
的维护者不希望添加对Wasmer的支持,因此我们不得不进行硬分叉,以便与Wasmer一起工作。
该项目是一个WebAssembly程序和WebAssembly嵌入的绑定生成器框架。该项目适用于描述模块接口的*.wai
文件,无论是导入的还是导出的。例如,该项目可用于以下情况:
-
您的语言(例如,Rust)编译为WebAssembly,您希望导入WASI。该项目将生成Rust绑定以导入使用
*.wai
描述的WASI API。 -
您的运行时(例如,Wasmer)希望向客户端程序提供WASI功能。该项目将为您生成一个Rust
trait
,以便您实现WASI接口。 -
您正在消费一个WebAssembly模块(例如,在浏览器中),您不希望处理奇特的ABI细节。您将使用该项目生成JS绑定,这些绑定为您提供了处理WebAssembly模块描述的
*.wai
的TypeScript接口。
该项目基于接口类型建议。此存储库将遵循上游更改。wai
的目的在于提供一个兼容性的工具链和故事,用于接口类型和规范ABI。生成的语言绑定都使用规范ABI进行通信,使WebAssembly模块能够用支持的语言编写,并使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 联系我们,以便为您的用例找到更好的解决方案。
支持的语言
首先,这里有一个列表,列出了用于生成使用接口类型的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
CLI工具将生成一个*.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
CLI工具将生成一个*.js
和一个*.d.ts
文件,描述接口并在JS中提供必要的运行时支持以实现规范ABI。请注意,这个语言的长期集成目标是将其自身编译成WebAssembly,并为流行的JS构建系统发布NPM包,以便将wai-bindgen
集成到JS构建过程中。 -
wasmer-py
- 这是为了使用wasmer
PyPI包的Python用户。这个工具在内部使用Wasmer,但您可以编写Python代码来提供导入给WebAssembly模块或使用接口类型消费模块。它生成一个*.py
文件,该文件带有类型注解,用于在mypy
或其他类型检查器中使用。
所有生成器都支持在 wai-bindgen
命令行工具中使用 --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
在这里,“import”表示“我想导入并调用该接口中的函数”,“export”表示“我想定义该接口中的函数供他人调用”。
最后,在一种“杂项”分类中,wai-bindgen
命令行工具还支持以下功能:
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
中得到支持。
依赖项
约2.2-3MB
约82K SLoC