こんにちは!2022 年にWantedly に新卒入社し、DX Squad でエンジニアをしている大森です。
今回は、日本最大の Ruby に関するカンファレンスである RubyKaigi に Wantedly がスポンサードし、いくつかの講演を聴講しています。Wantedly はスポンサーブースを設けていて、Twitterをフォローしてくださった方には技術書や開発に役立つ Engineering Handbook をプレゼントしています!
Wantedly では Ruby が多く使われており、Ruby に関する最新情報を聞けてとても参考になりました。
本記事では、1日目のKeynoteである Ruby meets WebAssembly について紹介させていただきます。
Ruby meets Webassembly
RubyKaigi公式ページ: https://rubykaigi.org/2022/presentations/kateinoigakukun.html#day1
スライド: https://speakerdeck.com/kateinoigakukun/ruby-meets-webassembly
Ruby 3.2 から Webassembly がサポートされます。本発表は、実際に Webassembly サポートの実装を行った Ruby コミッターの方の発表でした。
発表は二部構成になっていました。
- WebAssembly 上で動く Ruby の紹介
- Introduction to Ruby on WebAssembly
- Ruby インタプリタを WebAssembly 上に移植する際の技術的詳細
- Technical details: How to port the Ruby Interpreter
WebAssembly 上で動く Ruby の紹介
モチベーション
まず、Ruby を WebAssembly 上で動かすことへのモチベーションが語られました。
WebAssembly とは、最近のウェブブラウザ上で動作するスタックベースの仮想マシンのバイナリ命令フォーマットのことです。ブラウザ上でプログラムを実行したい場合、基本的には JavaScript を実行する必要がありました。しかし、WebAssembly を利用することで、Rust や Go といったプログラミング言語から生成したバイナリをネイティブに近い言語で実行する事ができます。
Ruby は開発者フレンドリーに設計されており、プログラムを高速に書くことができます。しかし、Ruby を実行する環境が限られていることや、インストールすること自体が難しいことから、初心者が学ぶ言語としては難しいと言われていました。
そのため、どんな環境でも簡単にRuby を動かしたいというのがモチベーションになったようです。
Ruby on WebAssembly
Ruby のインタプリタ(CRuby) が WebAssembly で実装され、最近のブラウザ上で Ruby のコードが実行できることのデモが行われました。
https://irb-wasm.vercel.app/
上のURLから irb がブラウザ上で動作していることを確認することができます!
ライブデモで行われていたように、https://github.com/DannyBen/victor/tree/master/examples#examples を動作させてみました。
上のスクリーンショットから、svg がブラウザ上にレンダリングされている事がわかります。
このように、手元に環境がなくても GitHub 上の gem の example を実行できることは初学者だけでなく、慣れているユーザにとっても便利なものであることが体験できました。
この後、ブラウザだけでなく edge の WebAssembly 上で Ruby を動作させるデモと、仕組みの説明が行われました。
デモへのリンクはこちらです。
https://ruby-compute-runtime-demo.edgecompute.app/
アクセスするたびに表示される時間が変わります。
このコードは https://www.fastly.com/products/edge-compute 上で実行されているようです。
WebAssembly Support
Ruby3.2 から WebAssembly サポートが行われるようになり、https://github.com/ruby/ruby.wasm リポジトリで npm package と、WebAssembly 向けにコンパイル済の Ruby を配布しているそうです。
Ruby インタプリタを WebAssembly 上に移植する際の技術的詳細
Ruby をブラウザと edge の WebAssembly で動かすデモのあと、Ruby インタプリタを WebAssembly 上に移植する際の困難だった事柄などの説明が行われました。
CRuby を WebAssembly に移植する際に、3つの困難があります。
- Exception
- Fiber
- Conservative GC
これらの困難を一挙に解決するのが Asyncify という技術だそうです。
Asyncify については web.dev に記事があったので後で読んで勉強しようと思っています...!
感想
WebAssembly が昨今取りざたされていますが、具体的にどう便利なのかはつかめずにいました。しかし、今回のデモのように触れる形で示して頂いたおかげで、実際に便利さがわかりました。
WebAssembly や、それに関連する技術について興味がでてきたのでこれからもウォッチしていこうと思います。
また、ブラウザだけでなく edge サーバで動く Ruby についても、なにか面白い用途がありそうだなと思っています。
興味深い発表をありがとうございました!
まだRubyKaigiは始まったばかりです。
Wantedlyから参加したエンジニアが他の記事をどんどん出していきます。そちらも御覧ください↓↓↓
初日に公開した振り返りブログ#2~5