SlideShare a Scribd company logo
mruby の JIT 解説
三浦英樹
mrubyのJITはtracing JITを採用しています。ざっくり言う
と、命令実行のたびに対応するVMと同等の機械語命令を
命令領域に書きこんでいいき、次にその命令を実行する場
合はその機械語命令を実行するというものです。
OP_LOADSELF R1
OP_LOADI R2, 1
OP_SEND R1, 1
PC
moveEAX, 1
move 8(ECX), EAX
命令を実行しつつ、同等の機械語命令を生成する
/* A sBx R(A) := sBx */
SET_INT_VALUE(regs[GETARG_A(i)], GETARG_sBx(i));
NEXT;
生成コードバッファ
mrubyのJITの概要
mrubyのJITはmrubyにJITコンパイラをいれたものです。
機械語生成にXbyakを使用させてもらっています
>>> Test test <<<
mrbtest - Embeddable Ruby Test
........................................................................................................................................................................
........................................................................................................................................................................
........................................................................................................................................................................
........................................................................................................................................................................
...................................................?...................................................................................................................
.........................................F...................
Skip: Module#prepend super in alias super does not currently work in aliased methods
Fail: multiple assignment (nosplat array rhs) (mrbgems: mruby-test)
- Assertion[1] Failed: Expected "Expected to be equal" to be nil
Expected: nil
Actual: 0
Total: 899
OK: 898
KO: 1
Crash: 0
mrubyのJITはmrubyの5~10倍速い(こと
がある)とかあるけど、一番の売りはこれ
RubyのJITコンパイラなのに脅威の互換性
なぜ脅威なのか?
Rubyは
・ メソッドの再定義が出来る
・ 整数がオーバフローするとBignum
(mrubyはFloat)に勝手に変換される
どちらもせっかく生成したコードが使えなくなる
解決法
自己書き換え
無効になった命令列の先頭にVMに戻る
コードを上書きする
メソッドの再定義
Rubyはメソッドの再定義が可能で、mrubyのmake testは
再定義を多用する
メソッドが再定義されると当然古い定義は無効になるが、
古い定義だけではなく古い定義をcallしている場所も無効
化する必要がある。Inline化している場合もあるし
そこで、古いメソッドの定義の機械語列にはVMに戻るだ
けではなく、呼び出し元のメソッド先頭にVMに戻るコード
をパッチを当てるパッチも当てる (ややこしい)
詳しくは、 
http://qiita.com/miura1729/items/1ab49d34acf3e9e447f8
を見てください
オーバーフロー時の処理
mrubyのJITでは直前の演算結果の型を記録しておいて
型のガードを省略している
ところが、オーバーフローするとFixnumだと思っていたら、
Floatが来るかもしれないからガードが省略できない
そこで、オーバーフローは起きないものとしてコンパイル
し、オーバーフローしたらコードを無効化して、コンパイル
しなおす。irep(mrubyの命令列の構造体)にはオーバフ
ローするかのフラグを増やしている。
問題点
パッチを当てて無効化したコードはなにもせず放置するの
で非常にメモリがもったいない
コードを細分化して管理してGCみたいなものが求められる

More Related Content

What's hot

Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
nothingcosmos
 
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)洋史 東平
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
LINE Corporation
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
Tomoya Kawanishi
 
Node 学園祭 2012 用
Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用
Rei Kawai
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
ksk sue
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-mainShotaro Uchida
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
YARV INTRODUCTION
YARV INTRODUCTIONYARV INTRODUCTION
YARV INTRODUCTION
5t111111
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
MITSUNARI Shigeo
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29
ryuz88
 
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2Computational Materials Science Initiative
 
Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 half
tomoaki0705
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
MITSUNARI Shigeo
 
【続編】その ionice、ほんとに効いてますか?
【続編】その ionice、ほんとに効いてますか?【続編】その ionice、ほんとに効いてますか?
【続編】その ionice、ほんとに効いてますか?
Narimichi Takamura
 
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
UnityTechnologiesJapan002
 
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
UnityTechnologiesJapan002
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料
marsee101
 

What's hot (20)

Bhyve Internals
Bhyve InternalsBhyve Internals
Bhyve Internals
 
Adaptive optimization of JIT compiler
Adaptive optimization of JIT compilerAdaptive optimization of JIT compiler
Adaptive optimization of JIT compiler
 
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
clu2cは64ビットOSでも使えます (OSC 2012 Hiroshima LT用資料)
 
SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話SpectreとMeltdown:最近のCPUの深い話
SpectreとMeltdown:最近のCPUの深い話
 
きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回きつねさんでもわかるLlvm読書会 第2回
きつねさんでもわかるLlvm読書会 第2回
 
Node 学園祭 2012 用
Node 学園祭 2012 用Node 学園祭 2012 用
Node 学園祭 2012 用
 
Androidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃうAndroidとfpgaを高速fifo通信させちゃう
Androidとfpgaを高速fifo通信させちゃう
 
20apr2012 kernelvm7-main
20apr2012 kernelvm7-main20apr2012 kernelvm7-main
20apr2012 kernelvm7-main
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
YARV INTRODUCTION
YARV INTRODUCTIONYARV INTRODUCTION
YARV INTRODUCTION
 
Spectre/Meltdownとその派生
Spectre/Meltdownとその派生Spectre/Meltdownとその派生
Spectre/Meltdownとその派生
 
Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29Verilator勉強会 2021/05/29
Verilator勉強会 2021/05/29
 
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
CMSI計算科学技術特論A(9) 高速化チューニングとその関連技術2
 
Cvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 halfCvim saisentan 半精度浮動小数点数 half
Cvim saisentan 半精度浮動小数点数 half
 
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl汎用性と高速性を目指したペアリング暗号ライブラリ mcl
汎用性と高速性を目指したペアリング暗号ライブラリ mcl
 
【続編】その ionice、ほんとに効いてますか?
【続編】その ionice、ほんとに効いてますか?【続編】その ionice、ほんとに効いてますか?
【続編】その ionice、ほんとに効いてますか?
 
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
 
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
【Unite Tokyo 2019】「禍つヴァールハイト」最大100人同時プレイ!モバイルオンラインゲームの実装テクニック
 
FPGAスタートアップ資料
FPGAスタートアップ資料FPGAスタートアップ資料
FPGAスタートアップ資料
 
MMIO on VT-x
MMIO on VT-xMMIO on VT-x
MMIO on VT-x
 

Similar to Mruby jitプレゼン

軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
Ryosuke MATSUMOTO
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
Izumi Tsutsui
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
y-uti
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# Developers
Takayoshi Tanaka
 
Rds 2008 R2 Express Editionで遊んでみよう
Rds 2008 R2 Express Editionで遊んでみようRds 2008 R2 Express Editionで遊んでみよう
Rds 2008 R2 Express Editionで遊んでみようguest468ec6
 
Preludeのprecompile
PreludeのprecompilePreludeのprecompile
Preludeのprecompile
Glass_saga
 
テスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめテスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめ
kinunori
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohamaTetsuya Chiba
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine
Asuka Nakajima
 
EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたkyon mm
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
Noboru Irieda
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Takashi Sogabe
 
L-R
L-RL-R
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
Kazuaki Tanaka
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
imasahiro
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Developers Summit
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)Daisuke Ikeda
 

Similar to Mruby jitプレゼン (20)

軽量Ruby『mruby』について
軽量Ruby『mruby』について軽量Ruby『mruby』について
軽量Ruby『mruby』について
 
d-kami x86-1
d-kami x86-1d-kami x86-1
d-kami x86-1
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラーNode.jsでつくるNode.js ミニインタープリター&コンパイラー
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
 
JIT のコードを読んでみた
JIT のコードを読んでみたJIT のコードを読んでみた
JIT のコードを読んでみた
 
d-kami x86-2
d-kami x86-2d-kami x86-2
d-kami x86-2
 
The Next Generation for C# Developers
The Next Generation for C# DevelopersThe Next Generation for C# Developers
The Next Generation for C# Developers
 
Rds 2008 R2 Express Editionで遊んでみよう
Rds 2008 R2 Express Editionで遊んでみようRds 2008 R2 Express Editionで遊んでみよう
Rds 2008 R2 Express Editionで遊んでみよう
 
Preludeのprecompile
PreludeのprecompilePreludeのprecompile
Preludeのprecompile
 
テスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめテスト駆動で行うネットワーク自動化のすすめ
テスト駆動で行うネットワーク自動化のすすめ
 
20121217 jawsug-yokohama
20121217 jawsug-yokohama20121217 jawsug-yokohama
20121217 jawsug-yokohama
 
技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine技術紹介: S2E: Selective Symbolic Execution Engine
技術紹介: S2E: Selective Symbolic Execution Engine
 
EmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べたEmitJSの環境をちょこっと調べた
EmitJSの環境をちょこっと調べた
 
Python physicalcomputing
Python physicalcomputingPython physicalcomputing
Python physicalcomputing
 
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
Devsumi2013 Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
L-R
L-RL-R
L-R
 
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
ET2014資料: mruby プログラム言語Rubyによる組込みソト開発
 
RubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRubyRubyKaigi2014: Just in Time compiler for CRuby
RubyKaigi2014: Just in Time compiler for CRuby
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
クラウド環境向けZabbixカスタマイズ紹介(第5回Zabbix勉強会)
 

Mruby jitプレゼン