Shopify 开源 Ruvy,一个从 Ruby 代码创建 Wasm 模块的工具链

Ruvy:Spotify开源的Ruby到WebAssembly工具链

Ruvy是由Spotify开源的一款WebAssembly工具链,能够将Ruby代码转换为Wasm模块。它基于ruby.wasm,并使用Rust实现,包含了一些优化措施以提升性能并简化Wasm模块的执行。

关键功能与技术细节

  1. 依赖ruby.wasmwasi-vfs

    • Ruvy利用ruby.wasm提供的Ruby解释器模块,并通过wasi-vfs(WASI虚拟文件系统)将所有指定的Ruby源文件打包成一个单独的模块。
    • wasi-vfs.wasm二进制文件中嵌入了一个虚拟文件系统,使得Ruby源文件可以在不访问主机文件系统的情况下被ruby.wasm读取。
  2. 性能优化

    • 与默认的ruby.wasm/wasi-vfs不同,Ruvy在构建Wasm模块时预先初始化Ruby VM,而不是在加载到内存时才进行初始化。这一优化使得运行时性能提升了20%。
    • 使用Cranelift编译器将Wasm编译为原生代码的时间缩短了30%。
  3. 简化执行语法

    • 由于Ruvy将所有所需文件打包在一起,执行时不再需要提供文件路径作为WASI参数,这对于不允许提供额外WASI参数的边缘计算服务尤为重要。

当前状态与使用

  • 源代码分发:目前Ruvy仅以源代码形式提供,使用前需要自行构建。构建过程相对简单,依赖项包括rustupwasm32-wasicmake以及macOS上的Rosetta 2。构建完成后,可以通过命令行工具将Ruby代码转换为Wasm模块。

    示例命令:

    $ cargo run --package=cli ruby_examples/hello_world.rb -o index.wasm
  • 预加载功能:可以使用--preload命令行标志指定包含Ruby文件的目录,这些文件将被传递给Ruby VM。

局限性与未来计划

  • 当前限制:Ruvy目前只能运行简单的Ruby程序,尚不支持require Ruby gems,因此大部分Ruby标准库无法使用。
  • 未来计划:未来计划支持从标准库以及非原生第三方gems加载代码,以消除这一限制。

总结

Ruvy是一个将Ruby代码转换为Wasm模块的工具链,通过预初始化Ruby VM和优化编译过程显著提升了性能。尽管当前功能有限,但其简化执行语法和性能优化使其在边缘计算等场景中具有潜在优势。未来,Ruvy计划扩展对Ruby标准库和第三方gems的支持,进一步提升其应用范围。

阅读 30
0 条评论