Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CRubyの命令ディスパッチのしくみ
Search
utsubo
May 28, 2026
78
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
CRubyの命令ディスパッチのしくみ
utsubo
May 28, 2026
More Decks by utsubo
See All by utsubo
slide.pdf
utsubo256
1
71
Kaigi on Rails 2025を楽しむためにやったこと
utsubo256
1
16
Shikumi.rb のしくみ
utsubo256
1
32
first_time_lt_meeting_16.pdf
utsubo256
1
76
RubyKaigi 2025振り返り 最大限楽しむためにやったこと/Kaigi Effect
utsubo256
1
76
Featured
See All Featured
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Code Reviewing Like a Champion
maltzj
528
40k
New Earth Scene 8
popppiees
3
2.4k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
160
エンジニアに許された特別な時間の終わり
watany
107
250k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
170
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.4k
Crafting Experiences
bethany
1
190
The Pragmatic Product Professional
lauravandoore
37
7.3k
Docker and Python
trallard
47
3.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Transcript
CRuby の命令ディスパッチのしくみ utsubo 2026/5/28 柏.rb #23
自己紹介 utsubo (@utsubo1024) FBC 生 Shikumi.rb を主催しています 最近ハマっていること: YARV の
しくみ
命令ディスパッチとは ここでの命令とはISeq に並ぶopcode のこと 参照: YARV Maniacs 【第 3 回】
命令ディスパッチの高速化 https://magazine.rubyist.net/articles/0008/0008-YarvManiacs.html 命令によってそれに応じた処理をさせること
今回は 1 + 2 * 3 を例にして、 命令ディスパッチのしくみを深掘りしていきます!
1 + 2 * 3 のコンパイル結果 ruby 4.0.3 で実行
どこで実行されるか
命令ディスパッチの実装 vm.c:97-105 (vm_exec_core() 内) v4.0.3 のソースコードを参照
マクロ展開 make V=1 vm.i を実行して、 vm.c を前処理( マクロ展開等) した vm.i
ファイルを作成する
展開されたINSN_DISPATCH() vm.i *reg_pc: 次に実行する命令ハンドラのアドレス
命令ハンドラ 各opcode に対応した、その命令を実装するC コードの実装部分。 insns.def に各opcode の定義が書かれていて、ビルド時に vm.inc ファイル に変換され、vm_exec_core
関数内でinclude される。 命令ディスパッチ opcode に応じた処理をさせること 命令ハンドラ その処理の実装部分
命令ハンドラの実装 例. 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 でジャ ンプする
まとめ 1 + 2 * 3 はISeq にコンパイルされる ISeq にはopcode
とoperand が並んでいる CRuby のVM はopcode に対応する命令ハンドラへ制御 を移しながら処理を実行している VM がopcode に応じて命令ハンドラへ制御を移す処理 を命令ディスパッチと呼ぶ