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

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

Yudai Tanaka
April 25, 2024
760

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

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