rabbit-slide-nari-serious-GC-with-Ruby 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rabbit +1 -0
- data/README.rd +28 -0
- data/Rakefile +2 -0
- data/config.yaml +16 -0
- data/images/c_must_die_00.png +0 -0
- data/images/cruby_on_gc.png +0 -0
- data/images/gcbook.jpeg +0 -0
- data/images/google_trend_00.png +0 -0
- data/images/google_trend_01.png +0 -0
- data/images/google_trend_02.png +0 -0
- data/images/google_trend_02_with_gray.png +0 -0
- data/images/google_trend_03.png +0 -0
- data/images/google_trend_04.png +0 -0
- data/images/jikesrvm.png +0 -0
- data/images/jikesrvm_01.png +0 -0
- data/images/jruby_plus_java_00.png +0 -0
- data/images/jruby_plus_java_01.png +0 -0
- data/images/matz.jpg +0 -0
- data/images/misawa_akita.gif +0 -0
- data/images/misawa_beihei.gif +0 -0
- data/images/misawa_riakai.gif +0 -0
- data/images/misawa_tamesita.gif +0 -0
- data/images/mmtk_00.png +0 -0
- data/images/mmtk_01.png +0 -0
- data/images/mmtk_02.png +0 -0
- data/images/mmtk_03.png +0 -0
- data/images/mmtk_04.png +0 -0
- data/images/mmtk_05.png +0 -0
- data/images/nacl_logo.png +0 -0
- data/images/nacl_wantedly.png +0 -0
- data/images/phusion_passenger_01.png +0 -0
- data/images/phusion_passenger_02.png +0 -0
- data/images/phusion_passenger_03.png +0 -0
- data/images/pypy.png +0 -0
- data/images/pypy_translate_00.png +0 -0
- data/images/pypy_translate_01.png +0 -0
- data/images/pypy_translate_02.png +0 -0
- data/images/pypy_translate_03.png +0 -0
- data/images/pypy_translate_03_with_gray.png +0 -0
- data/images/pypy_translate_04.png +0 -0
- data/images/regicide.png +0 -0
- data/images/regicide_bad_00.png +0 -0
- data/images/regicide_bad_01.png +0 -0
- data/images/regicide_bad_02.png +0 -0
- data/images/regicide_mmtk_00.png +0 -0
- data/images/regicide_mmtk_01.png +0 -0
- data/images/regicide_mmtk_02.png +0 -0
- data/images/rubinius.png +0 -0
- data/images/rubybridge.png +0 -0
- data/images/slam_01.jpg +0 -0
- data/pdf/serious-GC-with-Ruby-serious-GC-with-Ruby.pdf +0 -0
- data/serious-GC-with-Ruby.pdf +0 -0
- data/serious-GC-with-Ruby.rab +928 -0
- metadata +119 -0
data/.rabbit
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
serious-GC-with-Ruby.rab
|
data/README.rd
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
= Rubyによる本気のGC
|
2
|
+
|
3
|
+
なぜあなたはCでGCを書くのですか? 本当はRubyで書きたいですよね? この
|
4
|
+
発表では(J)RubyでGCを書く方法を示します。ToyのGCじゃなくて、本気のGCを
|
5
|
+
Rubyで書けます!(の予定)
|
6
|
+
|
7
|
+
== For author
|
8
|
+
|
9
|
+
@nari3
|
10
|
+
|
11
|
+
=== Show
|
12
|
+
|
13
|
+
rake
|
14
|
+
|
15
|
+
=== Publish
|
16
|
+
|
17
|
+
rake publish
|
18
|
+
|
19
|
+
== For viewers
|
20
|
+
|
21
|
+
=== Install
|
22
|
+
|
23
|
+
gem install rabbit-slide-nari-serious-GC-with-Ruby
|
24
|
+
|
25
|
+
=== Show
|
26
|
+
|
27
|
+
rabbit rabbit-slide-nari-serious-GC-with-Ruby.gem
|
28
|
+
|
data/Rakefile
ADDED
data/config.yaml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
---
|
2
|
+
id: serious-GC-with-Ruby
|
3
|
+
base_name: serious-GC-with-Ruby
|
4
|
+
tags:
|
5
|
+
- gc
|
6
|
+
- ruby
|
7
|
+
presentation_date: 2012/09/15
|
8
|
+
version: 1.0.0
|
9
|
+
licenses:
|
10
|
+
- CC BY-SA 3.0
|
11
|
+
author:
|
12
|
+
markup_language: :rd
|
13
|
+
name: Narihiro Nakamura
|
14
|
+
email: authornari@gmail.com
|
15
|
+
rubygems_user: nari
|
16
|
+
slideshare_user: authorNari
|
Binary file
|
Binary file
|
data/images/gcbook.jpeg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/jikesrvm.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/matz.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/mmtk_00.png
ADDED
Binary file
|
data/images/mmtk_01.png
ADDED
Binary file
|
data/images/mmtk_02.png
ADDED
Binary file
|
data/images/mmtk_03.png
ADDED
Binary file
|
data/images/mmtk_04.png
ADDED
Binary file
|
data/images/mmtk_05.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/pypy.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/regicide.png
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
data/images/rubinius.png
ADDED
Binary file
|
Binary file
|
data/images/slam_01.jpg
ADDED
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,928 @@
|
|
1
|
+
= Rubyによる本気のGC
|
2
|
+
|
3
|
+
: subtitle
|
4
|
+
Serious GC with Ruby
|
5
|
+
: author
|
6
|
+
@nari3
|
7
|
+
: content-source
|
8
|
+
#sprk2012
|
9
|
+
: date
|
10
|
+
2012/9/15
|
11
|
+
: institution
|
12
|
+
ネットワーク応用通信研究所
|
13
|
+
: allotted-time
|
14
|
+
25m
|
15
|
+
: theme
|
16
|
+
nari
|
17
|
+
|
18
|
+
# 目標枚数 : 140枚
|
19
|
+
|
20
|
+
== Note
|
21
|
+
準備: information, ペンモード(右クリック+右下)
|
22
|
+
|
23
|
+
札幌自体は過去のすべてをリモート参戦していました。感極まりますね。
|
24
|
+
|
25
|
+
= 提供
|
26
|
+
|
27
|
+
# image
|
28
|
+
# src = images/nacl_logo.png
|
29
|
+
# relative_width = 90
|
30
|
+
|
31
|
+
== スライドプロパティ
|
32
|
+
: size
|
33
|
+
8
|
34
|
+
|
35
|
+
== Note
|
36
|
+
このプレゼンテーションの提供は、オープンソースフロンティア、協調と革新のNaClの提供でお贈りします。
|
37
|
+
|
38
|
+
札幌までの交通費を出していただきました。
|
39
|
+
|
40
|
+
札幌RubyKaigiで発表するならNaClに入るしかない。
|
41
|
+
|
42
|
+
= うなぎの件
|
43
|
+
|
44
|
+
# image
|
45
|
+
# src = images/nacl_wantedly.png
|
46
|
+
# relative_width = 90
|
47
|
+
(('tag:x-small:((<URL:https://www.wantedly.com/projects/478>))'))
|
48
|
+
|
49
|
+
== p
|
50
|
+
: size
|
51
|
+
2
|
52
|
+
|
53
|
+
== Note
|
54
|
+
|
55
|
+
Wantedlyでうなぎ食べられる感じのやつを出しています。
|
56
|
+
|
57
|
+
弊社に興味がある方はぜひ。ひやかしはお断りしております。
|
58
|
+
|
59
|
+
= 自己紹介
|
60
|
+
* 中村成洋/@nari3/nari/authorNari
|
61
|
+
* CRubyのコミッタ
|
62
|
+
* (('wait'))GCメンテナ&デストロイヤ
|
63
|
+
|
64
|
+
= GCとは(ry
|
65
|
+
|
66
|
+
== Note
|
67
|
+
ガーベッジコレクションの略ですね。
|
68
|
+
|
69
|
+
= ((*GoogleTrendでみるGC*))
|
70
|
+
|
71
|
+
= ((' '))
|
72
|
+
|
73
|
+
== p
|
74
|
+
:background-image
|
75
|
+
images/google_trend_00.png
|
76
|
+
:background-image-relative-width
|
77
|
+
90
|
78
|
+
|
79
|
+
= ((' '))
|
80
|
+
|
81
|
+
== p
|
82
|
+
:background-image
|
83
|
+
images/google_trend_01.png
|
84
|
+
:background-image-relative-width
|
85
|
+
90
|
86
|
+
|
87
|
+
== Note
|
88
|
+
Trendの説明: Googleでどれくらい検索されたか✕日付
|
89
|
+
|
90
|
+
このグラフからわかることはなんでしょうか?
|
91
|
+
|
92
|
+
= ((' '))
|
93
|
+
|
94
|
+
== p
|
95
|
+
:background-image
|
96
|
+
images/google_trend_03.png
|
97
|
+
:background-image-relative-width
|
98
|
+
90
|
99
|
+
|
100
|
+
== Note
|
101
|
+
参考のためにRubyのTrendがこちらです。GCがこっち、Rubyがこっち。
|
102
|
+
|
103
|
+
= ((' '))
|
104
|
+
|
105
|
+
== p
|
106
|
+
:background-image
|
107
|
+
images/google_trend_02.png
|
108
|
+
:background-image-relative-width
|
109
|
+
90
|
110
|
+
|
111
|
+
= 休日の検索数が\nさがっている
|
112
|
+
|
113
|
+
== p
|
114
|
+
: size
|
115
|
+
8
|
116
|
+
:color
|
117
|
+
white
|
118
|
+
:background-image
|
119
|
+
images/google_trend_02_with_gray.png
|
120
|
+
:background-image-relative-width
|
121
|
+
90
|
122
|
+
:background-color
|
123
|
+
gray
|
124
|
+
|
125
|
+
= つまり
|
126
|
+
* 平日
|
127
|
+
* お仕事でGCを作るリア充
|
128
|
+
* もしくはGCバグに悩まされる一般ピープルが多い
|
129
|
+
* 休日
|
130
|
+
* 趣味でGCをいじる人が少ない
|
131
|
+
|
132
|
+
== Note
|
133
|
+
そのてんRubyはすごいよね。休日までたっぷり検索されてて。
|
134
|
+
愛されているなとすぐわかりますね。
|
135
|
+
|
136
|
+
= GCはまだまだ愛されていない
|
137
|
+
|
138
|
+
= ちなみに:年末も異常に検索されている
|
139
|
+
|
140
|
+
# image
|
141
|
+
# src = images/google_trend_04.png
|
142
|
+
# relative_width = 90
|
143
|
+
# caption = リアルGCの恐れ..
|
144
|
+
|
145
|
+
= とにかく\nGCをもっと\nよく知りましょう!
|
146
|
+
|
147
|
+
= ((*徹底解剖G1GC\n 実装編*))\n正式版公開!!\n(無料配布)
|
148
|
+
|
149
|
+
== p
|
150
|
+
:size
|
151
|
+
6
|
152
|
+
:headline-align
|
153
|
+
left
|
154
|
+
:background-image
|
155
|
+
images/gcbook.jpeg
|
156
|
+
:background-image-align
|
157
|
+
right
|
158
|
+
:background-image-relative-margin-right
|
159
|
+
3
|
160
|
+
:background-image-relative-height
|
161
|
+
90
|
162
|
+
:background-image-relative-width
|
163
|
+
40
|
164
|
+
|
165
|
+
== Note
|
166
|
+
ついこの間までβだったんですが、昨日正式版を公開しました。
|
167
|
+
無料で公開しておりますので興味がある人はのぞいてみてください。
|
168
|
+
|
169
|
+
= この場を借りて本書のスポンサーのみなさまありがとうございます\nm(_ _)m
|
170
|
+
|
171
|
+
= ((*Ruby2.0 の GC update*))
|
172
|
+
|
173
|
+
== Note
|
174
|
+
そういえば、来年はRuby20周年を記念して2.0がでるそうです。
|
175
|
+
|
176
|
+
GCには一個だけ大きな修正が入っています。
|
177
|
+
|
178
|
+
= 偉い人がいってた
|
179
|
+
|
180
|
+
= 「全力で潰す」
|
181
|
+
|
182
|
+
== p
|
183
|
+
:size
|
184
|
+
8
|
185
|
+
:headline-position
|
186
|
+
bottom-right
|
187
|
+
:background-image
|
188
|
+
images/matz.jpg
|
189
|
+
:background-image-relative-height
|
190
|
+
100
|
191
|
+
:background-image-relative-width
|
192
|
+
100
|
193
|
+
:color
|
194
|
+
white
|
195
|
+
:background-image-credit
|
196
|
+
http://www.flickr.com/photos/recompile_net/5952564080
|
197
|
+
|
198
|
+
== Note
|
199
|
+
mrubyでCRubyを潰そうとしていると推測してます。
|
200
|
+
|
201
|
+
昨日、「CRubyはがんばってね」みたいなこといってて腰抜かした。
|
202
|
+
|
203
|
+
= Matz mashes something, so we mash something.
|
204
|
+
|
205
|
+
== Note
|
206
|
+
まつもとさんがなにか潰すならわれわれもなにか潰さねばならぬ
|
207
|
+
|
208
|
+
= 僕もなにか潰したい!
|
209
|
+
|
210
|
+
= REE is dead
|
211
|
+
|
212
|
+
# image
|
213
|
+
# src = images/phusion_passenger_01.png
|
214
|
+
# relative_width = 70
|
215
|
+
|
216
|
+
(('tag:x-small:((<URL:http://blog.phusion.nl/2012/02/21/ruby-enterprise-edition-1-8-7-2012-02-released-end-of-life-imminent/>))'))
|
217
|
+
|
218
|
+
== Note
|
219
|
+
日本だとCookなんちゃらさんが使っていることで有名なREEというのがあった。
|
220
|
+
|
221
|
+
ついこのあいだ死んだ。
|
222
|
+
|
223
|
+
= 諸君らが愛したREEは死んだ。\nなぜだ!
|
224
|
+
|
225
|
+
= ((' '))
|
226
|
+
|
227
|
+
== p
|
228
|
+
:background-image-relative-width
|
229
|
+
100
|
230
|
+
:background-image
|
231
|
+
images/phusion_passenger_02.png
|
232
|
+
|
233
|
+
== Note
|
234
|
+
死んだ理由が書かれていて
|
235
|
+
|
236
|
+
= ((' '))
|
237
|
+
|
238
|
+
== p
|
239
|
+
:background-image-relative-width
|
240
|
+
90
|
241
|
+
:background-image
|
242
|
+
images/phusion_passenger_03.png
|
243
|
+
|
244
|
+
== Note
|
245
|
+
copy-on-write patchが2.0に入るからというのが理由の一つ
|
246
|
+
|
247
|
+
= ((' '))
|
248
|
+
|
249
|
+
== p
|
250
|
+
:background-image-relative-height
|
251
|
+
90
|
252
|
+
:background-image
|
253
|
+
images/misawa_beihei.gif
|
254
|
+
|
255
|
+
== Note
|
256
|
+
それいれたの\nオレオレ
|
257
|
+
|
258
|
+
= BitmapMarking
|
259
|
+
* fork使うようなプログラムで嬉しいはず
|
260
|
+
* Passengerなどで恩恵があるらしい
|
261
|
+
|
262
|
+
= REEつぶしたった\n(^o^)
|
263
|
+
|
264
|
+
= 最近の悩み: \nKijiは\nどうやって潰そうか…
|
265
|
+
|
266
|
+
== Note
|
267
|
+
Kijiというtwitterで使われているRuby。GCに手を入れている。
|
268
|
+
|
269
|
+
ほっときゃ死ぬかな
|
270
|
+
|
271
|
+
= ((*本題*))
|
272
|
+
|
273
|
+
= RubyでGCを書くというお話
|
274
|
+
|
275
|
+
= ((*動機(1)*))
|
276
|
+
|
277
|
+
= ((*R*))ubyKaigi ((*D*))riven ((*D*))evelopment
|
278
|
+
|
279
|
+
= 過去のRubyKaigiの発表...
|
280
|
+
* LazySweepGC - RubyKaigi2008
|
281
|
+
* LonglifeGC - 2009
|
282
|
+
* LazySweepGC - 2010
|
283
|
+
* ParallelMarkingGC - 2011
|
284
|
+
|
285
|
+
= 全部Cの話やないか!
|
286
|
+
|
287
|
+
= ((' '))
|
288
|
+
|
289
|
+
# image
|
290
|
+
# src = images/slam_01.jpg
|
291
|
+
# relative_width = 70
|
292
|
+
# caption = Rubyの話、させてください
|
293
|
+
|
294
|
+
== Note
|
295
|
+
誰も止めてはいないんですが。
|
296
|
+
|
297
|
+
= ((*動機(2)*))
|
298
|
+
|
299
|
+
= ((' '))
|
300
|
+
|
301
|
+
# image
|
302
|
+
# src = images/c_must_die_00.png
|
303
|
+
# relative_width = 80
|
304
|
+
|
305
|
+
== Note
|
306
|
+
卜部さんの記事。大変感銘を受けた。
|
307
|
+
|
308
|
+
= ((' '))
|
309
|
+
|
310
|
+
# blockquote
|
311
|
+
# title = 卜部昌平のあまりreblogしないtumblr
|
312
|
+
結論:C死ね。
|
313
|
+
|
314
|
+
= ほんとどのGCは\nC or C++で書かれているしなぁ…
|
315
|
+
|
316
|
+
= ((' '))
|
317
|
+
|
318
|
+
# blockquote
|
319
|
+
# title = 卜部昌平のあまりreblogしないtumblr
|
320
|
+
なぜCで書く必要がある?ないはずだよ。ちゃんと調査すればJavaとかC#とか、ひょっとしたらOCamlやScalaででも用は足りる場合がほとんどなんだ。
|
321
|
+
|
322
|
+
= ((' '))
|
323
|
+
|
324
|
+
== p
|
325
|
+
:background-image
|
326
|
+
images/misawa_tamesita.gif
|
327
|
+
:background-image-relative-height
|
328
|
+
80
|
329
|
+
|
330
|
+
== Note
|
331
|
+
かってに試されているような気分になった
|
332
|
+
|
333
|
+
= RubyでGC\n書いてみよう!
|
334
|
+
|
335
|
+
== Note
|
336
|
+
単純な興味、RubyでGCはかけるのか?
|
337
|
+
|
338
|
+
= 素直に考えると...
|
339
|
+
|
340
|
+
= ((' '))
|
341
|
+
|
342
|
+
== p
|
343
|
+
:background-image
|
344
|
+
images/cruby_on_gc.png
|
345
|
+
:background-image-relative-width
|
346
|
+
100
|
347
|
+
|
348
|
+
== Note
|
349
|
+
よくArrayをヒープと見立ててGCをエミュレートしているのを見かける。
|
350
|
+
|
351
|
+
アルゴリズムの勉強をするために書かれたりする。
|
352
|
+
|
353
|
+
当たり前だがRubyで書かれたものはCRubyからオブジェクト確保、そのオブジェクトはCRubyで管理しているものである。
|
354
|
+
|
355
|
+
= ((' '))
|
356
|
+
|
357
|
+
== p
|
358
|
+
:background-image
|
359
|
+
images/misawa_akita.gif
|
360
|
+
:background-image-relative-height
|
361
|
+
80
|
362
|
+
|
363
|
+
== Note
|
364
|
+
2年前くらいにやったことがある。
|
365
|
+
|
366
|
+
= これはあまり意味がない
|
367
|
+
* 下にいるGCの性能に影響をうける
|
368
|
+
* 性能評価しづらい
|
369
|
+
* 下のGCが遅いと、上のGCも遅くなる
|
370
|
+
|
371
|
+
= これはあまり意味がない
|
372
|
+
* 言語処理系にGCは1つあればいいですよ感
|
373
|
+
* 無駄に話が複雑になっているような気がする
|
374
|
+
|
375
|
+
= もっと違うアプローチを考えよう!
|
376
|
+
|
377
|
+
== Note
|
378
|
+
というのが、今回のプレゼンの本題です。
|
379
|
+
|
380
|
+
= ((*Meta-circular evaluator*))
|
381
|
+
|
382
|
+
= ((' '))
|
383
|
+
|
384
|
+
# blockquote
|
385
|
+
# title = 4.1 The Metacircular Evaluator - SICP
|
386
|
+
An evaluator that is written in the same language that it evaluates is said to be ((*metacircular*)).
|
387
|
+
|
388
|
+
== Note
|
389
|
+
同じ言語で書かれた評価器で評価することメタサーキュラーと呼ぶのです。
|
390
|
+
|
391
|
+
= 簡単な例:\nLISPでLISP書いたった
|
392
|
+
|
393
|
+
= 他の具体例を調べてみる
|
394
|
+
|
395
|
+
= ((' '))
|
396
|
+
|
397
|
+
== p
|
398
|
+
:background-image
|
399
|
+
images/pypy.png
|
400
|
+
:background-image-relative-width
|
401
|
+
70
|
402
|
+
|
403
|
+
== Note
|
404
|
+
pypyというのはみなさんご存知でしょうか? ノシ
|
405
|
+
なぜかニヤニヤしている人もいるようですが…。
|
406
|
+
|
407
|
+
蛇が蛇自身を食べるこの図ですべて表されていますが、pypyというはPythonで書かれたPython処理系です。
|
408
|
+
|
409
|
+
= もう少し詳しく
|
410
|
+
* RPython(Restricted Python)で実装
|
411
|
+
* Pythonの言語サブセット
|
412
|
+
* RPython -> C/LLVM/Java..
|
413
|
+
|
414
|
+
= 変換イメージ
|
415
|
+
|
416
|
+
== Note
|
417
|
+
RPythonがどのようにして実行できる形式に変換されるか?
|
418
|
+
|
419
|
+
= ((' '))
|
420
|
+
|
421
|
+
== p
|
422
|
+
|
423
|
+
:background-image
|
424
|
+
images/pypy_translate_00.png
|
425
|
+
:background-image-relative-width
|
426
|
+
100
|
427
|
+
|
428
|
+
== Note
|
429
|
+
まず、RPythonで書かれたPython処理系のpypyがある。
|
430
|
+
|
431
|
+
= ((' '))
|
432
|
+
|
433
|
+
== p
|
434
|
+
|
435
|
+
:background-image
|
436
|
+
images/pypy_translate_01.png
|
437
|
+
:background-image-relative-width
|
438
|
+
100
|
439
|
+
|
440
|
+
== Note
|
441
|
+
これをCPythonでバックエンドのソースコードに変換します。
|
442
|
+
このバックエンドはJavaとかCとか選べるんですが、説明ではCとしておきます。
|
443
|
+
|
444
|
+
= ((' '))
|
445
|
+
|
446
|
+
== p
|
447
|
+
|
448
|
+
:background-image
|
449
|
+
images/pypy_translate_02.png
|
450
|
+
:background-image-relative-width
|
451
|
+
100
|
452
|
+
|
453
|
+
== Note
|
454
|
+
最終的にオブジェクトファイルに変換される。
|
455
|
+
実行できるPython処理系のできあがり。
|
456
|
+
|
457
|
+
= ((' '))
|
458
|
+
|
459
|
+
== p
|
460
|
+
|
461
|
+
:background-image
|
462
|
+
images/pypy_translate_04.png
|
463
|
+
:background-image-relative-width
|
464
|
+
100
|
465
|
+
|
466
|
+
= ((*重要なポイント*))
|
467
|
+
|
468
|
+
= ((' '))
|
469
|
+
|
470
|
+
== p
|
471
|
+
|
472
|
+
:background-image
|
473
|
+
images/pypy_translate_03.png
|
474
|
+
:background-image-relative-width
|
475
|
+
100
|
476
|
+
|
477
|
+
= GCもRPythonで書かれている
|
478
|
+
|
479
|
+
== p
|
480
|
+
:color
|
481
|
+
white
|
482
|
+
:background-image
|
483
|
+
images/pypy_translate_03_with_gray.png
|
484
|
+
:background-image-relative-width
|
485
|
+
100
|
486
|
+
|
487
|
+
= ((*疑問*))
|
488
|
+
|
489
|
+
== Note
|
490
|
+
この説明を見た時に一つだけ疑問があった。
|
491
|
+
|
492
|
+
= GC動作中のGCはどうするのか?
|
493
|
+
* GC動作中にGCが起きて、その動作中にGCが起きて…
|
494
|
+
* GCの無限ループ...?
|
495
|
+
|
496
|
+
== Note
|
497
|
+
RPythonのGCもRPythonで書かれているわけですよ。
|
498
|
+
|
499
|
+
= RPython
|
500
|
+
* GC中はGC対象のオブジェクトを作らないように気を付ける(たぶん)
|
501
|
+
* mallocなどで直接メモリを切り出す
|
502
|
+
* libffiを利用
|
503
|
+
|
504
|
+
= GC中にGCが走ることはない
|
505
|
+
|
506
|
+
= ((' '))
|
507
|
+
|
508
|
+
== p
|
509
|
+
:background-image
|
510
|
+
images/rubinius.png
|
511
|
+
:background-image-relative-width
|
512
|
+
70
|
513
|
+
|
514
|
+
== Note
|
515
|
+
次のメタサーキュラー評価器はみなさんご存知のRubiniusです。
|
516
|
+
RubyをなるべくRubyで実装している。
|
517
|
+
|
518
|
+
= 仕組み(ry
|
519
|
+
|
520
|
+
= ただし
|
521
|
+
* GCをRubyで書く仕組みがない
|
522
|
+
* 今考えればRubiniusをいじったほうがよかったかも…?
|
523
|
+
* まぁいいか...
|
524
|
+
|
525
|
+
# 55枚
|
526
|
+
|
527
|
+
= ((' '))
|
528
|
+
|
529
|
+
== p
|
530
|
+
:background-image
|
531
|
+
images/jikesrvm.png
|
532
|
+
:background-image-relative-width
|
533
|
+
70
|
534
|
+
|
535
|
+
== Note
|
536
|
+
|
537
|
+
こちらはJavaでJavaVMを書いたもの。
|
538
|
+
こちらはRPythonみたいなサブセットではなくJava言語がフルで使える。
|
539
|
+
|
540
|
+
= JikesRVM
|
541
|
+
* (('tag:x-small:RVM(Research Virtual Machine) = 研究用VM'))
|
542
|
+
* GC,VM周りでたくさん論文が書かれている
|
543
|
+
|
544
|
+
= JikesRVM
|
545
|
+
* GCもJavaで書かれている
|
546
|
+
* プロジェクト委員の一人がRechard Jones(RJGC著者)
|
547
|
+
|
548
|
+
= 直接オブジェクトファイルを吐く
|
549
|
+
|
550
|
+
# image
|
551
|
+
# src = images/jikesrvm_01.png
|
552
|
+
# relative_height = 90
|
553
|
+
|
554
|
+
== Note
|
555
|
+
pypyとは違って直接オブジェクトファイルを吐く
|
556
|
+
|
557
|
+
ほんとうはもう少し難しい図になる。
|
558
|
+
詳細をはぶくとだいたいこんなかんじ。
|
559
|
+
|
560
|
+
= GCもJavaで書ける
|
561
|
+
* 一緒にオブジェクトファイルに変換される
|
562
|
+
* GC中はGCが発生しない
|
563
|
+
* PyPyと同じ理由
|
564
|
+
|
565
|
+
= JikesRVMの功績は\n「GCをJavaでかける」\nだけではない
|
566
|
+
|
567
|
+
== Note
|
568
|
+
実は...
|
569
|
+
|
570
|
+
= GC部分が((*MMTk*))という((*別部品*))に切り離されている
|
571
|
+
|
572
|
+
= MMTk(Memory Management Tool kit)
|
573
|
+
* GCを11個保有
|
574
|
+
* ツールキットなのでGC用の便利メソッドが沢山ある
|
575
|
+
* GCづくりが簡単
|
576
|
+
|
577
|
+
= MMTk(Memory Management Tool kit)
|
578
|
+
* VMからメモリ管理を別の部品として切り離せる
|
579
|
+
* VMは取り替え可能
|
580
|
+
* JikesRVM
|
581
|
+
* Harness
|
582
|
+
|
583
|
+
= ((' '))
|
584
|
+
|
585
|
+
== p
|
586
|
+
:background-image
|
587
|
+
images/mmtk_00.png
|
588
|
+
:background-image-relative-width
|
589
|
+
100
|
590
|
+
|
591
|
+
== Note
|
592
|
+
VMとMMTkは完全に別の部品になっている。
|
593
|
+
|
594
|
+
MMTkが定義するインターフェイスを守ってVMを実装すればいい。
|
595
|
+
その例がJikesRVM。
|
596
|
+
|
597
|
+
MMTkがOSにメモリを要求したり、開放したりする。
|
598
|
+
|
599
|
+
= ((' '))
|
600
|
+
|
601
|
+
== p
|
602
|
+
:background-image
|
603
|
+
images/mmtk_01.png
|
604
|
+
:background-image-relative-width
|
605
|
+
100
|
606
|
+
|
607
|
+
= ((' '))
|
608
|
+
|
609
|
+
== p
|
610
|
+
:background-image
|
611
|
+
images/mmtk_02.png
|
612
|
+
:background-image-relative-width
|
613
|
+
100
|
614
|
+
|
615
|
+
== Note
|
616
|
+
|
617
|
+
起動時にどのGCを使うかを選択することができる。
|
618
|
+
|
619
|
+
= やたー!\nGC書き放題!
|
620
|
+
|
621
|
+
= ((' '))
|
622
|
+
|
623
|
+
== p
|
624
|
+
:background-image
|
625
|
+
images/mmtk_03.png
|
626
|
+
:background-image-relative-width
|
627
|
+
100
|
628
|
+
|
629
|
+
== Note
|
630
|
+
|
631
|
+
このマークをよく観るとわかるんですが、そうなんですよねみなさんの嫌いなJavaでGC書かないと行けないんですよ。
|
632
|
+
|
633
|
+
= Javaで…
|
634
|
+
|
635
|
+
== Note
|
636
|
+
|
637
|
+
あぁ、Javaで書くのか…
|
638
|
+
|
639
|
+
= Rubyで書きたい…ッ!!
|
640
|
+
|
641
|
+
= ((' '))
|
642
|
+
|
643
|
+
== Note
|
644
|
+
こんな感じでRubyで書けない?
|
645
|
+
|
646
|
+
== p
|
647
|
+
:background-image
|
648
|
+
images/mmtk_04.png
|
649
|
+
:background-image-relative-width
|
650
|
+
100
|
651
|
+
|
652
|
+
= ((' '))
|
653
|
+
|
654
|
+
== p
|
655
|
+
:background-image
|
656
|
+
images/mmtk_05.png
|
657
|
+
:background-image-relative-width
|
658
|
+
100
|
659
|
+
|
660
|
+
== Note
|
661
|
+
ついでにVM側のRubyで書けない?
|
662
|
+
|
663
|
+
= われわれにはJRubyがあるじゃないか
|
664
|
+
|
665
|
+
= ((' '))
|
666
|
+
|
667
|
+
== p
|
668
|
+
:background-image
|
669
|
+
images/regicide_mmtk_00.png
|
670
|
+
:background-image-relative-width
|
671
|
+
100
|
672
|
+
|
673
|
+
== Note
|
674
|
+
JavaにJRubyを埋め込んで、ユーザが定義したRubyコードを埋め込んだJRubyコードに評価させる、ということを考えました。
|
675
|
+
|
676
|
+
= ((' '))
|
677
|
+
|
678
|
+
== p
|
679
|
+
:background-image
|
680
|
+
images/regicide_mmtk_01.png
|
681
|
+
:background-image-relative-width
|
682
|
+
100
|
683
|
+
|
684
|
+
= この部分を\nライブラリ化
|
685
|
+
|
686
|
+
= ((*R*))e((*g*))i((*c*))ide
|
687
|
+
|
688
|
+
= Regicde = 国王殺し
|
689
|
+
|
690
|
+
# image
|
691
|
+
# src = images/regicide.png
|
692
|
+
# relative_width = 80
|
693
|
+
|
694
|
+
= ((' '))
|
695
|
+
|
696
|
+
== p
|
697
|
+
:background-image
|
698
|
+
images/regicide_mmtk_02.png
|
699
|
+
:background-image-relative-width
|
700
|
+
100
|
701
|
+
|
702
|
+
== Note
|
703
|
+
Regicideを使えばユーザはVMをJRubyで書いたり、GCをJRubyで書くだけで済んじゃう。
|
704
|
+
難しいところはRegicideが吸収。
|
705
|
+
|
706
|
+
= サンプルコード
|
707
|
+
|
708
|
+
= オブジェクトの定義
|
709
|
+
|
710
|
+
# enscript ruby
|
711
|
+
class FixnumValue < Regicide::Mutator::ObjectValue
|
712
|
+
# ...
|
713
|
+
end
|
714
|
+
|
715
|
+
(('tag:x-small:Regicide::Mutator::ObjectValueを継承'))
|
716
|
+
|
717
|
+
= オブジェクト生成
|
718
|
+
|
719
|
+
# enscript ruby
|
720
|
+
class FixnumValue < Regicide::Mutator::ObjectValue
|
721
|
+
# Fixnumをフィールドに持つ
|
722
|
+
# オブジェクトを割り当てるメソッド
|
723
|
+
def self.from_i(mutator, i)
|
724
|
+
...
|
725
|
+
end
|
726
|
+
end
|
727
|
+
|
728
|
+
= from_i
|
729
|
+
|
730
|
+
# enscript ruby
|
731
|
+
# メモリ割り当て
|
732
|
+
ptr = mutator.alloc(0, 1, mutator.current_stack.pc)
|
733
|
+
# オブジェクト生成
|
734
|
+
v = self.new(ptr)
|
735
|
+
# Fixnumを格納
|
736
|
+
mutator.store_data_field(v.object_value, 0,
|
737
|
+
org.vmmagic.unboxed.Word.from_long(i))
|
738
|
+
return v
|
739
|
+
|
740
|
+
= M&S GCは4行で書ける
|
741
|
+
|
742
|
+
# enscript ruby
|
743
|
+
class MSConstraints < org.mmtk.plan.marksweep.MSConstraints; end
|
744
|
+
class MS < org.mmtk.plan.marksweep.MS; end
|
745
|
+
class MSCollector < org.mmtk.plan.marksweep.MSCollector; end
|
746
|
+
class MSMutator < org.mmtk.plan.marksweep.MSMutator; end
|
747
|
+
|
748
|
+
= 動作するサンプル\n↓\n(('tag:x-small:((<URL:https://github.com/authorNari/regicide/tree/master/sample>))'))
|
749
|
+
|
750
|
+
= ((*苦労話*))
|
751
|
+
|
752
|
+
= Java+JRuby
|
753
|
+
* JRuby側からJavaを使うのは簡単
|
754
|
+
* メソッド呼び出し
|
755
|
+
* 継承とかとか
|
756
|
+
|
757
|
+
= Java+JRuby
|
758
|
+
* Java側からJRubyを使うのは難しい
|
759
|
+
* けっこう意外だった
|
760
|
+
|
761
|
+
= どいうことか?
|
762
|
+
|
763
|
+
= ((' '))
|
764
|
+
|
765
|
+
== p
|
766
|
+
:background-image
|
767
|
+
images/jruby_plus_java_00.png
|
768
|
+
:background-image-relative-width
|
769
|
+
100
|
770
|
+
|
771
|
+
= ((' '))
|
772
|
+
|
773
|
+
== p
|
774
|
+
:background-image
|
775
|
+
images/jruby_plus_java_01.png
|
776
|
+
:background-image-relative-width
|
777
|
+
100
|
778
|
+
|
779
|
+
= どうやるの\n(?_?)
|
780
|
+
|
781
|
+
= RedBridge
|
782
|
+
|
783
|
+
== p
|
784
|
+
:color
|
785
|
+
white
|
786
|
+
:background-image
|
787
|
+
images/rubybridge.png
|
788
|
+
:background-image-relative-width
|
789
|
+
100
|
790
|
+
:background-image-relative-height
|
791
|
+
100
|
792
|
+
|
793
|
+
= RedBridge
|
794
|
+
* @yokoletさん作(感謝!)
|
795
|
+
* Javaの中でJRubyの実行環境(コンテナ)を作る
|
796
|
+
* コンテナにソースコードぶちこんだり、Rubyコード片を評価できる
|
797
|
+
|
798
|
+
= ((' '))
|
799
|
+
|
800
|
+
== p
|
801
|
+
:background-image
|
802
|
+
images/jruby_plus_java_01.png
|
803
|
+
:background-image-relative-width
|
804
|
+
100
|
805
|
+
|
806
|
+
== Note
|
807
|
+
この図の例だと
|
808
|
+
|
809
|
+
= イメージ
|
810
|
+
|
811
|
+
# enscript java
|
812
|
+
public static void foo(void) {
|
813
|
+
// JRuby実行環境作って
|
814
|
+
ScriptingContainer sc =
|
815
|
+
new ScriptingContainer();
|
816
|
+
|
817
|
+
// さっきのJRubyFooクラスを読み込み
|
818
|
+
Object jrubyFooClass =
|
819
|
+
sc.runScriptlet(PathType.ABSOLUTE, "foo.rb");
|
820
|
+
|
821
|
+
// JRubyFoo.fooを呼び出す
|
822
|
+
sc.callMethod(fooClass, "foo", Object.class);
|
823
|
+
}
|
824
|
+
|
825
|
+
= Regicideでは\nこの辺の技術を\nなんやかんや\n使ってます
|
826
|
+
|
827
|
+
= ((*Regicideの悪いところ*))
|
828
|
+
|
829
|
+
= ((*VM作るのめんどい*))
|
830
|
+
|
831
|
+
= けっきょくVMは書かないといけない
|
832
|
+
* GCを評価するためにはある程度ちゃんとしたものが必要
|
833
|
+
* でもVMとか興味ないしさぁ…
|
834
|
+
* LISPすら作るのが億劫
|
835
|
+
* 飽きてきた
|
836
|
+
|
837
|
+
= ((*JVMのGCの\n影響を受ける*))
|
838
|
+
|
839
|
+
= ((' '))
|
840
|
+
|
841
|
+
== p
|
842
|
+
:background-image
|
843
|
+
images/regicide_bad_00.png
|
844
|
+
:background-image-relative-width
|
845
|
+
90
|
846
|
+
|
847
|
+
= ((' '))
|
848
|
+
|
849
|
+
== p
|
850
|
+
:background-image
|
851
|
+
images/regicide_bad_01.png
|
852
|
+
:background-image-relative-width
|
853
|
+
90
|
854
|
+
|
855
|
+
== Note
|
856
|
+
こういう変換ができると思っていた。
|
857
|
+
|
858
|
+
= ((' '))
|
859
|
+
|
860
|
+
# image
|
861
|
+
# src = images/regicide_bad_02.png
|
862
|
+
# relative_width = 80
|
863
|
+
# caption = ふつうにJavaのコードとして動かす感じ
|
864
|
+
|
865
|
+
= JVMのGCに引っ張られる
|
866
|
+
* 性能が引っ張られる
|
867
|
+
* GC停止も不可能だしきちんと性能評価しづらそう
|
868
|
+
* 論文とか書きづらそう
|
869
|
+
|
870
|
+
= 変換ができればいいのに…
|
871
|
+
* JikesRVMのブートストラップ部分にJRubyを突っ込む
|
872
|
+
* うまく動かなかった
|
873
|
+
* JRubyがJikesRVMの秘孔を付いているらしい
|
874
|
+
* JikesRVMがまだ未熟
|
875
|
+
|
876
|
+
= ((*Regicideの良いところ*))
|
877
|
+
|
878
|
+
= ((*VMが自分で書ける*))
|
879
|
+
|
880
|
+
= 言語処理系が自前で書ける
|
881
|
+
* GCにすごく優しい処理系とか書ける
|
882
|
+
* 言語処理系ひっくるめて検討できる
|
883
|
+
|
884
|
+
= おいしいところは全部Rubyで書ける
|
885
|
+
* VM, GC, 全部Rubyで書ける
|
886
|
+
* Cみたいに阿鼻叫喚しなくていい(かもしれない)
|
887
|
+
* 生産性が100倍(らしい)
|
888
|
+
|
889
|
+
= 勝手に処理系が速くなる感
|
890
|
+
* JVM速くなる = Regicide速くなる
|
891
|
+
* WIN-WIN(笑)
|
892
|
+
* Cでも一緒か…
|
893
|
+
|
894
|
+
= ほかのGCと比較可能
|
895
|
+
* 十数個のGCと性能比較ができる
|
896
|
+
* 起動時のオプションを少しいじるだけでOK
|
897
|
+
* 論文とかかけるかもしれない!
|
898
|
+
|
899
|
+
= githubにあげています\nauthorNari/regicide
|
900
|
+
|
901
|
+
= ((*今後の展開*))
|
902
|
+
|
903
|
+
= 作ってみて気づいたこと
|
904
|
+
* GC部分は外っ面がRubyなだけで実はCとあまり変わらない感じ…
|
905
|
+
* これならCで書いても一緒なのでは…
|
906
|
+
|
907
|
+
= 作ってみて気づいたこと
|
908
|
+
* 実はGC実装に特化したミニ言語が欲しいだけなのか…?
|
909
|
+
* 今後はそちら方面で攻めてみたい
|
910
|
+
|
911
|
+
= ((*まとめ*))
|
912
|
+
|
913
|
+
= まとめ
|
914
|
+
* やっぱりRubyの話できなかった
|
915
|
+
* C死ねと思って作ったRegicideがすでに死にそう
|
916
|
+
|
917
|
+
== Note
|
918
|
+
Python,Java,JRubyの話とかしてしまった
|
919
|
+
|
920
|
+
= ご清聴\nありがとう\nございました
|
921
|
+
|
922
|
+
= ((' '))
|
923
|
+
|
924
|
+
== p
|
925
|
+
:background-image
|
926
|
+
images/misawa_riakai.gif
|
927
|
+
:background-image-relative-height
|
928
|
+
80
|
metadata
ADDED
@@ -0,0 +1,119 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-nari-serious-GC-with-Ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Narihiro Nakamura
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rabbit
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 2.0.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 2.0.2
|
30
|
+
description: ! 'なぜあなたはCでGCを書くのですか? 本当はRubyで書きたいですよね? この
|
31
|
+
|
32
|
+
発表では(J)RubyでGCを書く方法を示します。ToyのGCじゃなくて、本気のGCを
|
33
|
+
|
34
|
+
Rubyで書けます!(の予定)'
|
35
|
+
email:
|
36
|
+
- authornari@gmail.com
|
37
|
+
executables: []
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files: []
|
40
|
+
files:
|
41
|
+
- .rabbit
|
42
|
+
- config.yaml
|
43
|
+
- Rakefile
|
44
|
+
- README.rd
|
45
|
+
- images/pypy_translate_04.png
|
46
|
+
- images/pypy_translate_03_with_gray.png
|
47
|
+
- images/mmtk_01.png
|
48
|
+
- images/jikesrvm.png
|
49
|
+
- images/google_trend_02_with_gray.png
|
50
|
+
- images/regicide_bad_00.png
|
51
|
+
- images/pypy_translate_00.png
|
52
|
+
- images/google_trend_00.png
|
53
|
+
- images/pypy_translate_02.png
|
54
|
+
- images/rubinius.png
|
55
|
+
- images/jruby_plus_java_01.png
|
56
|
+
- images/nacl_wantedly.png
|
57
|
+
- images/mmtk_05.png
|
58
|
+
- images/rubybridge.png
|
59
|
+
- images/nacl_logo.png
|
60
|
+
- images/regicide_mmtk_02.png
|
61
|
+
- images/jruby_plus_java_00.png
|
62
|
+
- images/pypy_translate_01.png
|
63
|
+
- images/regicide_bad_02.png
|
64
|
+
- images/mmtk_04.png
|
65
|
+
- images/pypy_translate_03.png
|
66
|
+
- images/google_trend_01.png
|
67
|
+
- images/cruby_on_gc.png
|
68
|
+
- images/pypy.png
|
69
|
+
- images/google_trend_03.png
|
70
|
+
- images/mmtk_02.png
|
71
|
+
- images/regicide_mmtk_01.png
|
72
|
+
- images/jikesrvm_01.png
|
73
|
+
- images/mmtk_03.png
|
74
|
+
- images/google_trend_04.png
|
75
|
+
- images/google_trend_02.png
|
76
|
+
- images/regicide.png
|
77
|
+
- images/mmtk_00.png
|
78
|
+
- images/regicide_mmtk_00.png
|
79
|
+
- images/phusion_passenger_01.png
|
80
|
+
- images/c_must_die_00.png
|
81
|
+
- images/regicide_bad_01.png
|
82
|
+
- images/phusion_passenger_03.png
|
83
|
+
- images/phusion_passenger_02.png
|
84
|
+
- images/slam_01.jpg
|
85
|
+
- images/matz.jpg
|
86
|
+
- images/gcbook.jpeg
|
87
|
+
- images/misawa_akita.gif
|
88
|
+
- images/misawa_riakai.gif
|
89
|
+
- images/misawa_beihei.gif
|
90
|
+
- images/misawa_tamesita.gif
|
91
|
+
- serious-GC-with-Ruby.pdf
|
92
|
+
- serious-GC-with-Ruby.rab
|
93
|
+
- pdf/serious-GC-with-Ruby-serious-GC-with-Ruby.pdf
|
94
|
+
homepage: http://slide.rabbit-shocker.org/authors/nari/serious-GC-with-Ruby/
|
95
|
+
licenses:
|
96
|
+
- CC BY-SA 3.0
|
97
|
+
post_install_message:
|
98
|
+
rdoc_options: []
|
99
|
+
require_paths:
|
100
|
+
- lib
|
101
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
102
|
+
none: false
|
103
|
+
requirements:
|
104
|
+
- - ! '>='
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: '0'
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ! '>='
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: '0'
|
113
|
+
requirements: []
|
114
|
+
rubyforge_project:
|
115
|
+
rubygems_version: 1.8.23
|
116
|
+
signing_key:
|
117
|
+
specification_version: 3
|
118
|
+
summary: Rubyによる本気のGC
|
119
|
+
test_files: []
|