最近,Spotify 开源了Ruvy,一个 WebAssembly 工具链,能够将 Ruby 代码转换为 Wasm 模块。Ruvy 基于ruby.wasm, 用 Rust 实现,提升了性能并简化了 Wasm 模块的执行。
Ruvy 利用了ruby.wasm
提供的 Ruby 解释器模块,并使用wasi-vfs (WASI 虚拟文件系统)将其与所有指定的 Ruby 源文件一起打包到单个模块中。wasi-vfs
创建了一个虚拟文件系统并嵌入到.wasm
二进制文件中,它提供了一种机制,让 Ruby 源文件对ruby.wasm
可读,但不允许在 WebAssembly 运行时访问主机文件系统。
在构建 Wasm 模块时预先初始化 Ruby VM,而不是在将其加载到内存中执行时(默认使用ruby.wasm
/wasi-vfs
),从而提升了性能。Shopify 高级 Wasm 开发人员 Jeff Charles 解释说,这将使运行时性能提升了 20%。
此外,Charles 解释说,Ruvy 使得使用 Cranelift 编译器将 Wasm 编译成本机代码所需的时间缩短至 30%。
Ruvy 的另一个好处是,由于它将所有必需的文件打包在一起,不需要文件路径作为 WASI 参数,因而简化了执行语法。这对于各种边缘计算服务来说特别有用,因为这些服务不允许向主要端点函数提供额外的 WASI 参数。
目前,Ruvy 只提供了源代码发行版,所以你需要自行进行构建。这个过程很简单,原则上,在安装了所有必需的依赖项,包括rustup
、wasm32-wasi
、cmake
和 Rosetta 2
(macOS)之后,只需运行make
,然后像下面的示例一样执行 Ruvy 来从ruby_examples/hello_world.rb
创建index.wasm
模块:
如上所述,你可以使用--preload
命令行标志来指定包含 Ruby 文件的目录,这些文件应该会被传给 Ruby VM。
Charles 强调,Ruvy 目前只能运行简单的 Ruby 程序。具体来说,它还不能require
Ruby gem,也就是说大部分 Ruby 标准库仍然不可用。未来,他们计划支持从标准库和非本地第三方 gem 中加载代码以消除这一限制。
原文链接:
评论