Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた
Search
nobu09
February 28, 2025
Programming
2.2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
推しメソッドsource_locationのしくみを探る - はじめてRubyのコードを読んでみた
TokyoWomen.rb #1(2025.03.01)の登壇資料です
https://tokyowomenrb.connpass.com/event/342573/
nobu09
February 28, 2025
More Decks by nobu09
See All by nobu09
カンファレンスに託児サポートがあるということ / Having Childcare Support at Conferences
nobu09
1
1.8k
Other Decks in Programming
See All in Programming
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
自動化したのに回らない テスト運用の壁―AI時代の品質責任と生産性
mfunaki
0
160
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
110
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
0
1.8k
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
Foundation Models frameworkで画像分析
ryodeveloper
1
610
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
550
「寝てても仕事が進む」Claude Codeで組む第二の脳
tomoyafujita2016
0
330
Go 1.27 における memory allocation の高速化
andpad
0
170
Google Apps Script で Ruby を動かす
kawahara
0
220
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.3k
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
7.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Music & Morning Musume
bryan
47
7.3k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
470
Speed Design
sergeychernyshev
33
2k
Automating Front-end Workflow
addyosmani
1369
210k
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.8k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.7k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Done Done
chrislema
186
16k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.1k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Transcript
͡Ίͯ Ruby ͷίʔυΛಡΜͰΈͨ 💎 ਪ͠ϝιου source_location ͷ͘͠ΈΛ୳Δ nobu09 2025.03.01 TokyoWomen.rb
#1
ࣗݾհ • WebΤϯδχΞ • Ruby Rails ͰϓϩάϥϜΛॻ͘ͷ͕͖ • εΫϥϜͰ͍͍ײ͡ʹ։ൃ͢Δ͜ͱʹڵຯؔ৺
• খֶ5ੜͷ͜Ͳ͕͍·͢ • Rails Girls Tokyo 15th ίʔν • SIer → ϢϏϨδ → GMOϖύϘ → ZAICO nobu09 / ࣰా ৳ࢠ @nobu09_ nobu09
TokyoWomen.rb ͞Μͱࢲ • લͷΠϕϯτ TokyoGirls.rb Meetup vol.2 ʹࢀՃ • ͱָܹͯ͘͠Λड͚ͨ
🙌 • ࣌ɺΔͼ·ʹΠϕϯτϨϙʔτ Λॻ͔͍͍ͤͯͨͩͨ 🥲 • ࠓొஃͯ͠Έ͍ͨͱࢥ͍ɺϓ ϩϙʔβϧΛఏग़ https://magazine.rubyist.net/articles/0061/0061-TokyoGirlsrb02Report.html
ࠓ͓͢Δ͜ͱ ࣗͷ͖ͳ Ruby ͷϝιου͕ ͲΜͳ͘͠ΈͰಈ͍͍ͯΔͷ͔Γͨͯ͘ ͡Ίͯ Ruby ͷίʔυΛ ಡΜͰΈͨ
͠༰ʹޡΓ͕͋Ε ͝ࢦఠ͍͚ͨͩͨΒ͏Ε͍͠Ͱ͢ 😌
1. ͖ͳ Ruby ͷϝιου 💎
͋ͳͨͷ͖ͳ Ruby ͷϝιου ͳΜͰ͔͢ʁ
͋ͳͨͷ͖ͳ Ruby ͷϝιου ͳΜͰ͔͢ʁ map tap reject f latten compact
dig each reduce caller presence gsub split times partition include?
Method#source_location 💓
source_location ͷศརͳͱ͜Ζᶃ ϝιου͕ఆٛ͞Ε͍ͯΔιʔείʔυͷϑΝΠϧͱߦΛڭ͑ͯ ͘ΕΔʂ https://docs.ruby-lang.org/ja/latest/method/Method/i/ source_location.html my_method ϝιου my_class.rb ϑΝΠϧͷ2ߦʹ
ఆٛ͞Ε͍ͯΔ 💡 irb r a ils consoleͰ ௐΔ͜ͱ͕Ͱ͖Δ 👈
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 ΦϒδΣΫτͱͯ͠औಘʂ
source_location ͷศརͳͱ͜Ζᶄ Ͳ͜Ͱఆٛ͞Ε͔͔ͨΓʹ͍͘ಈతʹఆٛ͞Εͨϝιου ʢdefine_methodʣ gem ͷϝιουͷఆ͙ٛ͢ಛఆͰ͖Δ 🕵 ϝιου໊Ͱจࣈྻݕࡧͯ͠ ϝιουఆ͕ٛग़ͯ͜ͳ͍ɾɾ ॲཧ༰͕Θ͔Βͳ͍ɾɾ
ྫ͑͜Μͳϝιουݺͼग़͠ͷఆٛݩΛ୳͍ͯ͠Δͱ͖ˣ
ͦΜͳͱ͖ source_location Λ͓͏ ͜ͷίʔυͰ3ͭͷϝιου͕ಈతʹ ఆٛ͞Ε͍ͯΔ 📝 • hello_ a lice
• hello_bob • hello_ch a rlie ͜ͷϞδϡʔϧͷ͜ͷߦͰ de fi ne_methodͰ ಈతʹϝιουఆٛ͞Εͯͨʂ 👀 ͔ͩΒจࣈྻݕࡧͰग़ͯ͜ͳ͔ͬͨͷ͔
✍ define_method https://docs.ruby-lang.org/ja/latest/method/Module/i/define_method.html define_method ɺϝιου໊ΛಈతʹܾΊͯఆٛͰ͖Δ ϝιου ॊೈʹΫϥεϞδϡʔϧͷϝιουఆ͕ٛͰ͖Δ ࣅͨΑ͏ͳϝιουΛෳఆٛ͢Δͱ͖ͳͲʹศར จࣈྻల։Ͱϝιου໊ΛܾΊ͍ͯΔ ϝιουͷॲཧ༰ϒϩοΫͷதʹॻ͘
ʢdo ʙ endʣ
Ͳ͏ͬͯϝιουͷఆٛॴΛ औಘ͍ͯ͠ΔΜͩΖ͏ 💭
💡 ௐͯΈΑ͏
2. ͬͯΈͨ͜ͱ 🔍
࠷ॳͷน Ͳ͔͜Β ௐΕ͍͍͔ Θ͔Βͳ͍… 😐 Ch a tGPTʹ ௐํΛ ฉ͍ͯΈΑ͏
💡
ChatGPT ʹௐํΛฉ͍ͯΈΔ Ruby ͷ source_loc a tion ͱ͍͏ϝιου͕ ศརͰ͖Ͱ͢ɻ ͲΜͳ͘͠Έͳͷ͔Γ͍ͨͰ͢ɻ
Ͳ͏ͬͯௐͨΒྑ͍Ͱ͔͢ɻ RubyͷιʔείʔυΛಡΉ͜ͱͰɺsource_loc a tion ͷ ࣮ͦͷཪଆΛཧղͰ͖·͢ɻ 1. RubyͷιʔείʔυΛऔಘ͢Δ … ͬͯΈͨ͜ͱ ᶃ
ChatGPT ͕͘ΕͨΞυόΠε 1. Ruby ͷιʔείʔυΛऔಘ͢Δ 2. source_location ͷ࣮Λ୳͢ 3. ؔͷ༰ΛಡΉ
4. C ߏମΛಡΉ 5. ඞཁʹԠͯ͡ Ruby ͷެࣜ υΩϡϝϯτΛಡΉ
ͳΔ΄Ͳ Θ͔ΒΜ ͰɺͲ͏Β C ݴޠͰ ॻ͔Ε͍ͯΔΒ͍͠
ͬͯΈͨ͜ͱ ᶄ GitHub ͷ Ruby ͷϦϙδτϦ͔ΒιʔείʔυΛ clone https://github.com/ruby/ruby
git clone ʹ1͔͔ͬͨ 😲 ͚ͬ͜͏େ͖͍ϦϙδτϦɺͳΜ͔ͩײ֒ਂ͍… 🥺
ίʔυΛͲ͔͜Β ಡΜͰ͍͚͍͍ͷ͔ ϦϙδτϦେ͖͍ɾɾ Cݴޠɾɾɾ
ͬͯΈͨ͜ͱᶅ GitHub Copilot Chat ͱ ChatGPT ʹฉ͖ͳ͕Β ίʔυΛಡΈਐΊΔ
grep Ͱ source_location Λ͕͢͞ ͍ͬͺ͍ʂ😲 const_source_loc a rb_source_loc a test
spec doc ϑΥϧμ ݟͳͯ͘ྑͦ͞͏
proc.c ͜ͷ͋ͨΓͰʁ👀 https://github.com/ruby/ruby/blob/master/proc.c
ίʔυΛ ோΊͯΈΑ͏
rb_de f ine_methodͷهड़͕ ෳՕॴ͋Δ 👀
rb_de f ine_method ɺRuby ͷ C ֦ுϥΠϒϥϦͰ༻͞ΕΔ ؔͰɺRuby ΫϥεʹϝιουΛఆٛ͢ΔͨΊʹ༻͞Ε·͢ ͜ͷؔɺࢦఆ͞ΕͨΫϥεʹ৽͍͠ϝιουΛՃ͠·͢
‼
💡 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 Λࢦఆʣ
💡 source_location Method ͚ͩ͡Όͳ͍ Proc, UnboundMethod, Binding Ϋϥεʹఆ͕ٛ͋Δ
Ϋϥε໊ Ϋϥεͷׂ source_loc a tionͰ औಘͰ͖Δใ Proc ϒϩοΫ Proc Λද͢
ͦͷ Proc ͕ఆٛ͞Εͨॴ UnboundMethod ΫϥεͷΠϯελϯεϝιου ʢະόΠϯυʣΛද͢ ͦͷϝιου͕ఆٛ͞Εͨॴ Binding มͷείʔϓ࣮ߦίϯςΩε τΛද͢ ͦͷ binding ͕औಘ͞Εͨॴ 💡 source_location Method ͚ͩ͡Όͳ͍ Proc, UnboundMethod, Binding Ϋϥεʹఆ͕ٛ͋Δ
✍ Proc#source_location https://docs.ruby-lang.org/ja/latest/method/Proc/i/source_location.html Proc͕ఆٛ͞ΕͨॴΛฦ͢
✍ UnboundMethod#source_location https://docs.ruby-lang.org/ja/latest/class/UnboundMethod.html#I_SOURCE_LOCATION ΫϥεͷΠϯελϯεϝιουͷఆٛॴΛಛఆ͢Δ UnboundMethod ɺϨγʔόΛ࣋ͨͳ͍ϝιουΛද͢Ϋϥε ಛఆͷΠϯελϯεʹόΠϯυ͞Ε͍ͯͳ͍ঢ়ଶ
✍ Binding#source_location https://docs.ruby-lang.org/ja/latest/class/Binding.html#I_SOURCE_LOCATION ͦͷ binding ͕औಘ͞ΕͨॴΛฦ͢ Binding Λ͏ͱɺݱࡏͷείʔϓΛΩϟϓνϟ͠ɺޙ͔Βૢ࡞ɾࢀরͰ͖Δ eval ͰείʔϓΛࢦఆͯ͠ૢ࡞ͨ͠Γɺ
pry ͰσόοάͰ͖Δ
rb_define_method ͔Βݟ͍ͯ͘🔍 Method#source_location C ݴޠͷ rb_method_location ؔΛ ݺͼग़͍ͯ͠Δ
rb_method_location ͜͜ 🚩 https://github.com/ruby/ruby/blob/c27f433d7c0ddb13501f7e19a0158da3aec1577c/proc.c#L3045-L3057
VALUE ͬͯͳʹʁ ΓҾͷVALUEͬͯ Ͳ͏͍͏ҙຯͳΜͩΖ͏ʁ 👀
💡 VALUE ͱ • CݴޠͰ Ruby ͷͯ͢ͷΦϒδΣΫτΛද͢ܕ • RubyͰɺͯ͢ͷΦϒδΣΫτ͕ VALUE
ͷܕΛ ͬͯཧ͞Ε͍ͯΔ https://github.com/ruby/ruby/blob/master/include/ruby/internal/value.h VALUE Cݴޠͷ uintptr_t ܕͱͯ͠ఆٛ͞Ε͍ͯΔ
rb_method_location Ҿͱͯ͠ɺRuby ͷΦϒδΣΫτͰ͋Δ VALUE ܕͷ method Λड͚औ͍ͬͯΔ
࣍ method_def_location ΛݟΔ 🔍
method_def_location ͜͜ 🚩 https://github.com/ruby/ruby/blob/ c27f433d7c0ddb13501f7e19a0158da3aec1577c/proc.c#L3027-L3036
method_def_location ΛಡΈղ͘ᶃ ͜ͷҾɺRubyͷϝιουఆٛΛද͢ߏମ rb_method_de f inition_t ͷϙΠϯλ ϝιουఆٛͷৄࡉใʢϝιουͷछྨϝιουͷຊମͳͲʣΛؚ ΜͰ͍Δߏମ https://github.com/ruby/ruby/blob/dfc25204235079e23eadf9e0ba860c1ebcb14325/method.h#L179-L198
method_def_location ΛಡΈղ͘ᶄ ϝιουͷछྨ͕ҎԼͷ߹ɺҾͷrb_method_de f inition_t ߏମͷதʹҐஔใ͕ଘࡏ͢Δ ߹ͦͷҐஔใΛෳͯ͠ฦ͠ɺҐஔใ͕ߏମʹଘࡏ͠ͳ͍߹ nil Λฦ͢ ɾVM_METHOD_TYPE_ATTRSET
ɹɹ ଐੑͷ setter ϝιουʢ a ttr_ a ccessor a ttr_writer Ͱఆٛ͞Εͨ setterʣ ɾVM_METHOD_TYPE_IVAR ɹɹΠϯελϯεมΛฦ͢ getter ϝιου
method_def_location ΛಡΈղ͘ᶅ ͦΕҎ֎ͷ௨ৗͷϝιουͷ߹ ɾmethod_def_iseq ؔΛ༻ͯ͠ϝιουఆٛͷ໋ྩγʔέϯεʢISeqʣΛऔಘ ɾͦͷҐஔใΛ iseq_loc a tion ؔΛͬͯฦ͢
💡Ruby ͷ໋ྩγʔέϯεʢISeqʣͱ • Ruby ͷίʔυ࣮ߦ͞ΕͣɺҰόΠτίʔυʹม͞ΕΔ • ͜ͷόΠτίʔυ໋͕ྩγʔέϯεʢISeq / Instruction Sequenceʣ
• ISeq ϝιουఆٛ࣌εΫϦϓτͷղੳ࣌ʹ࡞ΒΕΔ • Ruby VM ISeq Λղऍɾ࣮ߦ͢Δ͜ͱͰϓϩάϥϜΛಈ͔͢ Ruby VM Ruby ͷίʔυ ໋ྩγʔέϯεʢISeqʣ ม ղऍɾ࣮ߦ
໋ྩγʔέϯεΛݟͯΈΔ 🔍 https://docs.ruby-lang.org/ja/latest/class/RubyVM=3a=3aInstructionSequence.html RubyVM::InstructionSequence Ϋϥε ໋ྩγʔέϯεʢISeqʣΛද͢Ϋϥε disassemble ϝιουͰਓ͕ؒಡΊΔจࣈྻʹ มͯ͘͠ΕΔ
໋ྩγʔέϯεΛݟͯΈΔ 🔍 ISeqͷதʹϝιου͕ఆٛ͞ΕͨϑΝΠϧ ߦ൪߸Λ͍࣋ͬͯΔ source_locationɺISeq ͷதʹ͋Δ ϝιουͷఆٛॴͷใΛฦ͍ͯ͠Δ
💡໋ྩγʔέϯεͱ source_location • Ruby ͷϝιουఆٛ࣌ʹ໋ྩγʔέϯεʢISeqʣʹ ม͞ΕΔ • ISeq ʹɺϝιουͷఆٛϑΝΠϧߦ൪߸ͳͲͷ ใؚ͕·Ε͍ͯΔ
• ௨ৗͷϝιουͷ߹ɺsource_location ISeq ͔Βఆ ٛॴΛऔಘͯ͠ฦ͢ 💡
3. Θ͔ͬͨ͜ͱ 💡
💡source_location ͕ฦ͢ใ ϝιουͷछྨ ϝιουఆٛॴΛ͍࣋ͬͯΔॴ source_loc a tion ͷॲཧ ௨ৗͷϝιου ໋ྩγʔέϯεʢISeqʣ
໋ྩγʔέϯε͔Βϝιουఆٛ ॴΛฦ͢ ଐੑΞΫηε༻ͷ ϝιου Ruby ͷϝιουͷఆٛใΛ֨ೲ͢ Δߏମʢrb_method_de f inition_tʣ ߏମ͔ΒϝιουఆٛॴΛฦ͢
• Method#source_location ɺϝιουͷఆٛใΛ ࣮ߦ࣌ʹಈతʹղੳ͢ΔͷͰͳ͘ɺ͋Β͔͡Ίϝ ιουఆٛ࣌ʹੜ͞Ε͍ͯΔใΛฦ͍ͯͨ͠ 💡 • Ruby Ͱɺϝιου͕Ͳ͜Ͱఆٛ͞Εͨͷ͔Λޙ ͔Β؆୯ʹΔ͜ͱ͕Ͱ͖Δ͘͠Έ͕͋Δ
͍৺ख৮Γ͕͍͍ Method#source_loc a tion͕ ͬͺΓ͖ʂ
4. ;Γ͔͑ͬͯ 🔭
͡Ίͯ Ruby ͷίʔυΛͷ͍ͧͯΈͨ AI ʹͯ͠Βͬͨ ʮಡΜͩʯͱ͍͏ΑΓʮோΊΔʯʹ͍ۙମݧ ཧղͰ͖ͳ͍͜ͱଟ͍͚ΕͲ ৽͍͠ؾ͖ͮͨ͘͞Μ
Θ͔Βͳ͍͚Ͳͨͷ͍͠ Θ͔Βͳ͍͔Βͨͷ͍͠ 🙌
source_location Λ͖͔͚ͬʹ ·ͨҧ͏ Ruby ͷίʔυ ಡΜͰ͍͖͍ͨ
͋Γ͕ͱ͏͍͟͝·ͨ͠