“Ruvy” 是一个旨在将 Ruby 代码转换为 WebAssembly(Wasm)并在其上运行的工具链项目。

以下是关于该仓库的一些重要信息:

构建:

  • 必须安装的依赖项包括最新版本的 Rust、wasm32-wasi(通过 rustup 安装)、cmake、以及 wasmtime-cli 和 cargo-wasi 等工具。

开发:

  • Ruvy 使用了 wizer 来初始化 Ruby VM 并执行传递给 wasm 的 Ruby 代码。还需要 wasm32-wasi 和 cmake 的支持。
  • 使用 wasmtime-cli 和 cargo-wasi 进行开发,其中 wasmtime-cli 可以通过 cargo install wasmtime-cli 安装。

构建与使用:

  1. 确保安装了所有依赖项。
  2. 运行 make 命令进行构建。

用法:

  • 示例展示了如何运行一个简单的 Ruby 程序,该程序将 “Hello world” 打印到 stdout。
    1. $ cargo run --package=cli ruby_examples/hello_world.rb
    2. $ wasmtime index.wasm
    3. Hello world
  • 也可以通过指向包含 Ruby 文件的目录来预加载文件。
    1. $ cargo run --package=cli -- --preload=prelude/ ruby_examples/use_preludes_and_stdin.rb
    2. $ echo "this is my input" | wasmtime index.wasm
    3. {:discount_input=>"this is my input", :value=>100.0}

贡献的想法:

  • 提高与 Shopify Functions 的兼容性。
  • 调查和改进 Ruvy 模块的性能,考虑使用 YJIT 输出 WebAssembly 的方法。
  • 缩小模块的大小,将解释器分离成一个引擎 Wasm 模块,该模块导出内存和可以被包含 Ruby 源代码的 Wasm 模块导入的函数。
  • 启用从 Wasm 导出命名函数,调用 Ruby 代码中的命名函数,以便可以导出多个函数。
  • 启用使用 require 和 Ruby gems。目前,使用 preload 目录中的代码是添加依赖项的唯一方法。应该可以实现 require 并加载标准库和第三方 gem 中不是原生 gem 的代码。

其他:

  • 输出 Ruby VM 的错误消息到标准错误流。