Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustでつくるガーベジコレクタ

Aea43fe34799c7ae03e9793919e39c65?s=47 monochrome
October 20, 2020

 Rustでつくるガーベジコレクタ

shinjuku.rs #12

Aea43fe34799c7ae03e9793919e39c65?s=128

monochrome

October 20, 2020
Tweet

Transcript

  1. Rustでつくるガーベジコレクタ monochrome twitter: @s_isshiki1969 Slack: プログラミング言語処理系が好きな人の集まり https://prog-lang-sys-ja-slack.github.io/wiki/

  2. ruruby (https://github.com/sisshiki1969/ruruby) • 純Rust製のRuby実装 • 仮想マシンインタプリタ • 他の既存実装・仮想マシンへの依存なし • Rubyの標準ライブラリはRustで実装

    • ガーベジコレクタを独自実装 • 2万行ぐらい
  3. • 動的型付けのオブジェクト指向言語 • クラス定義、メソッド定義など、全てが動的 • 豊富なメタ言語機能 • Cで書かれている(50万行ぐらい)。 Ruby

  4. 構成 virtual machine (VM) Rubyコード 抽象構文木 (AST) バイトコード parser codegen

    a = 1 + 2 PUSH_INT 1 PUSH_INT 2 ADD SET_LVAR ‘a’ Add 1 1 1 2 3 Assign 2 LVAR ’a’
  5. オブジェクトの内部表現

  6. Garbage collector Mutator (VM) Allocator ヒープ割り当て Collector 不要なオブジェクトの回収 割り当て要求 GC起動

    *mut RValue
  7. Page 0 7 8 15 16 20 23 24 0x4_0000

    20 mark bitmap 0 7 64b x 4032 slot ≒ 256Kb
  8. Allocator Free list 64b x 4032 slot ≒ 256Kb

  9. Allocator Free list

  10. Collector 起動 Free list

  11. Garbage collection: Mark local variables method Array local variables method

    Hash K V K V K V K V Object Instance variables Free list
  12. None
  13. Garbage collection: Sweep local variables method Array local variables method

    Hash K V K V K V K V Object Instance variables Free list
  14. None
  15. Collector 処理終了 Free list

  16. Allocator Free list

  17. benchmark: aobench.rb (GC on / off)

  18. バグりがちな点 var = [o1, o2, o3].each { |x| x.to_s }

    配列オブジェクトをイテレートし、 各要素を関数で処理して戻り値を集め 配列を作って返すRubyスクリプト
  19. バグりがちな点

  20. ①VM実行中にGCが起動すると… バグりがちな点 GC! ②作成中のオブジェクト が回収されてしまう ③VMは気づかず処理続行 → いつの間にか上書きされてバグる

  21. まとめ • GCつくりました。 • GCバグるとつらい。