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日

#5 in #wai

Download history 172/week @ 2024-04-22 9/week @ 2024-04-29 10/week @ 2024-05-06 17/week @ 2024-05-13 5/week @ 2024-05-20 22/week @ 2024-05-27 18/week @ 2024-06-03 17/week @ 2024-06-10 12/week @ 2024-06-17 22/week @ 2024-06-24 2/week @ 2024-07-08 24/week @ 2024-07-15 3/week @ 2024-07-22 40/week @ 2024-07-29 13/week @ 2024-08-05

80 每月下载量
5 个crate(2个直接) 中使用

Apache-2.0

140KB
3K SLoC

WebAssembly接口

是wai的代码生成器

一个基于Wasmer项目,构建在wai之上

build status supported rustc stable

关于

注意:遗憾的是,wit-bindgen背后的维护者不想为Wasmer添加支持,因此我们不得不进行硬分叉,以便使Wasmer工作。

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

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

  • 您的运行时(例如,Wasmer)希望向客户端程序提供WASI功能。此项目将为WASI接口生成Rust trait 以供实现。

  • 您正在消耗一个WebAssembly模块(例如,在浏览器中),您不想处理奇特的ABI细节。您会使用此项目生成JS绑定,该绑定为您提供处理由*.wai描述的WebAssembly模块的本地JS类型的TypeScript接口。

本项目基于接口类型提案。此仓库将跟踪上游变化。代码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-rustcrate,并使用import!export!宏来生成代码。

  • c - 这是针对编译到WebAssembly的C,同样可以使用上述Rust的目标。对于C,wai-bindgen CLI工具会生成一个*.h和一个*.c文件,这些文件将被编译到wasm模块中。

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

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

  • js - 这是针对执行WebAssembly模块的JavaScript用户。这可能是在浏览器、Node.js或Deno中。理论上,这涵盖了浏览器使用案例,如web workers等。在这种情况下,wai-bindgen CLI工具会生成一个*.js和一个*.d.ts文件,描述接口并提供必要的JS运行时支持以实现规范ABI。请注意,此语言的长期集成目标是编译wai-bindgen自身到WebAssembly,并发布NPM包以集成wai-bindgen到流行的JS构建流程中。

  • wasmer-py - 适用于使用 wasmer PyPI 包的 Python 用户。该工具在底层使用 Wasmer,但允许您使用 Python 编写代码,通过向 WebAssembly 模块提供导入或使用接口类型消耗模块。它将生成一个带有类型注解的 *.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.2–3MB
~82K SLoC