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 日

1540WebAssembly

每月 39 次下载
wai-bindgen-cli 中使用

Apache-2.0

125KB
2.5K SLoC

WebAssembly 接口

用于 wai 的语言绑定生成器

一个基于 Wasmerwai 项目的构建

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 绑定,它提供了处理 *.wai 描述的 WebAssembly 模块的 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,同样可以使用上述任一目标。对于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软件包发布给流行的JS构建系统,以便将wai-bindgen集成到JS构建过程中。

  • wasmer-py - 这是针对使用wasmer PyPI软件包的Python用户。这使用Wasmer作为底层,但您可以在提供导入到WebAssembly模块或使用接口类型消费模块时编写Python。这会生成一个*.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,并且您的语言没有列出,这并不意味着它永远不会得到支持!语言绑定生成器旨在不是世界上最难的事情(但不幸的是也不是最容易的事情),这个仓库中的crates和支持主要是为了使编写生成器尽可能容易。

一些其他语言和运行时,例如,目前没有在 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