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 日

#2 in #wai

Download history 10502/week @ 2024-04-23 4974/week @ 2024-04-30 12311/week @ 2024-05-07 13716/week @ 2024-05-14 14771/week @ 2024-05-21 17030/week @ 2024-05-28 9004/week @ 2024-06-04 19976/week @ 2024-06-11 13266/week @ 2024-06-18 7382/week @ 2024-06-25 21381/week @ 2024-07-02 28259/week @ 2024-07-09 26699/week @ 2024-07-16 12935/week @ 2024-07-23 18576/week @ 2024-07-30 23621/week @ 2024-08-06

87,244 每月下载次数
用于 48 个 crate (3 直接)

Apache-2.0

200KB
4K SLoC

WebAssembly 接口

用于 wai 的语言绑定生成器

Wasmer 项目,基于 wai

build status supported rustc stable

关于

注意:不幸的是,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 的目的是提供与接口类型和规范 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应用程序中的使用可能会使用编译为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,也使用上述目标。对于C,wai-bindgen CLI工具将生成一个*.h和一个*.c文件,这些文件将被编译到wasm模块中。

此存储库还支持一些主机语言/运行时,可以用来消费使用接口类型的WebAssembly模块。这些模块需要遵循其导出/导入的规范ABI。

  • wasmer - 这是针对使用wasmer存储库的Rust用户。此生成器通过位于crates/wasmerwai-bindgen-wasmer存储库使用,并且与编译为wasm的Rust支持类似,有import!export!宏用于生成代码。

  • js - 这是针对执行WebAssembly模块的JavaScript用户。这可能是浏览器、Node.js或Deno。从理论上讲,这也涵盖了浏览器使用案例,如web workers等。在此模式下,wai-bindgen CLI工具将生成一个*.js和一个*.d.ts文件,描述接口并提供必要的JS运行时支持来实现规范ABI。请注意,此语言预期的长期集成是将wai-bindgen本身编译为WebAssembly,并发布NPM包以集成到流行的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

在这里,“导入”意味着“我想导入并调用此接口中的函数”,而“导出”意味着“我想为此接口中的函数定义供其他人调用”。

最后,在“杂项”类别中,wai-bindgen 命令行工具还支持:

  • markdown - 从源 **.wai 文件中的注释生成一个 *.md 和一个 *.html 文件,其中包含可读的文档。

请注意,这里支持的编程语言列表是一个时间快照,并非最终版本。接口类型提案的目的是在 WebAssembly 模块的编写以及消费方面都是语言无关的。如果您在这里没有找到支持的语言或编译到 WebAssembly 而您的语言也没有被列出,这并不意味着它永远不会被支持!语言绑定生成器旨在不是世界上最难编写的事情(但遗憾的是也不是最容易的),这个存储库中的 crate 和支持主要存在是为了尽可能简化生成器的编写。

例如,一些其他语言和运行时,目前还没有在 wai-bindgen 中得到支持,但将来是可能的(也可能在这里编写)包括:

  • wasmer-go - 与 wasmer-py 相同,但用于 Go。基本上是为那些想要使用接口类型而不是原始指针/内存等而非使用原始指针/内存等的 Go 用户。

  • wasmer-ruby - 与 wasmer-py 相同,但用于 Ruby。基本上是为那些想要使用接口类型而不是原始指针/内存等而非使用原始指针/内存等的 Ruby 用户。

请注意,这不是一个排他性的列表,只是想给您一个其他绑定可能看起来是什么样的概念。有大量的运行时和语言编译到 WebAssembly,接口类型应该能够与所有这些一起工作,并且在理论上只需要一些工作小时就能在 wai-bindgen 中得到支持。

依赖关系

~1.5–2MB
~68K SLoC