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日 |
1534 在 WebAssembly 中
29 每月下载量
在 wai-bindgen-cli 中使用
2.5MB
2.5K SLoC
关于
注意:遗憾的是,
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(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应用程序中使用时,可能使用编译成WebAssembly的wai-bindgen
版本,并发布到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的,使用上述任一目标。对于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运行时支持的*.js
和一个*.d.ts
文件。注意,此语言的预期长期集成是将wai-bindgen
本身编译到WebAssembly,并发布NPM包,以便将wai-bindgen
集成到流行的JS构建系统中。 -
wasmer-py
- 这是为使用wasmer
PyPI 包的 Python 用户设计的。它底层使用 Wasmer,但您可以在提供导入到 WebAssembly 模块或使用接口类型消费模块时编写 Python 代码。这会生成一个带有类型的*.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
中提供支持。