Ruvy от компании Spotify — это инструментарий WebAssembly, способный транслировать Ruby-код в модули Wasm, основанный на ruby.wasm. Ruvy реализован на языке Rust и содержит некоторые оптимизации для повышения производительности и упрощения выполнения Wasm-модулей.
Ruvy использует модуль интерпретатора Ruby, предоставляемый ruby.wasm
виртуальной wasi-vfs
файловой системой WASI, для упаковки его в один модуль вместе со всеми указанными исходными файлами Ruby. wasi-vfs
создает виртуальную файловую систему, встроенную в двоичный файл .wasm
, и предоставляет популярный механизм, позволяющий сделать исходные файлы Ruby доступными для чтения ruby.wasm
без предоставления доступа к файловой системе хоста во время выполнения WebAssembly.
Именно здесь Ruvy обеспечивает повышение производительности за счет предварительной инициализации виртуальной машины Ruby при сборке модуля Wasm, в отличие от того, когда он загружается в память для выполнения, как это происходит по умолчанию с ruby.wasm
/ wasi-vfs
. Это повышает производительность во время выполнения на 20 %, — объясняет старший разработчик Shopify Wasm Джефф Чарльз.
Кроме того, объясняет Чарльз, Ruvy сокращает до 30% время, необходимое для компиляции Wasm в собственный код с помощью компилятора Cranelift.
Еще одним преимуществом использования Ruvy, благодаря тому, что он упаковывает все необходимые файлы вместе, является упрощение синтаксиса выполнения, поскольку не требуется путь к файлу в качестве аргумента WASI. Это особенно актуально, например, для различных служб периферийных вычислений, которые не позволяют предоставлять дополнительные аргументы WASI основной функции конечной точки.
На данный момент Ruvy доступен только в виде дистрибутива с исходным кодом, а это значит, что вам необходимо собрать его перед использованием. В принципе, процесс довольно прост, если вы установили все необходимые зависимости , включая rustup
, wasm32-wasi
, cmake
и Rosetta 2
для хостов macOS. После этого вы просто запускаете make
и выполняете Ruvy, как показано в следующем примере, чтобы создать index.wasm
модуль из ruby_examples/hello_world.rb
исходного кода:
$ cargo run --package=cli ruby_examples/hello_world.rb -o index.wasm
Недавно Spotify открыл исходный код Ruvy — это набор инструментов WebAssembly, способный транслировать код Ruby в модули Wasm . Основанный на ruby.wasm
, Ruvy реализован на Rust и включает в себя некоторые оптимизации для повышения производительности и упрощения выполнения модуля Wasm.
Ruvy использует модуль интерпретатора Ruby, предоставляемый ruby.wasm
виртуальной wasi-vfs
файловой системой WASI, для упаковки его в один модуль вместе со всеми указанными исходными файлами Ruby. wasi-vfs
создает виртуальную файловую систему, встроенную в .wasm
двоичный файл, и предоставляет популярный механизм, позволяющий сделать исходные файлы Ruby доступными для чтения ruby.wasm
без предоставления доступа к файловой системе хоста во время выполнения WebAssembly.
Именно здесь Ruvy обеспечивает повышение производительности за счет предварительной инициализации виртуальной машины Ruby при сборке модуля Wasm, в отличие от того, когда он загружается в память для выполнения, как это происходит по умолчанию с ruby.wasm
/ wasi-vfs
. Это повышает производительность во время выполнения на 20 %, — объясняет старший разработчик Shopify Wasm Джефф Чарльз.
По словам Чарльза, Ruvy сокращает до 30% время, которое необходимо для компиляции Wasm в собственный код с помощью компилятора Cranelift.
Еще одно преимущество использования Ruvy: он упаковывает все необходимые файлы вместе, и является упрощением синтаксиса выполнения, поскольку не требуется путь к файлу в качестве аргумента WASI. Это особенно актуально, например, для различных служб периферийных вычислений, которые не позволяют предоставлять дополнительные аргументы WASI основной функции конечной точки.
На данный момент Ruvy доступен только в виде дистрибутива с исходным кодом, а это значит, что вам необходимо собрать его перед использованием. В принципе, процесс довольно прост, если вы установили все необходимые зависимости , включая rustup
, wasm32-wasi
, cmake
и Rosetta 2
для хостов macOS. После этого вы просто запускаете make
и выполняете Ruvy, как показано в следующем примере, чтобы создать index.wasm
модуль из ruby_examples/hello_world.rb
исходного кода:
$ cargo run --package=cli ruby_examples/hello_world.rb -o index.wasm
Как упоминалось выше, вы можете использовать --preload
флаг командной строки, чтобы указать каталог, содержащий файлы Ruby, которые следует передать в виртуальную машину Ruby.
Чарльз подчеркивает, что в настоящее время Ruvy может выполнять только простые Ruby-программы. В частности, он пока не может требовать Ruby gems, что делает недоступными значительные части стандартной библиотеки Ruby. В будущем планируется включить загрузку кода из стандартной библиотеки, а также неродных сторонних гемов, чтобы снять это ограничение.