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

Rustでゴミ集め

 Rustでゴミ集め

プログラミング言語Slack 定期ミートアップ#2 2021/06/13

Rustでゴミ集め

Aea43fe34799c7ae03e9793919e39c65?s=128

monochrome

June 13, 2021
Tweet

Transcript

  1. プログラミング言語Slack 定期ミートアップ#2 2021/06/13 Rustでゴミ集め monochrome twitter: @s_isshiki1969

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

    • ガーベジコレクタを独自実装 • 2万行ぐらい
  3. 参考文献 Richard Jones et al.
 翻訳監修:前田敦司 鵜川始陽 小宮 常康
 翔泳社, 2016
 中村成洋 相川光


    秀和システム, 2010
 moppris
 技術書典5, 2016

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

    *mut RValue
  5. Rubyオブジェクトの内部表現 struct Value(std::num::NonZeroU64); struct RValue { class: Module, var_table: Option<Box<ValueTable>>,

    kind: ObjKind, } (56 bytes) struct GCBox<T: GC> { inner: T, next: Option<GCBoxRef<T>>, } (64 bytes)
  6. Page 0 7 8 15 16 20 23 4031 0x4_0000

    20 mark bitmap 0 7 64b x 4032 slot
  7. Allocator Free list

  8. Allocator Free list

  9. Collector 起動 Free list

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

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

    Hash K V K V K V K V Object Instance variables Free list
  12. Collector 処理終了 Free list mark bitmap

  13. Allocator Free list

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

  15. バグりがちな点 var = [1, 2, 3].map { |x| x.to_s }

    配列オブジェクトをイテレートし、 各要素を関数で処理して戻り値を集め 配列を作って返すRubyスクリプト
  16. var = [1, 2, 3].map { |x| x.to_s }

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

    2, 3].map { |x| x.to_s }
  18. まとめ • GCつくりました。 • GCバグるとつらい。