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.12022年10月31日

#1297 in WebAssembly

Download history 9452/week @ 2024-03-14 6625/week @ 2024-03-21 10378/week @ 2024-03-28 10787/week @ 2024-04-04 15206/week @ 2024-04-11 7901/week @ 2024-04-18 6876/week @ 2024-04-25 7324/week @ 2024-05-02 9227/week @ 2024-05-09 12814/week @ 2024-05-16 13316/week @ 2024-05-23 14500/week @ 2024-05-30 9834/week @ 2024-06-06 17568/week @ 2024-06-13 10083/week @ 2024-06-20 6816/week @ 2024-06-27

46,255 monthly downloads
用于 10 个Crates (2 直接)

Apache-2.0

180KB
3.5K SLoC

WebAssembly接口

WAI的代码绑定生成器

一个基于 waiWasmer 项目

build status supported rustc stable

关于

注意:不幸的是,wit-bindgen 的维护者不希望 添加对Wasmer的支持,因此我们必须进行硬分叉,以便与 Wasmer 一起工作。

此项目是WebAssembly程序和WebAssembly嵌入的绑定生成器框架。它与描述模块接口的 *.wai 文件一起工作,无论是导入还是导出。例如,此项目可以用在以下情况中

  • 你的语言(比如Rust)编译成WebAssembly,你想导入WASI。此项目将生成Rust绑定以导入由 *.wai 描述的WASI API。

  • 你的运行时(比如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应用程序中的使用可能会使用编译为WebAssembly的wai-bindgen版本,并发布到NPM。

尽管如此,你可以通过CLI探索每种语言的绑定。再次提醒,如果你愿意依赖这个项目,请通过Slack联系我们,以便我们为你提供一个比依赖CLI工具更好的解决方案。

支持的语言

首先,这是一个支持生成使用接口类型的WebAssembly二进制的语言列表。这意味着这些语言支持*.wai定义的导入和导出。

  • rust-wasm - 这是针对编译为WebAssembly的Rust,根据你的用例,通常使用wasm32-wasiwasm32-unknown-unknown目标。在这种模式下,你可能会依赖于位于crates/rust-wasmwai-bindgen-rust包,并使用import!export!宏来生成代码。

  • c - 这是针对编译为WebAssembly的C,也可以使用与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,并发布 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.3–3MB
~83K SLoC