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日

#12 in #wai

Download history 9462/week @ 2024-03-14 6634/week @ 2024-03-21 10361/week @ 2024-03-28 10784/week @ 2024-04-04 15213/week @ 2024-04-11 7882/week @ 2024-04-18 6741/week @ 2024-04-25 7327/week @ 2024-05-02 9222/week @ 2024-05-09 12808/week @ 2024-05-16 13310/week @ 2024-05-23 14491/week @ 2024-05-30 9839/week @ 2024-06-06 17561/week @ 2024-06-13 10068/week @ 2024-06-20 6822/week @ 2024-06-27

46,243 每月下载量
用于 8 个crate(通过 wai-bindgen-wasmer

Apache-2.0

150KB
2.5K SLoC

WebAssembly接口

wai的语言绑定生成器

一个基于waiWasmer项目

build status supported rustc stable

关于

注意:不幸的是,wit-bindgen的维护者不希望添加对Wasmer的支持,因此我们不得不进行硬分叉,以便与Wasmer一起工作。

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

  • 您的语言(例如,Rust)编译为WebAssembly,并且您想导入WASI。本项目将生成Rust绑定来导入由*.wai描述的WASI API。

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

  • 您正在消费一个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应用程序中的使用可能需要将 wai-bindgen 编译成WebAssembly并发布到NPM。

不过,现在您可以通过CLI探索每种语言中绑定是什么样的。如果您想依赖这个工具,请通过 Slack 联系我们,以便我们为您的用例找到一个更好的解决方案,而不是仅仅依赖CLI工具。

支持的语言

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

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

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

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

  • wasmer - 这是为了使用 wasmer 包的Rust用户。这个生成器通过 wai-bindgen-wasmer 包(位于 crates/wasmer)使用,就像编译成wasm的Rust支持一样,有一个 import! 和一个 export! 宏来生成代码。

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

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

所有生成器都支持 --import--export 标志,在 wai-bindgen CLI 工具中

$ 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。基本上是对于想要使用接口类型而不是原始指针/内存等而不是原始指针/内存等的 Go 用户,可以使用 wasmer-go

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

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

依赖项

~4MB
~112K SLoC