LoginSignup
46
18

【Ruby1.8以前から】Rubyの処理系とJIT【Ruby3.2のYJITまで】

Last updated at Posted at 2023-01-19

はじめに

Ruby3.2 で YJIT がついに実用段階になりました!

なので YJIT について理解するために、JIT 導入前の Ruby、MJIT、そして YJIT についてそれぞれどんな特徴があるのか簡単に調べてみました。

Rubyの処理系

最初に Ruby の処理系についてです。処理系、特に 言語処理系 と呼ばれるものは、何らかのプログラミング言語を処理して実行可能にするためのソフトウェアです。Rubyの代表的な処理系は MRI (Matz's Ruby Interpreter) です。C言語で書かれた Ruby なので CRuby とも呼ばれます。

MRI 以外にも Ruby 処理系はたくさんあります。Ruby Association の以下のページに様々な処理系が紹介されています。

本記事では MRI (CRuby) の簡単なしくみから YJIT までを簡単に紹介します。

JIT が導入される前の Ruby

JIT について説明するまえに、JIT を使わない通常の Ruby がどんなものか調べてみました。
書籍「Rubyのしくみ」によると、Ruby 1.8 以前とRuby 1.9 以降で流れが少し異なります。

Ruby 1.8 以前

Ruby 1.8 以前では、以下のような流れで Ruby のコードが実行されます。

  1. Rubyのコード を字句解析と構文解析により 構文木(AST) に変換
  2. C言語で書かれたプログラムが 構文木 を解釈して実行

Ruby 1.9 以降

Ruby 1.9 以降では、以下のような流れで Ruby のコードが実行されます。

  1. Rubyのコード を字句解析と構文解析により 構文木(AST) に変換
  2. 構文木を YARV命令列(バイトコード) にコンパイル
  3. YARV 命令をYARVが実行

Ruby 1.9で YARV (Yet Another Ruby VM) というものが出てきました。
YARV はバイトコードを実行する仮想マシンです。YARV 命令列に変換してから YARV で実行することで、高速に実行されるようになりました。

Ruby 2.6で導入された MJIT

Ruby 2.6で MJIT が導入されました。

JIT (Just-In-Timeコンパイラ) は実行時コンパイラとも呼ばれる、実行時にコンパイルするコンパイラです。逆に、C言語やC++など事前にコンパイルするコンパイラはAOT(Ahead-Of-Timeコンパイラ)と呼ぶそうです。

Ruby の JIT である MJIT はYARV命令列に変換する点は Ruby 1.9 以降と同じですが、YARV 命令の一部をC言語に変換、Cコンパイラに渡してコンパイル & 実行する、という特徴があります。

YJIT

そして、最後に YJIT (Yet Another Ruby JIT) です。
MJIT は YARV 命令を C言語に変換しているのに対し、 YJIT は 中間表現 (IR)を経由して機械語にまで変換を行います。
Ruby 3.1では直接機械語に変換していたため一部の環境でしか実行できませんでしたが、その中間表現を経由することで様々な環境で動作するようになり、Ruby 3.2 で実用段階になりました。

また、ShopifyがRailsアプリケーションを高速化するために開発した JIT であり、速いことも特徴です。
Lazy Basic Block Versioning という手法が採用されており、それが高速化に関連しているようです。

Ruby 3.2.0 リリースページ に掲載されている以下の画像のように、ActiveRecord が 1.6倍速くなるらしいです。

X9ulfac.png

おわりに

まだまだそれぞれの詳細については調べられていないので、また時間のある時に調べてみようと思います!

余談ですが、Qiita株式会社では Ruby3 新機能の社内勉強会を開催しており、この記事もその一環で記載しました!
Devトークも募集しておりますので、社内勉強会についてや Ruby3 新機能についてお話ししましょう!

参考文献

46
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
46
18