RubyがWebAssemblyのWASI対応へ前進。ブラウザでもサーバでもエッジでもどこでもWebAssembly版Rubyが動くように

今回は「RubyがWebAssemblyのWASI対応へ前進。ブラウザでもサーバでもエッジでもどこでもWebAssembly版Rubyが動くように」についてご紹介します。

関連ワード (ブラウザ、実装、発生等) についても参考にしながら、ぜひ本記事について議論していってくださいね。

本記事は、Publickey様で掲載されている内容を参考にしておりますので、より詳しく内容を知りたい方は、ページ下の元記事リンクより参照ください。


Ruby言語のリファレンス実装、すなわち事実上の標準となっているRubyインタプリタはC言語で実装されています。そのため、このRubyインタプリタもしくはそのソースコードは一般に「CRuby」(もしくは、まつもとゆきひろ氏による実装という意味でMRI:Matz’ Ruby Implementation)と呼ばれています。

CRubyのソースコードをコンパイルすることで、Windows対応Rubyインタプリタのバイナリ形式やLinux対応Rubyインタプリタのバイナリ形式などが生成されるわけです。

今年、2022年1月7日、このCRubyのソースコードに対する要望チケット「Proposal to merge WASI based WebAssembly support」が提起されました。

fig

これはCRubyのソースコードを、WASI対応のWebAssemblyバイナリ形式にコンパイル可能にするための変更を要求するものです。

そして約1週間後の1月15日、このチケットがRubyのパパであるまつもとゆきひろ氏によって承認されました。

fig

これは何を意味するのでしょうか?

WASI対応のWebAssemblyバイナリはOSに依存しなくなる

WebAssemblyはもともとWebブラウザ上で高速に実行できるバイナリフォーマットとして開発されました。

その後、WebブラウザからWebAssemblyのランタイムを切り離してOS上で実行可能にしたランタイム、例えばLucetやWasmerといったWebAssemblyランタイムが登場します。

これによりWebAssemblyバイナリはWebブラウザだけでなく、WindowsやmacOSやLinuxなどのOS上でも実行可能になりました。

しかしWebAssemblyで現実的なアプリケーションを作る場合、ほぼ必ずOSのファイルシステムへのアクセスなどが発生します。すると、アプリケーションからOSのシステムコールを呼ぶことになります。

アプリケーションからOSを呼び出すAPIはOSに依存するため、アプリケーションをOSの作法に合わせて記述することになります。これではOSに依存しないポータブルなWebAssemblyアプリケーションの実装は困難です。

そこで登場したのが、WebAssemblyのアプリケーションに対してOSのシステムコールを抽象化することでOS依存をなくし、ポータブルなWebAssemblyアプリケーションを実現する業界標準仕様のAPI「WebAssembly System Interface」(WASI)です。

WebAssemblyランタイムがWASIに対応し、WebAssemblyアプリケーションがWASIを呼び出せるように作られていれば、そのWebAssemlbyアプリケーションはWebブラウザでもWindowsやMacなどのデスクトップでも、Linuxなどのサーバサイドやエッジでも動くポータブルなもの(WebAssemblyバイナリ)となります。

WASIはWebAssemblyバイナリをポータブルにするためのAPIなのです。

そして現在、多くのWebAssemblyランタイムがWASI対応を実現しており、ファイルシステムを持たないWebブラウザであっても仮想ファイルシステムを持たせてWASI対応を実現する、というランタイムが登場しています。

参考:WebAssemblyランタイム「Wasmer 2.1」リリース。WASI用に仮想ファイルシステムを実装し、ブラウザでもWASIが利用可能に

WASI対応WebAssemblyバイナリがポータブルであるという世界は、かなり現実的になってきています。

どこでもRubyコードが実行できるようになる

今回承認されたチケットは、CRubyのソースコードをwasi-sdkと呼ばれるWebAssemblyのビルドツールを用いてビルドすることにより、WASI対応のWebAssemblyバイナリの生成が出来るようにするための変更です。

このWebAssemblyバイナリが1つあれば、WASI対応のWebAssemblyランタイムがあるところであればどこでも、Webブラウザでもサーバサイドでもエッジでも、Rubyインタプリタが実行できるようになり、どこでもそのインタプリタ上でRubyのコードを実行できるようになるわけです。

RubyのアプリケーションをWebAssemblyバイナリにしてWebAssemblyランタイム上で動かすのではなく、RubyインタプリタそのものをWebAssemblyバイナリにするところが最大のポイントです。こうすることで、既存のRubyアプリケーションのコードを再コンパイルすることなく、そのまま動かせるようになるのです。

こうした、WebAssembly上にプログラミング言語のランタイムを実装する取り組みは、すでにRuby以外の言語でも行われています。

PythonにはPyodideと呼ばれるPythonランタイムのWebAssemblyによる実装があり、WebブラウザやNode.jsでPythonコードを走らせることができるようになっています。

マイクロソフトのBlazor WebAssemblyはさらに大がかりなアプローチといえます。WebAssemblyの上に.NETフレームワークを実装することで、Webブラウザ上でC#など.NETのアプリケーションを実行可能にしています。

これにより.NETプログラマはJavaScriptが書けなくてもWebアプリケーションが書けるのです。

参考:[速報」Blazor WebAssemblyが正式リリース。C#/.NETでWebアプリケーションを開発可能に。Microsoft Build 2020

RubyもCRubyがEmscriptenと呼ばれるWebAssemblyのコンパイラには対応しているとされています。

しかしいずれもWASI対応はまだのようで、今回のRubyによるWASI対応は先進的な取り組みではないかと思われます。

おおよその作業は完了、残る課題は

Publickeyでは、今回のチケットを起案したkatei (Yuta Saito)氏に、現状や見通しなどをうかがいました。

Katei氏によるとCRubyの移植自体に関してはおおよその作業は完了しており、残る課題は実行パフォーマンスの改善、RubyGemsやBundlerなど周辺ツールとの連携が主になるとのこと。

さらに、現在WebAssemblyバイナリに埋め込み可能なVFS(仮想ファイルシステム)を開発しており、ここに「.rb」ファイルを埋め込むことで、シングルファイルでRubyアプリケーションまでデプロイ可能にする、という開発も進めているとのことです。

このVFSはRuby以外にも適用可能だそうで、さまざまな用途に利用できそうです。

Webブラウザやサーバサイド、エッジなどで気軽にRubyが実行できるようになるとき、また新たなRubyの用途が開けていくかもしれません。期待したいところです。

COMMENTS


Recommended

TITLE
CATEGORY
DATE
NTT ComとJR-Cross、会員基盤と位置情報を活用したセグメントマーケティングで実証実験
IT関連
2023-01-12 09:08
ピクミンと“歩く”新作アプリ年内配信へ 任天堂とNianticが共同開発 「ピクミンGOではないです」
くらテク
2021-03-24 02:59
NATOのセキュリティ機関、ポスト量子ソリューションで通信をセキュアに–試験実施
IT関連
2022-03-04 16:56
WeedmapsのiPhoneアプリで大麻購入が可能に
パブリック / ダイバーシティ
2021-08-13 21:43
米スーパーKrogerが初の大規模ロボット化フルフィルメントセンターをオハイオに開設
ロボティクス
2021-04-17 21:00
在宅ワークのお供、TechCrunch Japanスタッフの愛用ヘッドフォンたち
ハードウェア
2021-05-16 23:42
暴露型ランサムウェア、被害の75%は従業員500人以下の中堅中小企業–トレンドマイクロ調査
IT関連
2023-02-14 04:33
徳島県鳴門市、対話を数値化する「Hylable Discussion」を小・中学校に導入
IT関連
2024-07-07 08:53
サッポログループ物流、請求書の9割をデジタル化–物流業界のDXを促進
IT関連
2022-06-25 13:32
AI時代に必要とされる「データが行動を促す」ための新しいアプローチ
IT関連
2021-06-03 12:41
ブラウザー「Vivaldi 4.0」、メールとカレンダーのクライアント組み込み–RSSリーダーも
IT関連
2021-06-10 22:43
NetflixがECサイト「Netflix.shop」を米国でオープン 新進アーティストとアニメやドラマのコラボ商品を展開
企業・業界動向
2021-06-12 23:33
メルペイ、ニトリホールディングスにコード決済サービスを提供
IT関連
2024-02-21 06:41
トレンドマイクロ、5G向けセキュリティ機能を発表–富士通と実証
IT関連
2021-04-08 07:29