Rabbit Slide Show

Rubyによる本気のGC

2012-09-15

Description

なぜあなたはCでGCを書くのですか? 本当はRubyで書きたいですよね? この 発表では(J)RubyでGCを書く方法を示します。ToyのGCじゃなくて、本気のGCを Rubyで書けます!(の予定)

Text

Page: 1

Rubyによる本気の
GC
Serious GC with Ruby
@nari3
#sprk2012
2012/9/15
ネットワーク応用通信研究所
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 2

提供
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 3

うなぎの件
<URL:https://www.wantedly.com/projects/478>
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 4

自己紹介
✓ 中村成洋/@nari3/nari/authorNari
✓ CRubyのコミッタ
✓ GCメンテナ&デストロイヤ
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 5

GCとは(ry

Page: 6

GoogleTrendでみるGC

Page: 7


        

Page: 8


        

Page: 9


        

Page: 10


        

Page: 11

休日の検索数が
さがっている

Page: 12

つまり
✓ 平日
✓ お仕事でGCを作るリア充
✓ もしくはGCバグに悩まされる一般ピ
ープルが多い
✓ 休日
✓ 趣味でGCをいじる人が少ない
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 13

GCはまだまだ愛されてい
ない

Page: 14

ちなみに:年末も異常に検索
されている
リアルGCの恐れ..
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 15

とにかく
GCをもっと
よく知りましょう!

Page: 16

徹底解剖G1GC
 実装編
正式版公開!!
(無料配布)

Page: 17

この場を借りて本書のス
ポンサーのみなさまあり
がとうございます
m(_ _)m

Page: 18

Ruby2.0 の GC update

Page: 19

偉い人がいってた

Page: 20

「全力で潰す」
http://www.flickr.com/photos/recompile_net/5952564080

Page: 21

Matz mashes something,
so we mash something.

Page: 22

僕もなにか潰したい!

Page: 23

REE is dead
<URL:http://blog.phusion.nl/2012/02/21/ruby-enterprise-
edition-1-8-7-2012-02-released-end-of-life-imminent/>
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 24

諸君らが愛したREEは死
んだ。
なぜだ!

Page: 25


        

Page: 26


        

Page: 27


        

Page: 28

BitmapMarking
✓ fork使うようなプログラムで嬉
しいはず
✓ Passengerなどで恩恵があるらし
い
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 29

REEつぶしたった
(^o^)

Page: 30

最近の悩み:
Kijiは
どうやって潰そうか…

Page: 31

本題

Page: 32

RubyでGCを書くという
お話

Page: 33

動機(1)

Page: 34

RubyKaigi Driven
Development

Page: 35

過去のRubyKaigiの発表...
✓ LazySweepGC - RubyKaigi2008
✓ LonglifeGC - 2009
✓ LazySweepGC - 2010
✓ ParallelMarkingGC - 2011
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 36

全部Cの話やないか!

Page: 37

Rubyの話、させてください

Page: 38

動機(2)

Page: 39


        

Page: 40

結論:C死ね。
[cited from `卜部昌平のあまりreblogしないtumblr']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 41

ほんとどのGCは
C or C++で書かれている
しなぁ…

Page: 42

な ぜCで書く必 要が あ
る?ないはずだよ。ち
ゃんと調査すればJava
とかC#とか、ひょっと
したらOCamlやScalaで
でも用は足りる場合が
ほとんどなんだ。
[cited from `卜部昌平のあまりreblogしないtumblr']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 43


        

Page: 44

RubyでGC
書いてみよう!

Page: 45

素直に考えると...

Page: 46


        

Page: 47


        

Page: 48

これはあまり意味がない
✓ 下にいるGCの性能に影響をう
ける
✓ 性能評価しづらい
✓ 下のGCが遅いと、上のGCも遅くな
る
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 49

これはあまり意味がない
✓ 言語処理系にGCは1つあればい
いですよ感
✓ 無駄に話が複雑になっているような
気がする
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 50

もっと違うアプローチを
考えよう!

Page: 51

Meta-circular evaluator

Page: 52

An evaluator that is
written in the same
language
that
it
evaluates is said to be
metacircular.
[cited from `4.1 The Metacircular Evaluator - SICP']
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 53

簡単な例:
LISPでLISP書いたった

Page: 54

他の具体例を調べてみる

Page: 55


        

Page: 56

もう少し詳しく
✓ RPython(Restricted Python)で実
装
✓ Pythonの言語サブセット
✓ RPython -> C/LLVM/Java..
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 57

変換イメージ

Page: 58


        

Page: 59


        

Page: 60


        

Page: 61


        

Page: 62

重要なポイント

Page: 63


        

Page: 64

GCも
RPythonで書
かれている

Page: 65

疑問

Page: 66

GC動作中のGCはどうするの
か?
✓ GC動作中にGCが起きて、その
動作中にGCが起きて…
✓ GCの無限ループ...?
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 67

RPython
✓ GC中はGC対象のオブジェクト
を作らないように気を付ける
(たぶん)
✓ mallocなどで直接メモリを切り出す
✓ libffiを利用
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 68

GC中にGCが走ることは
ない

Page: 69


        

Page: 70

仕組み(ry

Page: 71

ただし
✓ GCをRubyで書く仕組みがない
✓ 今考えればRubiniusをいじったほうが
よかったかも…?
✓ まぁいいか...
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 72


        

Page: 73

JikesRVM
✓ RVM(Research Virtual Machine) = 研究用VM
✓ GC,VM周りでたくさん論文が書かれ
ている
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 74

JikesRVM
✓ GCもJavaで書かれている
✓ プロジェクト委員の一人が
Rechard Jones(RJGC著者)
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 75

直接オブジェクトファイルを
吐く
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 76

GCもJavaで書ける
✓ 一緒にオブジェクトファイルに
変換される
✓ GC中はGCが発生しない
✓ PyPyと同じ理由
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 77

JikesRVMの功績は
「GCをJavaでかける」
だけではない

Page: 78

GC部分がMMTkという
別部品に切り離されてい
る

Page: 79

MMTk(Memory Management
Tool kit)
✓ GCを11個保有
✓ ツールキットなのでGC用の便
利メソッドが沢山ある
✓ GCづくりが簡単
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 80

MMTk(Memory Management
Tool kit)
✓ VMからメモリ管理を別の部品
として切り離せる
✓ VMは取り替え可能
✓ JikesRVM
✓ Harness
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 81


        

Page: 82


        

Page: 83


        

Page: 84

やたー!
GC書き放題!

Page: 85


        

Page: 86

Javaで…

Page: 87

Rubyで書きたい…ッ!!

Page: 88


        

Page: 89


        

Page: 90

われわれにはJRubyがあ
るじゃないか

Page: 91


        

Page: 92


        

Page: 93

この部分を
ライブラリ化

Page: 94

Regicide

Page: 95

Regicde = 国王殺し
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 96


        

Page: 97

サンプルコード

Page: 98

オブジェクトの定義
class FixnumValue < Regicide::Mutator::ObjectValue
# ...
end
Regicide::Mutator::ObjectValueを継承
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 99

オブジェクト生成
class FixnumValue < Regicide::Mutator::ObjectValue
# Fixnumをフィールドに持つ
# オブジェクトを割り当てるメソッド
def self.from_i(mutator, i)
...
end
end
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 100

from_i
# メモリ割り当て
ptr = mutator.alloc(0, 1, mutator.current_stack.pc)
# オブジェクト生成
v = self.new(ptr)
# Fixnumを格納
mutator.store_data_field(v.object_value, 0,
org.vmmagic.unboxed.Word.from_long(i))
return v
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 101

M&S GCは4行で書ける
class MSConstraints < org.mmtk.plan.marksweep.MSConstraints; end
class MS < org.mmtk.plan.marksweep.MS; end
class MSCollector < org.mmtk.plan.marksweep.MSCollector; end
class MSMutator < org.mmtk.plan.marksweep.MSMutator; end
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 102

動作するサンプル
↓
<URL:https://github.com/authorNari/regicide/tree/master/
sample>

Page: 103

苦労話

Page: 104

Java+JRuby
✓ JRuby側からJavaを使うのは簡
単
✓ メソッド呼び出し
✓ 継承とかとか
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 105

Java+JRuby
✓ Java側からJRubyを使うのは難
しい
✓ けっこう意外だった
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 106

どいうことか?

Page: 107


        

Page: 108


        

Page: 109

どうやるの
(?_?)

Page: 110

RedBridge

Page: 111

RedBridge
✓ @yokoletさん作(感謝!)
✓ Javaの中でJRubyの実行環境
(コンテナ)を作る
✓ コンテナにソースコードぶちこんだ
り、Rubyコード片を評価できる
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 112


        

Page: 113

イメージ
public static void foo(void) {
// JRuby実行環境作って
ScriptingContainer sc =
new ScriptingContainer();
// さっきのJRubyFooクラスを読み込み
Object jrubyFooClass =
sc.runScriptlet(PathType.ABSOLUTE, "foo.rb");
// JRubyFoo.fooを呼び出す
sc.callMethod(fooClass, "foo", Object.class);
}
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 114

Regicideでは
この辺の技術を
なんやかんや
使ってます

Page: 115

Regicideの悪いところ

Page: 116

VM作るのめんどい

Page: 117

けっきょくVMは書かないと
いけない
✓ GCを評価するためにはある程
度ちゃんとしたものが必要
✓ でもVMとか興味ないしさぁ…
✓ LISPすら作るのが億劫
✓ 飽きてきた
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 118

JVMのGCの
影響を受ける

Page: 119


        

Page: 120


        

Page: 121

ふつうにJavaのコードとして動かす感
じ

Page: 122

JVMのGCに引っ張られる
✓ 性能が引っ張られる
✓ GC停止も不可能だしきちんと性能評
価しづらそう
✓ 論文とか書きづらそう
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 123

変換ができればいいのに…
✓ JikesRVMのブートストラップ
部分にJRubyを突っ込む
✓ うまく動かなかった
✓ JRubyがJikesRVMの秘孔を付いているらしい
✓ JikesRVMがまだ未熟
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 124

Regicideの良いところ

Page: 125

VMが自分で書ける

Page: 126

言語処理系が自前で書ける
✓ GCにすごく優しい処理系とか
書ける
✓ 言語処理系ひっくるめて検討で
きる
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 127

おいしいところは全部Ruby
で書ける
✓ VM, GC, 全部Rubyで書ける
✓ Cみたいに阿鼻叫喚しなくてい
い(かもしれない)
✓ 生産性が100倍(らしい)
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 128

勝手に処理系が速くなる感
✓ JVM速くなる = Regicide速くな
る
✓ WIN-WIN(笑)
✓ Cでも一緒か…
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 129

ほかのGCと比較可能
✓ 十数個のGCと性能比較ができ
る
✓ 起動時のオプションを少しいじ
るだけでOK
✓ 論文とかかけるかもしれない!
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 130

githubにあげています
authorNari/regicide

Page: 131

今後の展開

Page: 132

作ってみて気づいたこと
✓ GC部分は外っ面がRubyなだけ
で実はCとあまり変わらない感
じ…
✓ これならCで書いても一緒なのでは…
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 133

作ってみて気づいたこと
✓ 実はGC実装に特化したミニ言
語が欲しいだけなのか…?
✓ 今後はそちら方面で攻めてみたい
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 134

まとめ

Page: 135

まとめ
✓ やっぱりRubyの話できなかっ
た
✓ C死ねと思って作ったRegicide
がすでに死にそう
Rubyによる本気のGC - Serious GC with Ruby
Powered by Rabbit 2.0.5

Page: 136

ご清聴
ありがとう
ございました

Page: 137


        

Other slides

RUBYLAND
2013-06-29