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

Rubyが好きな話

Avatar for Kai Kai
August 04, 2025

 Rubyが好きな話

Avatar for Kai

Kai

August 04, 2025
Tweet

More Decks by Kai

Other Decks in Programming

Transcript

  1. 目 次 P2
 ©Techouse All Rights Reserved
 前置き
 01
 Parser


    02
 
 メソッド名
 03
 
 まとめ
 04 

  2. ©Techouse All Rights Reserved P4 自己紹介
 • 所属:Techouse
 • 名前:Kai


    • 最近:
 ◦ Ruby
 ◦ Rails
 ◦ Terraform
 • 好き:
 ◦ OS
 ◦ 言語実装

  3. ©Techouse All Rights Reserved P10 本日のゴール 
 • Rubyの内部実装を雰囲気だけ知った気になる 


    • 言語の内部実装がちょっと面白そうかも、と思う 
 • そんな知識を学べる Techouseがちょっとだけ気になる 

  4. P17
 ©Techouse All Rights Reserved
 例
 program: プログラム全体 stmts: 文の列

    stmt: 単一の文 if x > 0 then ... end, def foo; end expr: 値を返す式 x = 42,foo.bar arg: 演算子のオペランド a + b, x ? y : z primary: 最小単位の式 123, "hello" 1 + 1 → primary + primary → arg + arg → expr → stmt → stmts → program
  5. P18
 ©Techouse All Rights Reserved
 Ruby特有の挙動 
 program: プログラム全体 stmts:

    文の列 stmt: 単一の文 if x > 0 then ... end, def foo; end expr: 値を返す式 x = 42,foo.bar arg: 演算子のオペランド a + b, x ? y : z primary: 最小単位の式 123, "hello" !?→
  6. P19
 ©Techouse All Rights Reserved
 Ruby特有の挙動 
 program: プログラム全体 stmts:

    文の列 stmt: 単一の文 if x > 0 then ... end, def foo; end expr: 値を返す式 x = 42,foo.bar arg: 演算子のオペランド a + b, x ? y : z primary: 最小単位の式 123, "hello" !?→ プログラムをリテラルのように扱 う事ができる 

  7. P20
 ©Techouse All Rights Reserved
 Ruby特有の挙動 
 program: プログラム全体 stmts:

    文の列 stmt: 単一の文 if x > 0 then ... end, def foo; end expr: 値を返す式 x = 42,foo.bar arg: 演算子のオペランド a + b, x ? y : z primary: 最小単位の式 123, "hello" !?→ プログラムをリテラルのように扱 う事ができる 

  8. P21
 ©Techouse All Rights Reserved
 言語思想
 • 楽しく書ける!という思想 
 •

    →自然言語に近い設計になっている 
 • 自然言語でも同様の事象が起きる: 
 ◦ 私は「このバグが非同期処理に起因する」と推測している。
 ◦ 「キャッシュが有効化されている」環境では問題が発生しない。

  9. P31
 ©Techouse All Rights Reserved
 Ruby1.8以前 
 OSスレッド:言語スレッドが1:Nの関係 
 言語スレッド

    言語スレッド 言語スレッド OSスレッド ※スレッド:プロセスの処理の単位
  10. P33
 ©Techouse All Rights Reserved
 Ruby1.8以前 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド 言語スレッドを一定間隔で切り替えることで実現 

  11. P34
 ©Techouse All Rights Reserved
 Ruby1.8以前 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド 言語スレッドを一定間隔で切り替えることで実現 

  12. P37
 ©Techouse All Rights Reserved
 Ruby1.8以前 
 • 言語スレッドの待機問題 


    • スレッドのスケジューリングが複雑 
 • C拡張との噛み合いが悪い 
 言語スレッド 言語スレッド 言語スレッド OSスレッド read(2) read(2) ←待機 ←待機
  13. P38
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド OSスレッド:言語スレッドが1:1の関係 

  14. P39
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 言語スレッド待機問題を解消! 
 read(2) read(2)
  15. P40
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド read(2) read(2) 言語スレッド待機問題を解消! 

  16. P41
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド read(2) read(2) 言語スレッド待機問題を解消! 

  17. P42
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 新たな問題:言語スレッドの同時実行ができると…? 
 共 有 リ ソ | ス
  18. P43
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 新たな問題:言語スレッドの同時実行ができると…? 
 共 有 リ ソ | ス
  19. P44
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入 
 共 有 リ ソ | ス
  20. P45
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入→複数言語スレッドの同時実行を防ぐ 
 共 有 リ ソ | ス
  21. P46
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入→複数言語スレッドの同時実行を防ぐ 
 共 有 リ ソ | ス
  22. P47
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入→複数言語スレッドの同時実行を防ぐ 
 共 有 リ ソ | ス
  23. P48
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入→複数言語スレッドの同時実行を防ぐ 
 共 有 リ ソ | ス OSスレッドを増やしたのに 結局待たされてしまう!
  24. P49
 ©Techouse All Rights Reserved
 Ruby1.9 
 言語スレッド 言語スレッド 言語スレッド

    OSスレッド OSスレッド OSスレッド 解決策:GVLの導入→複数言語スレッドの同時実行を防ぐ 
 共 有 リ ソ | ス 共有リソースにアクセスする処理ばかりではない: • Rubyのデータ構造に触らない処理 • IO:ファイルはOSで管理されるため言語側での保護は不要
  25. P52
 ©Techouse All Rights Reserved
 Ruby1.9 
 他スレッドから中断要求時に実行する関数 
 •

    GVLを外す処理はIOなど待機時間の長いものである場合が多い • その性質上、他のスレッドから中断要求されるユースケースがある ◦ タイムアウト ◦ プログラム全体の終了 言語スレッド 言語スレッド 言語スレッド OSスレッド OSスレッド OSスレッド without GVL 中断要求
  26. P53
 ©Techouse All Rights Reserved
 Ruby1.9 
 問題:中断要求を受けると関数の情報を損失してしまう場合がある 
 •

    途中まで読み込んだファイル • 途中まで進行したバッチ処理 • 途中まで進行したダウンロード処理 言語スレッド 言語スレッド 言語スレッド OSスレッド OSスレッド OSスレッド without GVL 中断要求
  27. P54
 ©Techouse All Rights Reserved
 Ruby1.9 
 解決策:rb_thread_call_without_gvl2 
 中断要求を確認するタイミングの異なる別のバリアントを用意

    言語スレッド 言語スレッド 言語スレッド OSスレッド OSスレッド OSスレッド without GVL 中断要求
  28. ©Techouse All Rights Reserved P57 まとめ
 • 内部実装を読むと大抵面白い 
 •

    Rubyは日本語のドキュメントや解説が多いので読みやすい 
 • 皆もRubyをやるとよい