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 日

1470WebAssembly

Download history 23/week @ 2024-03-11 21/week @ 2024-03-18 21/week @ 2024-03-25 41/week @ 2024-04-01 15/week @ 2024-04-08 13/week @ 2024-04-15 98/week @ 2024-04-22 9/week @ 2024-04-29 10/week @ 2024-05-06 17/week @ 2024-05-13 6/week @ 2024-05-20 21/week @ 2024-05-27 18/week @ 2024-06-03 18/week @ 2024-06-10 12/week @ 2024-06-17 22/week @ 2024-06-24

71 每月下载量
5 个软件包中(2 个直接)使用

Apache-2.0

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

  • wasmer-py - 适用于使用 wasmer PyPI 包的 Python 用户。这使用底层的 Wasmer,但您可以使用 Python 来提供对 WebAssembly 模块的导入或使用接口类型来消费模块。这生成一个 *.py 文件,该文件被类型注解用于在 mypy 或其他类型检查器中使用。

所有生成器都支持 --import--export 标志在 wai-bindgen 命令行工具中。

$ 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 - 生成一个 *.md 和一个 *.html 文件,其中包含从源 *.wai 文件中的注释渲染的易于阅读的文档。

请注意,此处支持的语言列表是一个时间快照,并不是最终的。接口类型提案的目的是在 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.3–3MB
~83K SLoC