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

ふつうのWebサービス開発者がRubyKaigiを楽しむためのRubyの知識

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Yudai Tanaka Yudai Tanaka
April 25, 2024
4.2k

 ふつうのWebサービス開発者がRubyKaigiを楽しむためのRubyの知識

Avatar for Yudai Tanaka

Yudai Tanaka

April 25, 2024
Tweet

Transcript

  1. SmartHR 田中悠大 (ytnk531, yudai) • 「ふつう」のWebサービス開発者 • Ruby on Railsで開発

    • Rubyにコントリビュートしたことない RubyKaigi • 2019年に初参加 • 最高!でも全然わからねぇ… 自己紹介 2
  2. 高速化 • JIT • メモリ管理 • 並列処理、並行処理 Rubyをより便利にする • パーサーの拡張

    • 静的型付け • debug gem 最近のRubyKaigiの話題 Rubyの裾野を広げる • WASM対応 • 家庭用ゲーム機で動かす 4
  3. 高速化 • JIT • メモリ管理 • 並列処理、並行処理 Rubyをより便利にする • パーサーの拡張

    • 静的型付け • debug gem 最近のRubyKaigiの話題 Rubyの裾野を広げる • WASM対応 • 家庭用ゲーム機で動かす 5
  4. CRubyのプログラム実行の流れ 8 def three 1 + 2 end RubyVM パーサー

    コンパイラ ソースコード AST(抽象構文木) Instruction Sequence(ISeq) CRuby
  5. JIT プログラム実行中にマシンコードを生成 • 実行時の情報を用いて最適化できる JIT(Just-In-Time)コンパイラとは 10 mov eax, 1 ;

    EAXレジスタに整数1をロード add eax, 2 ; EAXレジスタに整数2を加算(EAX = EAX + 2) ret ; 呼び出し元に戻る マシンコード(疑似x86-64アセンブリ) Instruction Sequence 0000 putobject_INT2FIX_1_ 0001 putobject 2 0003 opt_plus 0005 leave ※実際のマシンコードとは異なる
  6. mov eax, 1 add eax, 2 ret ; 呼び出し元に戻る プログラム実行中にマシンコードを生成

    • 実行時の情報を用いて最適化できる JIT(Just-In-Time)コンパイラとは 11 JIT Instruction Sequence mov eax, 3 どうせ3なんだから 計算しなくて いいじゃん ※実際のマシンコードとは異なる 0000 putobject_INT2FIX_1_ 0001 putobject 2 0003 opt_plus 0005 leave マシンコード(疑似x86-64アセンブリ) ※実際の挙動とは異なる
  7. MJIT • Ruby 2.6~3.2 YJIT • railsを速くする目的で作られたJITコンパイラ • Ruby 3.1~

    RJIT • Rubyで書かれたJITコンパイラ • Ruby 3.3~ RubyのJITコンパイラ 12
  8. 15

  9. 22

  10. 23

  11. 24

  12. 36

  13. 37

  14. Lrama (Ruby 3.3〜) • エラー許容性を持つパーサーを生成するパーサージェネレーター • CRubyに依存のないパーサーをビルドできるようにする • parse.yのリファクタリング Prism

    (YARP, Ruby 3.3〜) • エラー許容性を持つ手書きのパーサー • 独立して外部から使用できる • --parser=prism で実験的に利用できる 2つのアプローチ 41
  15. 44

  16. 45

  17. 46

  18. 47

  19. 高速化 • JITコンパイラ • 並行処理・並列処理 • メモリ管理 まとめ 48 Rubyをより便利に

    • パーサーの改善 本番ではもっと深い話がたくさん聞けます 会場で一緒にわからねぇ…楽しみましょう!!!
  20. • Pat Shaughnessy. “Ruby Under a Microscope” • Takashi Kokubun.

    “Ruby JIT Hacking Guide”. RubyKaigi 2023 • さき(H.Saki). “Goでの並行処理を徹底解剖! ” • 笹田 耕一. “Rubyによる並行並列プログラミング ”. Ruby World Conference 2023 • hachi8833. “Rubyのメモリ管理方法1: 基本概念(翻訳) ”. TechRacho. https://techracho.bpsinc.jp/hachi8833/2022_06_02/118259 • hachi8833. “Rubyのメモリ管理方法2: Ruby 3.1の文字列の可変幅アロケーション(翻訳) ”. TechRacho. https://techracho.bpsinc.jp/hachi8833/2022_06_08/118447 • Matt Valentine-House. “Plug & Play Garbage Collection with MMTk”. RubyKaigi 2023 • Yuichiro Kaneko. “The future vision of Ruby Parser”. RubyKaigi 2023 参考文献 49
  21. 付録 Fiber Schedulerのサンプル 51 Fiber.new do |io| message = io.read_nonblock

    5000 @selector.register Fiber.current, io Fiber.yield io.write_nonblock "response" @selector.register Fiber.current, io Fiber.yield end class Scheduler def io_wait(io, events, timeout) @selector.register Fiber.current, io, events end end Fiber.set_scheduler(Scheduler.new) Fiber. schedule do message = io.read 5000 io.write "response" end