メドピア開発者ブログ

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

RubyKaigi 2023 セッションレポート Day2

バックエンドエンジニアの貞元勝幸(@greendrop269)です。
RubyKaigi 2023で長野県松本市に来ています。2日目(5/12)に聞いたセッションについて、いくつか紹介していきたいと思います。

タイムテーブル

タイムテーブルは以下から確認できます。 rubykaigi.org

How resolve Gem dependencies in your code?

How resolve Gem dependencies in your code? - RubyKaigi 2023

RubyGems, Bundlerがどのように依存を解決しているかというお話しでした。

普段、rubyを書く中でgemを使用するためにgem install や bundle installを使用していると思います。 使用する側は、使用したいgemを指定するだけですが、そのgemが依存しているgemも取得する必要があります。 その依存を解決しているResolver Engineは、RubyGems, Bundlerで異なっています。

  • RubyGems: Molinillo
  • Bundler: v2.4からPubGrub
    • PubGrubはDart言語のパッケージマネージャーpubで使用されている次世代の依存解決アルゴリズム

また今後は、RubyGemsもPubGrubになるそうです。

RubyGems, BundlerのResolver Engine

そして、以下のようなRubyGems, Bundlerの例から、複雑さが垣間見れました。

  • C Extensionのgemで、リモートではOKだが、ローカルではNGとなる
  • bundle update --conservative rails で期待通りのgem以外が対象になる

Rubyで開発する中で、RubyGems, Bundlerは当たり前のように使用しており、日々進化していてとても支えられていると感じました。

Revisiting TypeProf - IDE support as a primary feature

Revisiting TypeProf - IDE support as a primary feature - RubyKaigi 2023

現在開発中のTypeProfのv2に関するお話でした。 TypeProfとは、Ruby 3.0から標準搭載されている静的型解析器のことです。 型解析ができることにより、変数の型チェックやメソッドの補完など開発者体験を向上させることができます。

発表ではまず最初にTypeProf v2を使ってVSCodeでの開発デモがありました。

推論された型情報が表示されている様子

推論された型情報が表示されたり、型注釈を記述した状態で型が合わない場合にエラーがリアルタイムに表示されるデモでした。

TypeProf v1では、解析速度に大きな課題がありIDEでのサポートも難しかったようです。

そこで、TypeProf v2では解析速度の向上とIDEでのサポートを目標として再開発することになりました。 v2ではデータフローグラフを用いて、解析結果を差分更新することで、パフォーマンスの向上を目指しました。 Rubyのコードをデータフローグラフに変換し、それを用いて型情報を伝播させることで、型推論を行います。 呼び出すメソッドが変更された際は、変更があった部分のみ新しいグラフを作成してその部分のみ型情報を更新します。

コード変更時のデータフローグラフ

v1ではコードの変更があった際にコードすべてに対して型推論を行っていたのに対し、 v2ではコードの変更があった部分のみ型情報の伝搬を行うことでコード変更時の型推論の速度向上が見込めます。

その結果、解析にかかるパフォーマンスは以下のように大きく改善されたようです。

  • v1: 約3秒
  • v2: 初回は約1秒、コードの変更時は0.029秒

今後の展望としては、キーワード引数や例外などの対応やIDE機能の改善などを行い、Ruby 3.3までに実用可能にすることを目指すようです。

私の感想としてはVSCodeでのデモを見たときにリアルタイムに型情報が更新されてとても驚きました。 最近はGitHub Copilotなどのツールで開発者体験の向上が話題になっていますが、 静的型解析によってより正確により安全に開発することができ、開発者体験がさらに向上するのではないかととても期待が高まる発表でした。

Introduction of new features for VS Code debugging

Introduction of new features for VS Code debugging - RubyKaigi 2023

VS Codeを使用したデバッグの新機能、Trace inspectorとDebug Visualizerのお話でした。

まず、Trace inspectorについてですが、ブレークポイント間の処理内容を保存しておき、それを表示したものとなります。 これがない場合、ブレークポイントから一つずつステップインしながらデバッグすることになり、どのメソッドが呼ばれたかなど忘れてしまうことがあるので、Trace inspectorはとても便利だと感じました。 デフォルトの設定では、呼ばれたメソッドの引数と戻り値を記録していますが、「record and replay」を有効にすることでローカル変数の状態も記録できるようになっていました。

https://github.com/ruby/debug/pull/959

Debug Visualizerは、すでにVS Codeの拡張機能であり、それをRubyに対応させたものとなります。 デモでは、ArrayやHash、NokogiriオブジェクトやActiverecordオブジェクトをグラフや表、ツリー形式などで表示されており、見やすいなものとなっていました。

https://github.com/hediet/vscode-debug-visualizer

Trace inspectorやDebug Visualizerを使用することで、さらに開発者が行う調査や生産性が向上すると感じました。

Optimizing YJIT’s Performance, from Inception to Production

Optimizing YJIT’s Performance, from Inception to Production - RubyKaigi 2023

YJITのパフォーマンス最適化についてのお話しでした。 この中で、印象に残ったものを紹介したいと思います。

まず、パフォーマンス最適化を行うためにYJIT用のペンチマークを準備されていました。 これによりYJIT開発者は簡単にベンチマークを実行できる環境となっていました。

https://github.com/Shopify/yjit-bench

YJIT-Bench

次に、メモリ使用に対するコードGCです。 初期化処理など一度しか実行されないようなものは、マシンコードが開放されていました。

コードGC

ベンチマーク手法やメモリ使用の改善などによるパフォーマンス最適化がRuby 3.2 よりさらに進んでいるので、Ruby 3.3のYJITが楽しみに感じています。

おわりに

私が参加したDay2のセッションでは、IDE向けの機能やYJITなど、今後使ってみたいと思うものが多かったように感じました!
Day3の記事も公開予定なのでぜひご覧ください。


是非読者になってください


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

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

medpeer.co.jp

■エンジニア紹介ページはこちら

engineer.medpeer.co.jp