“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
安装。
构建与使用:
- 确保安装了所有依赖项。
- 运行
make
命令进行构建。
用法:
- 示例展示了如何运行一个简单的 Ruby 程序,该程序将 “Hello world” 打印到 stdout。
$ cargo run --package=cli ruby_examples/hello_world.rb
$ wasmtime index.wasm
Hello world
- 也可以通过指向包含 Ruby 文件的目录来预加载文件。
$ cargo run --package=cli -- --preload=prelude/ ruby_examples/use_preludes_and_stdin.rb
$ echo "this is my input" | wasmtime index.wasm
{: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 的错误消息到标准错误流。