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.
Files changed (54) hide show
  1. data/.rabbit +1 -0
  2. data/README.rd +28 -0
  3. data/Rakefile +2 -0
  4. data/config.yaml +16 -0
  5. data/images/c_must_die_00.png +0 -0
  6. data/images/cruby_on_gc.png +0 -0
  7. data/images/gcbook.jpeg +0 -0
  8. data/images/google_trend_00.png +0 -0
  9. data/images/google_trend_01.png +0 -0
  10. data/images/google_trend_02.png +0 -0
  11. data/images/google_trend_02_with_gray.png +0 -0
  12. data/images/google_trend_03.png +0 -0
  13. data/images/google_trend_04.png +0 -0
  14. data/images/jikesrvm.png +0 -0
  15. data/images/jikesrvm_01.png +0 -0
  16. data/images/jruby_plus_java_00.png +0 -0
  17. data/images/jruby_plus_java_01.png +0 -0
  18. data/images/matz.jpg +0 -0
  19. data/images/misawa_akita.gif +0 -0
  20. data/images/misawa_beihei.gif +0 -0
  21. data/images/misawa_riakai.gif +0 -0
  22. data/images/misawa_tamesita.gif +0 -0
  23. data/images/mmtk_00.png +0 -0
  24. data/images/mmtk_01.png +0 -0
  25. data/images/mmtk_02.png +0 -0
  26. data/images/mmtk_03.png +0 -0
  27. data/images/mmtk_04.png +0 -0
  28. data/images/mmtk_05.png +0 -0
  29. data/images/nacl_logo.png +0 -0
  30. data/images/nacl_wantedly.png +0 -0
  31. data/images/phusion_passenger_01.png +0 -0
  32. data/images/phusion_passenger_02.png +0 -0
  33. data/images/phusion_passenger_03.png +0 -0
  34. data/images/pypy.png +0 -0
  35. data/images/pypy_translate_00.png +0 -0
  36. data/images/pypy_translate_01.png +0 -0
  37. data/images/pypy_translate_02.png +0 -0
  38. data/images/pypy_translate_03.png +0 -0
  39. data/images/pypy_translate_03_with_gray.png +0 -0
  40. data/images/pypy_translate_04.png +0 -0
  41. data/images/regicide.png +0 -0
  42. data/images/regicide_bad_00.png +0 -0
  43. data/images/regicide_bad_01.png +0 -0
  44. data/images/regicide_bad_02.png +0 -0
  45. data/images/regicide_mmtk_00.png +0 -0
  46. data/images/regicide_mmtk_01.png +0 -0
  47. data/images/regicide_mmtk_02.png +0 -0
  48. data/images/rubinius.png +0 -0
  49. data/images/rubybridge.png +0 -0
  50. data/images/slam_01.jpg +0 -0
  51. data/pdf/serious-GC-with-Ruby-serious-GC-with-Ruby.pdf +0 -0
  52. data/serious-GC-with-Ruby.pdf +0 -0
  53. data/serious-GC-with-Ruby.rab +928 -0
  54. metadata +119 -0
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ serious-GC-with-Ruby.rab
@@ -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
+
@@ -0,0 +1,2 @@
1
+ require "rabbit/task/slide"
2
+ Rabbit::Task::Slide.new
@@ -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
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
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: []