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日 |
#7 in #wai
31 每月下载次数
用于 wai-bindgen-cli
145KB
3K SLoC
关于
注意:遗憾的是,
wit-bindgen
不希望支持Wasmer上游,因此wit-bindgen
不提供对Wasmer的支持。
此项目是一个用于生成WebAssembly程序和WebAssembly模块嵌入的Rust绑定生成框架。
-
此项目旨在提供一种简单且直接的方法来生成Rust绑定,以便与WebAssembly模块进行交互。
-
此项目是一个Rust库,它提供了生成Rust绑定的工具,这些绑定可以与WebAssembly模块进行交互。
-
该库支持生成与WebAssembly模块交互的Rust绑定。
本项目基于接口类型提议。此仓库将跟踪上游更改。代码wai
的目的是提供与接口类型和规范ABI兼容的工具链和代码库。生成的语言绑定都使用规范ABI进行通信,使得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
目标,具体取决于您的用例。在此模式下,您可能会依赖于位于crates/rust-wasm
的wai-bindgen-rust
包(crate),并使用import!
和export!
宏来生成代码。 -
c
- 这是为了将C编译为WebAssembly,使用与Rust相同的上述目标。对于C,wai-bindgen
命令行工具将生成一个*.h
文件和一个*.c
文件,这些文件将被编译到wasm模块中。
此仓库还支持一些宿主语言/运行时,可以用来消费使用接口类型的WebAssembly模块。这些模块需要遵循其导出/导入的规范ABI。
-
wasmer
- 这是为了使用wasmer
包的Rust用户。此生成器通过位于crates/wasmer
的wai-bindgen-wasmer
包(crate)使用,类似于编译为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
标志,在wai-bindgen
CLI工具中。
$ 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,并且您的语言没有列出,这并不意味着它永远不会得到支持!语言绑定生成器旨在不是世界上最难的事情(但不幸的是也不是最容易的),这个存储库中的crate和支持主要存在,以便尽可能容易地编写生成器。
其他一些今天在wai-bindgen
中没有支持但将来可能实现(也可能在这里编写)的语言和运行时包括:
-
wasmer-go
- 与wasmer-py
相同,但用于Go。基本上,对于想使用接口类型而不是原始指针、内存等而不是直接工作的Go用户,可以使用wasmer-go
软件包。 -
wasmer-ruby
- 与wasmer-py
相同,但用于Ruby。基本上,对于想使用接口类型而不是原始指针、内存等而不是直接工作的Ruby用户,可以使用wasmer-ruby
软件包。
请注意,这不是一个排他性的列表,只是想给您一个其他绑定可能看起来怎样的概念。有大量的运行时和语言可以编译到WebAssembly,接口类型应该能够与所有这些一起工作,并且理论上只需一些工作时间即可在wai-bindgen
中得到支持。
依赖项
~2.2–3MB
~82K SLoC