5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Ruby】MJITとかYJITよくわからなかったので勉強してみました

Last updated at Posted at 2024-05-14

どうもこんにちは。

今回はRubyKaigi 2024に参加するにあたって、Rubyの処理系についてよくわかっていなかったので勉強してみました。

特に、以下の記事を参考にしています。

処理系って何?

「処理系って言われても具体的に何を指しているの?」と思ったのでググってみると、

処理系とは、「言語処理系」のことらしいです。
言語処理系とは、RubyやPython、Javaなどの言語を処理して、実行できるようにするためのソフトウェアのようです。

ということは、言語処理系というソフトウェアによって、Rubyで書いたコードが解釈されてコンピュータ内で実行できる形にしてくれているということですね!

Rubyで使用されている処理系

Rubyでは以下の処理系が使用されているようです。

  • 公式の処理系
    • MRI (Matz' Ruby Implementation)
  • その他の処理系
    • JRuby
    • IronRuby
    • MacRuby
    • Rubinius
    • MagLev
    • Cardinal
    • Ruby.NET
    • XRuby
    • HotRuby

公式の処理系であるMRIは、C言語で動作しているのでCRubyとも呼ばれているようです。

JITとは

MJITとかYJITとか。これらは、JITというコンパイラの一種だそうです。
JITは、「Just In Time」というフレーズの略語で、「必要な分を、必要な時に」コンパイルするコンパイラだそうです。

コンパイラといえばC言語が思い浮かびますが、C言語の場合は事前にコンパイルして処理を実行します。
JITは同じコンパイラでもコンパイルのタイミングなどが違うらしいです。

JITは、MRIなどの言語処理系に組み込まれているものなのでC言語で実装されています。

言語処理系に欠かせないAST

少し前に、「Rubyで書いたコードが解釈されてコンピュータ内で実行できる形にしてくれている」と記述しましたが、これには AST(抽象構文木)という存在が欠かせません。
これは、構文解析の結果を木構造で表したデータです。

言語処理が行われるときには、「字句解析」「構文解析」が行われ、ASTに解析結果が保存されるという流れを踏んでいるようです。

Rubyの歴史とともに

ここからは、Rubyの歴史とともに、どのようにコンパイラが実装されていったのかを学んでいきます。

Ruby1.8以前

Ruby1.8以前では、JITは使用されていなかったようです。そのため、以下のようにコードが実行されます。

  1. Rubyのコードを読み込む
  2. 字句解析が行われる
  3. 構文解析が行われる
  4. ASTに解析結果が保存される
  5. C言語で書かれたプログラムが解析結果を読んで処理が実行される

Ruby1.9以降

Ruby1.9からは少し変わりました。新たにYARVというバイトコードインタプリタが使われています。YARVもMRIに組み込まれたインタプリタなので、C言語で実装されています。

  1. Rubyのコードを読み込む
  2. 字句解析が行われる
  3. 構文解析が行われる
  4. ASTに解析結果が保存される
  5. 解析結果をYARV命令列(バイトコード) にコンパイルする
  6. YARV命令列をYARVが実行する

Ruby1.8以前のようにC言語で直接Rubyコードの解析結果を参照するよりも、バイトコードに変換してからYARVで処理を行うことでRubyのコードが高速で実行されるようになったようです。

MJIT登場

Ruby2.6からは、MJITが登場しました。

  1. Rubyのコードを読み込む
  2. 字句解析が行われる
  3. 構文解析が行われる
  4. ASTに解析結果が保存される
  5. 解析結果をYARV命令列(バイトコード) にコンパイルする
  6. YARV命令列の一部をC言語に変換する
  7. 変換したコードをgccコンパイルする
  8. コンパイルされた機械語をYARVが実行する

Ruby1.9時点では、YARV命令列(バイトコード)をYARVで実行していましたが、
MJITでは、YARV命令列(バイトコード)をC言語化して先にコンパイルすることでYARVの処理がさらに高速化する仕組みだそうです。

難しいです...(~_~)ホヘー

YJIT登場

Ruby3.2からは、YJITが登場しました。

  1. Rubyのコードを読み込む
  2. 字句解析が行われる
  3. 構文解析が行われる
  4. ASTに解析結果が保存される
  5. 解析結果をYARV命令列(バイトコード) にコンパイルする
  6. YARV命令列をIR(中間表現)を使用して機械語に変換する
  7. 機械語をYARVが実行する

IR(中間表現)を使用して機械語に変換することで、さらに処理が早くなるらしいです。
C言語/gccコンパイルではなく、IRを使用して機械語に変更するようにしたことで、x86_64(AMD64)アーキテクチャだけでなく、ARM64アーキテクチャでも動くようになったとか...

難しいです...(~_~)ホヘー

RubyKaigi 2024では、以下のセッションでJITのお話が聞けるようですね。(日本語翻訳で聞けたらいいな...)

まとめ

初めてJITについて調べてみましたが、難しいお話でした...

RubyKaigiでしっかり吸収してきます。

5
1
1

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
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?