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日

#3 in #wai

Download history 10448/week @ 2024-04-23 4949/week @ 2024-04-30 12288/week @ 2024-05-07 13697/week @ 2024-05-14 14753/week @ 2024-05-21 17007/week @ 2024-05-28 8981/week @ 2024-06-04 19964/week @ 2024-06-11 13238/week @ 2024-06-18 7372/week @ 2024-06-25 21382/week @ 2024-07-02 28209/week @ 2024-07-09 26663/week @ 2024-07-16 12914/week @ 2024-07-23 18546/week @ 2024-07-30 23603/week @ 2024-08-06

87,126 每月下载次数
36 个crate中使用 (4 个直接使用)

Apache-2.0

77KB
1.5K SLoC

WebAssembly接口

wai的语言绑定生成器

一个基于waiWasmer项目

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 生成的绑定是什么样的,您可以在网上探索生成的代码,以了解正在生成的内容以及粘合代码的样式。

用法

目前,这个命令行工具主要是为了调试和探索目的提供的。它可以很容易地与 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 的版本。

不过,您可以通过 CLI 探索每种语言中的绑定看起来是什么样子。如果您不介意的话,请通过 Slack 联系我们,以便我们能找到一个比仅依靠 CLI 工具更好的方案。

支持的语言

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

  • rust-wasm - 这是为 Rust 编译到 WebAssembly 而设计的,通常使用 wasm32-wasiwasm32-unknown-unknown 目标,具体取决于您的用例。在这种模式下,您可能会依赖位于 crates/rust-wasmwai-bindgen-rust 仓库,并使用 import!export! 宏来生成代码。

  • c - 这是为编译到 WebAssembly 的 C 而设计的,同样可以使用上述任一目标。对于 C,wai-bindgen 命令行工具将生成一个 *.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 命令行工具将生成一个 *.js 和一个 *.d.ts 文件,描述接口并提供在 JS 中实现规范 ABI 所需的必要运行时支持。请注意,此语言的长期集成目标是编译 wai-bindgen 本身到 WebAssembly,并为流行的 JS 构建系统发布 NPM 包,以便将 wai-bindgen 集成到 JS 构建过程中。

  • wasmer-py - 这是为使用 wasmer PyPI 包的 Python 用户设计的。此工具在底层使用 Wasmer,但您可以在提供导入到 WebAssembly 模块或使用接口类型消费模块时编写 Python。它生成一个 *.py 文件,该文件带有用于在 mypy 或其他类型检查器中使用类型的注释。

所有生成器都支持在 wai-bindgen CLI 工具中使用 --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 CLI 工具还支持以下功能

  • markdown - 从源文件 *.wai 中的注释生成可读的文档,生成 *.md*.html 文件。

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

例如,一些今天在 wai-bindgen 中没有支持但未来可能实现(也可能在这里编写)的其他语言和运行时包括

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

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

请注意,这不是一个独家列表,只是为了让您了解其他绑定可能的样子。有大量的运行时和语言可以将代码编译成 WebAssembly,接口类型应该能够与它们一起工作,理论上只需一些工作小时即可在 wai-bindgen 中获得支持。

依赖项

~2.5MB
~76K SLoC