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

推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた

nobu09
February 28, 2025

推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた

TokyoWomen.rb #1(2025.03.01)の登壇資料です
https://tokyowomenrb.connpass.com/event/342573/

nobu09

February 28, 2025
Tweet

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ • WebΤϯδχΞ • Ruby ΍ Rails ͰϓϩάϥϜΛॻ͘ͷ͕޷͖ • εΫϥϜͰ͍͍ײ͡ʹ։ൃ͢Δ͜ͱʹڵຯؔ৺

    • খֶ5೥ੜͷ͜Ͳ΋͕͍·͢ • Rails Girls Tokyo 15th ίʔν • SIer → ϢϏϨδ → GMOϖύϘ → ZAICO nobu09 / ࣰా ৳ࢠ @nobu09_ nobu09
  2. TokyoWomen.rb ͞Μͱࢲ • લ਎ͷΠϕϯτ TokyoGirls.rb Meetup vol.2 ʹࢀՃ • ͱͯ΋ָܹࢗ͘͠Λड͚ͨ

    🙌 • ౰࣌ɺΔͼ·ʹΠϕϯτϨϙʔτ Λॻ͔͍͍ͤͯͨͩͨ 🥲 • ࠓ౓͸ొஃͯ͠Έ͍ͨͱࢥ͍ɺϓ ϩϙʔβϧΛఏग़ https://magazine.rubyist.net/articles/0061/0061-TokyoGirlsrb02Report.html
  3. ͋ͳͨͷ޷͖ͳ Ruby ͷϝιου͸ ͳΜͰ͔͢ʁ map tap reject f latten compact

    dig each reduce caller presence gsub split times partition include?
  4. 1. MyClass.new → MyClass ͷ৽͍͠Πϯελϯε࡞੒ 2. method(:my_method) ɹˠ MyClassΠϯελϯεͷ my_method

    Λ Method ΦϒδΣΫτͱͯ͠औಘ ɹˠ method ͸ Kernel Ϟδϡʔϧʹఆٛ͞Ε͍ͯΔͨΊ͢΂ͯͷΦϒδΣΫτͰར༻Ͱ͖Δ ✍ MyClass.new.method(:my_method) ͸ԿΛ͍ͯ͠Δʁ https://docs.ruby-lang.org/ja/latest/class/Object.html#I_METHOD MyClass ͷΠϯελϯεͷ my_method ϝιουΛ Method ΦϒδΣΫτͱͯ͠औಘʂ
  5. ͦΜͳͱ͖͸ source_location Λ࢖͓͏ ͜ͷίʔυͰ͸3ͭͷϝιου͕ಈతʹ ఆٛ͞Ε͍ͯΔ 📝 • hello_ a lice

    • hello_bob • hello_ch a rlie ͜ͷϞδϡʔϧͷ͜ͷߦͰ de fi ne_methodͰ ಈతʹϝιουఆٛ͞Εͯͨʂ 👀 ͔ͩΒจࣈྻݕࡧͰग़ͯ͜ͳ͔ͬͨͷ͔
  6. ChatGPT ʹௐ΂ํΛฉ͍ͯΈΔ Ruby ͷ source_loc a tion ͱ͍͏ϝιου͕ ศརͰ޷͖Ͱ͢ɻ ͲΜͳ͘͠Έͳͷ͔஌Γ͍ͨͰ͢ɻ

    Ͳ͏΍ͬͯௐ΂ͨΒྑ͍Ͱ͔͢ɻ RubyͷιʔείʔυΛಡΉ͜ͱͰɺsource_loc a tion ͷ ࣮૷΍ͦͷཪଆΛཧղͰ͖·͢ɻ 1. RubyͷιʔείʔυΛऔಘ͢Δ … ΍ͬͯΈͨ͜ͱ ᶃ
  7. 💡 rb_define_method ͜ͷؔ਺ͰɺRuby ͷΠϯελϯεϝιουΛఆ͍ٛͯ͠Δʂ Ruby ͷΫϥε΍ϞδϡʔϧʹΠϯελϯεϝιουΛఆٛ͢ΔͨΊͷ C ݴޠͷؔ਺ͰɺRuby ͷ def

    ʹ૬౰͢Δ https://docs.ruby-lang.org/ja/latest/function/rb_define_method.html • klass: ϝιουΛఆٛ͢ΔΫϥε • name: ϝιουͷ໊લ • func: ϝιουͷ࣮૷Λఏڙ͢Δ C ؔ਺΁ͷϙΠϯλ • argc: ϝιου͕ड͚औΔҾ਺ͷ਺ʢՄม௕Ҿ਺ͷ৔߹͸ -1 Λࢦఆʣ
  8. Ϋϥε໊ Ϋϥεͷ໾ׂ source_loc a tionͰ औಘͰ͖Δ৘ใ Proc ϒϩοΫ΍ Proc Λද͢

    ͦͷ Proc ͕ఆٛ͞Εͨ৔ॴ UnboundMethod ΫϥεͷΠϯελϯεϝιου ʢະόΠϯυʣΛද͢ ͦͷϝιου͕ఆٛ͞Εͨ৔ॴ Binding ม਺ͷείʔϓ΍࣮ߦίϯςΩε τΛද͢ ͦͷ binding ͕औಘ͞Εͨ৔ॴ 💡 source_location ͸ Method ͚ͩ͡Όͳ͍ Proc, UnboundMethod, Binding Ϋϥεʹ΋ఆ͕ٛ͋Δ
  9. 💡 VALUE ͱ͸ • CݴޠͰ Ruby ͷ͢΂ͯͷΦϒδΣΫτΛද͢ܕ • RubyͰ͸ɺ͢΂ͯͷΦϒδΣΫτ͕ VALUE

    ͷܕΛ ࢖ͬͯ؅ཧ͞Ε͍ͯΔ https://github.com/ruby/ruby/blob/master/include/ruby/internal/value.h VALUE ͸ Cݴޠͷ uintptr_t ܕͱͯ͠ఆٛ͞Ε͍ͯΔ
  10. 💡Ruby ͷ໋ྩγʔέϯεʢISeqʣͱ͸ • Ruby ͷίʔυ͸௚઀࣮ߦ͞ΕͣɺҰ౓όΠτίʔυʹม׵͞ΕΔ • ͜ͷόΠτίʔυ໋͕ྩγʔέϯεʢISeq / Instruction Sequenceʣ

    • ISeq ͸ϝιουఆٛ࣌΍εΫϦϓτͷղੳ࣌ʹ࡞ΒΕΔ • Ruby VM ͸ ISeq Λղऍɾ࣮ߦ͢Δ͜ͱͰϓϩάϥϜΛಈ͔͢ Ruby VM Ruby ͷίʔυ ໋ྩγʔέϯεʢISeqʣ ม׵ ղऍɾ࣮ߦ
  11. 💡source_location ͕ฦ͢৘ใ͸ ϝιουͷछྨ ϝιουఆٛ৔ॴΛ͍࣋ͬͯΔ৔ॴ source_loc a tion ͷॲཧ ௨ৗͷϝιου ໋ྩγʔέϯεʢISeqʣ

    ໋ྩγʔέϯε͔Βϝιουఆٛ৔ ॴΛฦ͢ ଐੑΞΫηε༻ͷ ϝιου Ruby ͷϝιουͷఆٛ৘ใΛ֨ೲ͢ Δߏ଄ମʢrb_method_de f inition_tʣ ߏ଄ମ͔Βϝιουఆٛ৔ॴΛฦ͢