9月25日、DenoはRustベースのV8バインディング「Rusty V8」が安定版としてリリースされたことを発表した。Rusty V8は、JavaScriptエンジンV8のC++ APIをゼロオーバーヘッドでRustに統合するライブラリであり、5年間にわたる開発と150以上のリリースを経て、3.1百万回以上のダウンロード数を記録している。このリリースにより、Rusty V8は本格的なプロダクション環境での利用が推奨される安定版となった。
Rusty V8は、バージョン129.0.0として初めて安定版リリースが行われた。これはChromeのバージョニングに合わせたもので、今後もChrome V8エンジンと同期したリリースが行われる予定である。このバージョンではAPIの安定性が保証され、これまでの0.xリリースを超えて、Rustベースの開発者にとって信頼性のあるツールとして位置づけられることとなった。
Rusty V8の特徴
Rusty V8は、以下のような特徴を持つ:
- カスタムJavaScriptランタイムの構築:Rusty V8を使えば、埋め込みデバイス、サーバーレス環境、プラグインシステムなど、さまざまな用途に応じたカスタムJavaScriptランタイムを構築できる。
- WebAssemblyモジュールの実行:WebAssembly(Wasm)モジュールをシームレスに実行でき、高性能なコードをJavaScriptと併用可能である。
- V8インスペクタの利用:JavaScriptランタイムにデバッグ機能やプロファイリング機能を追加できるV8インスペクタに対応している。
- V8 Fast APIの活用:Rustの関数をJavaScriptから最小限のオーバーヘッドで呼び出すことができ、高パフォーマンスが求められるアプリケーションに最適である。
- 自動メモリ管理:V8のcppgcガベージコレクタにより、手動でメモリを管理する必要が減り、複雑なアプリケーションでも効率的なメモリ管理が可能となる。
Rusty V8の利用方法
以下に、Rusty V8を使用してRustプログラムにJavaScriptを埋め込む簡単な例を示す:
fn main() {
let platform = v8::new_default_platform(0, false).make_shared();
v8::V8::initialize_platform(platform);
v8::V8::initialize();
let isolate = &mut v8::Isolate::new(v8::CreateParams::default());
let handle_scope = &mut v8::HandleScope::new(isolate);
let context = v8::Context::new(handle_scope, Default::default());
let scope = &mut v8::ContextScope::new(handle_scope, context);
let code = v8::String::new(scope, "'Hello' + ' World!'").unwrap();
let script = v8::Script::compile(scope, code, None).unwrap();
let result = script.run(scope).unwrap();
let result = result.to_string(scope).unwrap();
println!("{}", result.to_rust_string_lossy(scope));
}
Rusty V8は、C++ APIと比較してメモリ安全性が高い点が強みである。Rustでは、Local<T>
のようなハンドルが特定のスコープに紐付けられ、コンパイル時に強制される。この仕組みにより、無効なハンドルを使用するバグを防ぎ、C++開発者が手動で管理しなければならない問題を解決する。
let isolate = &mut v8::Isolate::new(Default::default());
{
let scope1 = &mut v8::HandleScope::new(isolate);
let local = v8::Integer::new(scope1, 123);
let invalid_local = {
let scope2 = &mut v8::HandleScope::new(scope1);
v8::Integer::new(scope2, 456)
};
}
バージョン管理
Rusty V8はChrome V8と同じバージョニングスキームを採用しており、Chrome 129に対応するバージョン129.0.0が最初の安定版である。V8はセマンティックバージョニング(semver)を遵守していないため、マイナーバージョンでも破壊的な変更が加えられることがあるが、Rusty V8はAPIの互換性と安定性を確保するためにsemverを遵守する。
今後、Rusty V8は4週間ごとにV8の依存関係をアップグレードし、メジャーバージョンが更新される。このため、Rusty V8 APIの破壊的な変更は、V8のアップグレード時にのみ発生することとなる。
詳細はAnnouncing Stable V8 Bindings for Rustを参照していただきたい。