Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
RustでつくるRubyのFiber
Search
monochrome
May 30, 2021
Programming
350
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
RustでつくるRubyのFiber
プログラミング言語が好きな人が集まるSlack
定期ミートアップ 2021/5/30
monochrome
May 30, 2021
More Decks by monochrome
See All by monochrome
RubyKaigi2026: Invariants in my own Ruby
sisshiki1969
0
47
Improving my own Ruby thereafter
sisshiki1969
1
270
あなたとJIT, 今すぐアセンブ ル
sisshiki1969
1
1.1k
Improve my own Ruby
sisshiki1969
1
630
My own Ruby, thereafter
sisshiki1969
0
430
Running Optcarrot (faster) on my own Ruby.
sisshiki1969
1
360
仮想マシンにおけるスタックの管理
sisshiki1969
0
260
Rustでゴミ集め
sisshiki1969
1
400
Shinjuku.rs#15 Rustでつくるx86アセンブラ
sisshiki1969
0
1.8k
Other Decks in Programming
See All in Programming
Materialが消えた日 〜真っ白なFlutterキャンバスにRenderObjectで絵を描く〜
umigishiaoi
0
160
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Kaigi on Rails 2026, Tokyo, Japan
marcoroth
2
420
高橋メソッドでCVE解説シリーズ 〜CVE-2026-112816〜
hakkadaikon
0
240
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
120
学びを記事・スライド・Xへ高速展開する― AI-assisted Learning Loopで回すコンテンツ生成術
ochtum
0
200
Performance Optimization With LLMs
xleitix
0
250
Secure Your Coding Agent Like It’s Malware (v1.5) 🇬🇧 @Code.talks 2026
richargh
0
110
Railsバージョンを4倍にした話
optim
0
1k
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
290
AmebaブログはKMPから卒業します
kmars0605
0
340
動画プレイヤーはなぜカクつくのか 〜Flutterのレンダリングとネイティブの境界を解剖する〜
naruogram
0
330
Seven New Principles of Software Engineering
yegor256
0
470
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
560
Visualization
eitanlees
153
17k
Balancing Empowerment & Direction
lara
6
1.4k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
350
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
2
520
Statistics for Hackers
jakevdp
799
230k
30 Presentation Tips
portentint
PRO
1
460
Rails Girls Zürich Keynote
gr2m
96
14k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
560
Building AI with AI
inesmontani
PRO
1
1.4k
The Cost Of JavaScript in 2023
addyosmani
56
10k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.9k
Transcript
プログラミング言語Slack 定期ミートアップ 2021/05/30 RustでつくるRubyのFiber monochrome twitter: @s_isshiki1969
Agenda • RustでRubyの処理系を作ってます。 • 大きなアプリケーションやライブラリを動かせるよう頑張ってます。 • その過程で協調スレッド(コルーチン)を実装しました。
ruruby (https://github.com/sisshiki1969/ruruby) • Rust製のRuby実装 • 仮想マシンインタプリタ • 他の既存実装・仮想マシンへの依存なし • ガーベジコレクタを独自実装
• 3万行ぐらい
構成 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’
Optcarrot • Rubyで書かれたNESエミュレータ • 「Ruby3をRuby2の3倍速くする」目標のための準公式ベンチマーク • 実際にゲームができるモードと、ベンチマーク専用のモードがある • ベンチマークモードでは外部ライブラリを使用しない •
≒6500 LOC repo: https://github.com/mame/optcarrot • 紹介スライド: https://www.slideshare.net/mametter/optcarrot-a-pureruby-nes-emulator
https://www.slideshare.net/mametter/optcarrot-a-pureruby-nes-emulator NESの仕組み 本来はパラレルに動くCPUとGPUの処理を簡潔に記述するためにコルーチンを使用
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つのみ。
仮想マシンにおける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)
OSスレッドによるFiberの実装 https://github.com/sisshiki1969/ruruby/bl ob/aa72942d46337574448dafb493ee27 bb4defb69d/src/value/fiber.rs#L124 欠点:重い、遅い
アセンブリによるFiber切り替えの実装 • Fiberの生成 ◦ Fiber用のマシンスタック領域を確保 • resume(親Fiber→子Fiber) ◦ レジスタを親スタックに保存 ◦
子のスタックへ切替 ◦ レジスタを子スタックから復帰 ◦ ret • yield(子Fiber→親Fiber) ◦ レジスタを子スタックに保存 ◦ 親のスタックへ切替 ◦ レジスタを親スタックから復帰 ◦ ret Fiber情報へのポインタ ガード関数ポインタ VM起動関数ポインタ レジスタ保存領域 子Fiberスタック -8 -16 -24 -80 中継関数ポインタ -32 ←sp
nix / x86-64 darwin / aarch64