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

CRubyの命令ディスパッチのしくみ

Avatar for utsubo utsubo
May 28, 2026
68

 CRubyの命令ディスパッチのしくみ

Avatar for utsubo

utsubo

May 28, 2026

Transcript

  1. 命令ディスパッチとは ここでの命令とはISeq に並ぶopcode のこと 参照: YARV Maniacs 【第 3 回】

    命令ディスパッチの高速化 https://magazine.rubyist.net/articles/0008/0008-YarvManiacs.html 命令によってそれに応じた処理をさせること
  2. 命令ハンドラ 各opcode に対応した、その命令を実装するC コードの実装部分。 insns.def に各opcode の定義が書かれていて、ビルド時に vm.inc ファイル に変換され、vm_exec_core

    関数内でinclude される。 命令ディスパッチ opcode に応じた処理をさせること 命令ハンドラ その処理の実装部分
  3. 命令ハンドラの実装 例. putobject vm.inc:861-888 874 行目のADD_PC(INSN_AT TR(width)); pc を次の命令ハンドラのアドレス位置 まで進める

    880 行目のINC_SP(INSN_AT TR(sp_inc)) スタックを1 つ増やす 881 行目のTOPN(0) = val; そのスタックにval を書き込む 887 行目のEND_INSN(putobject); *reg_pc の命令ハンドラへgoto でジャ ンプする
  4. まとめ 1 + 2 * 3 はISeq にコンパイルされる ISeq にはopcode

    とoperand が並んでいる CRuby のVM はopcode に対応する命令ハンドラへ制御 を移しながら処理を実行している VM がopcode に応じて命令ハンドラへ制御を移す処理 を命令ディスパッチと呼ぶ