Upgrade to Pro — share decks privately, control downloads, hide ads and more …

RubyKaigi2025事後勉強会_JITがRubyを高速にする

 RubyKaigi2025事後勉強会_JITがRubyを高速にする

RubyKaigi2025に参加した際の社内事後勉強会にて発表したスライドです。

Avatar for Taira Komai

Taira Komai

March 25, 2026

More Decks by Taira Komai

Other Decks in Programming

Transcript

  1. プログラムの実行方式の比較 JITって何? 種類 説明 特徴 インタプリタ ソースコードを1行ずつ解釈し ながら実行 コードをすぐに実行できるが 遅い

    コンパイラ(AOT) 事前に全部機械語に変換し てから実行 高速だがコンパイルの手間 がかかる JIT 実行時に必要な部分だけコ ンパイル 両者の中間、良いとこ取り
  2. • Ruby 1.8以前 1. Rubyのコード を字句解析と構文解析により 構文木(AST) に変換 2. C言語で書かれたプログラムが

    構文木 を解釈して実行 Rubyにおける JIT 引用:https://qiita.com/wataru86/items/ab2d1b507c8d67c73281
  3. • Ruby 1.9以降 1. Rubyのコード を字句解析と構文解析により 構文木(AST) に変換 2. 構文木を

    YARV命令列(バイトコード) にコンパイル 3. YARV 命令をYARVが実行 Rubyにおける JIT 引用:https://qiita.com/wataru86/items/ab2d1b507c8d67c73281
  4. MJIT • Ruby 2.6で導入 Ruby の JIT である MJIT はYARV命令列に変換する点は

    Ruby 1.9 以降と同じですが、YARV 命令の一部をC言語に 変換、Cコンパイラに渡してコンパイル & 実行する、という特徴があります。 Rubyにおける JIT 引用:https://qiita.com/wataru86/items/ab2d1b507c8d67c73281
  5. YJIT(Yet Another Ruby JIT) • Ruby 3.1から一部導入され、Ruby 3.3から安定化 MJIT は

    YARV 命令を C言語に変換しているのに対し、 YJIT は 中間表現 (IR)を経由して機械語にまで変換を行いま す。また中間表現を経由することで様々な環境で動作するようになりました。 Rubyにおける JIT 引用:https://qiita.com/wataru86/items/ab2d1b507c8d67c73281
  6. YJITで速くなる理由は LBBVにある • LBBV(Lazy Basic Block Versioning) ◦ JITコンパイラにおける最適化技法の1つで、「実行時の型情報 に応じて

    Basic Block を複製・最適化する」手法 • Basic Block(基本ブロック) ◦ 入口が1つ、出口が1つの内部に分岐を含まない直線的な命令 列。 なぜYJITで速くなるのか、 LBBVについて
  7. なぜYJITで速くなるのか、 LBBVについて • Rubyのような動的型付け言語では、 x.to_iという単純なコードの中にも、 xの型によって処理 の分岐が発生 • この型のコンテキスト毎に Basic

    Blockを複数バージョン生成して保持すれば、そのブロックの 中では特定の型であることを前提したコードを生成し型検査を削除できる。また、この型コンテ キストは後続のBasic Blockにも引き継ぐことができる。