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

Rubyが好きな話

Sponsored · SiteGround - Reliable hosting with speed, security, and support you can count on.
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をやるとよい