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

RustでつくるRubyのFiber

 RustでつくるRubyのFiber

プログラミング言語が好きな人が集まるSlack
定期ミートアップ 2021/5/30

monochrome

May 30, 2021
Tweet

More Decks by monochrome

Other Decks in Programming

Transcript

  1. 構成 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’
  2. Fiber (coroutine in Ruby) f = Fiber.new { .. }

    f.resume(200) A B Fiber.yield ←100 f.resume(100) C f (child fiber) f = Fiber.new {|x| [ A ] Fiber.yield [ C ] } f.resume [ B ] f.resume [ D ] parent fiber D x ←200 〇2つの実行コンテキストが切り替わりながら処理が進む。 〇親は複数の子を生成できるが、親は1つのみ。
  3. 仮想マシンにおけるFiberの実装 f = Fiber.new { .. } f.resume A B

    Fiber.yield f.resume C f (child fiber) parent fiber D • Fiberの生成 • resume(親Fiber→子Fiber) • yield(子Fiber→親Fiber)
  4. アセンブリによるFiber切り替えの実装 • Fiberの生成 ◦ Fiber用のマシンスタック領域を確保 • resume(親Fiber→子Fiber) ◦ レジスタを親スタックに保存 ◦

    子のスタックへ切替 ◦ レジスタを子スタックから復帰 ◦ ret • yield(子Fiber→親Fiber) ◦ レジスタを子スタックに保存 ◦ 親のスタックへ切替 ◦ レジスタを親スタックから復帰 ◦ ret Fiber情報へのポインタ ガード関数ポインタ VM起動関数ポインタ レジスタ保存領域 子Fiberスタック -8 -16 -24 -80 中継関数ポインタ -32 ←sp