メドピア開発者ブログ

集合知により医療を再発明しようと邁進しているヘルステックカンパニーのエンジニアブログです。読者に有用な情報発信ができるよう心がけたいので応援のほどよろしくお願いします。

RubyKaigi 2022 セッションレポート Day 1

バックエンドエンジニアの田中悠大(@ytnk531)です。 RubyKaigi 2022で三重県に来ています。1日目(9/8)に聞いたセッションについて、簡単に紹介させていただきます。

Ruby meets WebAssembly

Ruby meets WebAssembly - RubyKaigi 2022

RubyのWebAssembly (WASM) 対応についての発表でした。WebAssemblyの基礎から、WASM対応のテクニカルな難しさまで、非常にわかりやすく丁寧に説明されており、聴きごたえのある素晴らしい発表でした。 特にデモがおもしろく、思わずスゴイ!とうなってしまうものばかりでした。

RubyのWASM対応にあたっては、ExceptionやFiberで利用する特殊な制御をWASM上で再現するのに特に苦労されたそうです。Asyncifyという技術を使うことで、うまく解決できたそうです。

パフォーマンスについてはCRubyの半分くらい、mrubyと同等くらいだそうで、十分実用ができそうですね。WASMで書かれたRubyインタプリタの容量は数十MBで少し大きのですが、圧縮すれば数MBになるそうです。より小さくするためのアイディアがいくつかあるそうなので、今後にも期待が持てますね。

Building a Lightweight IR and Backend for YJIT

Building a Lightweight IR and Backend for YJIT - RubyKaigi 2022

Ruby 3.1から利用できるようになったYJITを拡張するために、YJIT IRというIR(中間表現)を導入するお話でした。

現状のYJITは、YARV命令列からx86-64用のアセンブラを生成し、そこからマシンコードを生成しています。このため、M1 Macなどで使われるARM64のCPUでは動作しません。 ARM64でも動くようにするために、直接ARM64のアセンブラを生成するのではなく、中間表現を生成するアプローチをとったそうです。

従来はYARV命令列→x86-64マシンコードとコンパイルしていたのですが今後は、YARV命令列→中間表現(YJIT IR)→x86-64マシンコード or ARM64マシンコードとコンパイルしていくようになります。

RISC-Vなど他のアーキテクチャへの対応も展望に入れているそうで、その時の手間を少なくすることなども見据えて中間表現を導入することにしたようです。

発表の中では、中間表現の設計や、最適化の方法について詳細が語られました。ARM64とx86-64の違いをうまく吸収するのがすごく難しそうでした。

最終的にARM64対応ができたが、まだちょっとバグがあるとのことです。今後はYJIT IRの最適化をやってスピードアップを目指していくようです。

Adding Type Signatures into Ruby Docs

Adding Type Signatures into Ruby Docs - RubyKaigi 2022

rubyapi.orgをメンテナンスしているColbyさんの発表でした。rubyapi.orgでは、Rubyのドキュメントを見やすい形で公開していて、より仕様をわかりやすくするためにRBSの型注釈を利用したというお話でした。

RDocには、Call Sequenceという場所に呼び出しと返り値を記述できるのですが、厳密なフォーマットの定めはありません。Call Sequenceをより正確にわかりやすくするために、RBSを用いて自動生成できるようにしたという内容でした。せっかく型情報があるのだから、ドキュメントからもみれるようにしよう、ということですね。 それだけでなく、RBSの出力も読みやすく工夫したそうです。

RDocとRBSの型情報が組み合わされば仕様の把握がしやすくなるので、Rubyがより使いやすくなりそうです。

Towards Ruby 4 JIT

Towards Ruby 4 JIT - RubyKaigi 2022

Ruby 4に向けたJITの取り組みの紹介と、最適化の余地についてのお話でした。主な話題は下記の4つでした。

  • MJIT, YJITの仕組みの説明
  • MJITをモンキーパッチできるインターフェースの説明
  • JITのベンチマークの仕方の説明
  • JITの最適化の余地

RubyにはMJITとYJITという、2つのJITコンパイラが実装されています。MJITはYARV命令列からC言語を生成して、gccをコンパイルしてマシンコードを生成します。対して、YJITはYARV命令例からx86-84のアセンブラを生成してマシンコードを得ます。

MJITでJITコンパイルを実行するモジュールはRubyで書かれていて、このモジュールをモンキーパッチすることでJITの動作を変更できるそうです。 だからみんなもJITを改良してRubyを速くしようぜ!ということのようです。

JITを改良したら、それがどのくらい良いか測定したいよねということで、yjit-benchの紹介もありました。

今後の目論見として、Ruby 4はJavaScriptくらい速くしたい、とのことでした。そのためのJITによる最適化の余地と課題の説明がありました。

ざっくりまとめると、みんなもJITコンパイラ書こうな!といった内容でした。

おわりに

1日目だけでも、非常に興味深い発表ばかりでした。2日以降も気になったセッションがあればレポートを投稿する予定です。


メドピアでは一緒に働く仲間を募集しています。 ご応募をお待ちしております!

■募集ポジションはこちら

https://medpeer.co.jp/recruit/entry/

■開発環境はこちら

https://medpeer.co.jp/recruit/workplace/development.html