Slide 1

Slide 1 text

͸͡Ίͯ Ruby ͷίʔυΛಡΜͰΈͨ 💎 ਪ͠ϝιου source_location ͷ͘͠ΈΛ୳Δ nobu09 2025.03.01 TokyoWomen.rb #1

Slide 2

Slide 2 text

ࣗݾ঺հ • WebΤϯδχΞ • Ruby ΍ Rails ͰϓϩάϥϜΛॻ͘ͷ͕޷͖ • εΫϥϜͰ͍͍ײ͡ʹ։ൃ͢Δ͜ͱʹڵຯؔ৺ • খֶ5೥ੜͷ͜Ͳ΋͕͍·͢ • Rails Girls Tokyo 15th ίʔν • SIer → ϢϏϨδ → GMOϖύϘ → ZAICO nobu09 / ࣰా ৳ࢠ @nobu09_ nobu09

Slide 3

Slide 3 text

TokyoWomen.rb ͞Μͱࢲ • લ਎ͷΠϕϯτ TokyoGirls.rb Meetup vol.2 ʹࢀՃ • ͱͯ΋ָܹࢗ͘͠Λड͚ͨ 🙌 • ౰࣌ɺΔͼ·ʹΠϕϯτϨϙʔτ Λॻ͔͍͍ͤͯͨͩͨ 🥲 • ࠓ౓͸ొஃͯ͠Έ͍ͨͱࢥ͍ɺϓ ϩϙʔβϧΛఏग़ https://magazine.rubyist.net/articles/0061/0061-TokyoGirlsrb02Report.html

Slide 4

Slide 4 text

ࠓ೔͓࿩͢Δ͜ͱ ࣗ෼ͷ޷͖ͳ Ruby ͷϝιου͕ ͲΜͳ͘͠ΈͰಈ͍͍ͯΔͷ͔஌Γͨͯ͘ ͸͡Ίͯ Ruby ͷίʔυΛ ಡΜͰΈͨ࿩

Slide 5

Slide 5 text

΋͠಺༰ʹޡΓ͕͋Ε͹ ͝ࢦఠ͍͚ͨͩͨΒ͏Ε͍͠Ͱ͢ 😌

Slide 6

Slide 6 text

1. ޷͖ͳ Ruby ͷϝιου 💎

Slide 7

Slide 7 text

͋ͳͨͷ޷͖ͳ Ruby ͷϝιου͸ ͳΜͰ͔͢ʁ

Slide 8

Slide 8 text

͋ͳͨͷ޷͖ͳ Ruby ͷϝιου͸ ͳΜͰ͔͢ʁ map tap reject f latten compact dig each reduce caller presence gsub split times partition include?

Slide 9

Slide 9 text

Method#source_location 💓

Slide 10

Slide 10 text

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Ͱ ௐ΂Δ͜ͱ͕Ͱ͖Δ 👈

Slide 11

Slide 11 text

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 ΦϒδΣΫτͱͯ͠औಘʂ

Slide 12

Slide 12 text

source_location ͷศརͳͱ͜Ζᶄ Ͳ͜Ͱఆٛ͞Ε͔ͨ෼͔Γʹ͍͘ಈతʹఆٛ͞Εͨϝιου ʢdefine_methodʣ΍ gem ͷϝιουͷఆٛ΋͙͢ಛఆͰ͖Δ 🕵 ϝιου໊Ͱจࣈྻݕࡧͯ͠΋ ϝιουఆ͕ٛग़ͯ͜ͳ͍ɾɾ ॲཧ಺༰͕Θ͔Βͳ͍ɾɾ ྫ͑͹͜Μͳϝιουݺͼग़͠ͷఆٛݩΛ୳͍ͯ͠Δͱ͖ˣ

Slide 13

Slide 13 text

ͦΜͳͱ͖͸ source_location Λ࢖͓͏ ͜ͷίʔυͰ͸3ͭͷϝιου͕ಈతʹ ఆٛ͞Ε͍ͯΔ 📝 • hello_ a lice • hello_bob • hello_ch a rlie ͜ͷϞδϡʔϧͷ͜ͷߦͰ de fi ne_methodͰ ಈతʹϝιουఆٛ͞Εͯͨʂ 👀 ͔ͩΒจࣈྻݕࡧͰग़ͯ͜ͳ͔ͬͨͷ͔

Slide 14

Slide 14 text

✍ define_method https://docs.ruby-lang.org/ja/latest/method/Module/i/define_method.html define_method ͸ɺϝιου໊ΛಈతʹܾΊͯఆٛͰ͖Δ ϝιου ॊೈʹΫϥε΍Ϟδϡʔϧͷϝιουఆ͕ٛͰ͖Δ ࣅͨΑ͏ͳϝιουΛෳ਺ఆٛ͢Δͱ͖ͳͲʹศར จࣈྻల։Ͱϝιου໊ΛܾΊ͍ͯΔ ϝιουͷॲཧ಺༰͸ϒϩοΫͷதʹॻ͘ ʢdo ʙ endʣ

Slide 15

Slide 15 text

Ͳ͏΍ͬͯϝιουͷఆٛ৔ॴΛ औಘ͍ͯ͠ΔΜͩΖ͏ 💭

Slide 16

Slide 16 text

💡 ௐ΂ͯΈΑ͏

Slide 17

Slide 17 text

2. ΍ͬͯΈͨ͜ͱ 🔍

Slide 18

Slide 18 text

࠷ॳͷน Ͳ͔͜Β ௐ΂Ε͹͍͍͔ Θ͔Βͳ͍… 😐 Ch a tGPTʹ ௐ΂ํΛ ฉ͍ͯΈΑ͏ 💡

Slide 19

Slide 19 text

ChatGPT ʹௐ΂ํΛฉ͍ͯΈΔ Ruby ͷ source_loc a tion ͱ͍͏ϝιου͕ ศརͰ޷͖Ͱ͢ɻ ͲΜͳ͘͠Έͳͷ͔஌Γ͍ͨͰ͢ɻ Ͳ͏΍ͬͯௐ΂ͨΒྑ͍Ͱ͔͢ɻ RubyͷιʔείʔυΛಡΉ͜ͱͰɺsource_loc a tion ͷ ࣮૷΍ͦͷཪଆΛཧղͰ͖·͢ɻ 1. RubyͷιʔείʔυΛऔಘ͢Δ … ΍ͬͯΈͨ͜ͱ ᶃ

Slide 20

Slide 20 text

ChatGPT ͕͘ΕͨΞυόΠε 1. Ruby ͷιʔείʔυΛऔಘ͢Δ 2. source_location ͷ࣮૷Λ୳͢ 3. ؔ਺ͷ಺༰ΛಡΉ 4. C ߏ଄ମΛಡΉ 5. ඞཁʹԠͯ͡ Ruby ͷެࣜ υΩϡϝϯτΛಡΉ

Slide 21

Slide 21 text

ͳΔ΄Ͳ Θ͔ΒΜ Ͱ΋ɺͲ͏΍Β C ݴޠͰ ॻ͔Ε͍ͯΔΒ͍͠

Slide 22

Slide 22 text

΍ͬͯΈͨ͜ͱ ᶄ GitHub ͷ Ruby ͷϦϙδτϦ͔ΒιʔείʔυΛ clone https://github.com/ruby/ruby

Slide 23

Slide 23 text

git clone ʹ໿1෼͔͔ͬͨ 😲 ͚ͬ͜͏େ͖͍ϦϙδτϦɺͳΜ͔ͩײ֒ਂ͍… 🥺

Slide 24

Slide 24 text

ίʔυΛͲ͔͜Β ಡΜͰ͍͚͹͍͍ͷ͔ ϦϙδτϦେ͖͍ɾɾ Cݴޠɾɾɾ

Slide 25

Slide 25 text

΍ͬͯΈͨ͜ͱᶅ GitHub Copilot Chat ͱ ChatGPT ʹฉ͖ͳ͕Β ίʔυΛಡΈਐΊΔ

Slide 26

Slide 26 text

grep Ͱ source_location Λ͕͢͞ ͍ͬͺ͍ʂ😲 const_source_loc a rb_source_loc a test ΍ spec ΍ doc ϑΥϧμ͸ ݟͳͯ͘ྑͦ͞͏

Slide 27

Slide 27 text

proc.c ͜ͷ͋ͨΓͰ͸ʁ👀 https://github.com/ruby/ruby/blob/master/proc.c

Slide 28

Slide 28 text

ίʔυΛ ோΊͯΈΑ͏

Slide 29

Slide 29 text

rb_de f ine_methodͷهड़͕ ෳ਺Օॴ͋Δ 👀

Slide 30

Slide 30 text

rb_de f ine_method ͸ɺRuby ͷ C ֦ுϥΠϒϥϦͰ࢖༻͞ΕΔ ؔ਺ͰɺRuby ΫϥεʹϝιουΛఆٛ͢ΔͨΊʹ࢖༻͞Ε·͢ ͜ͷؔ਺͸ɺࢦఆ͞ΕͨΫϥεʹ৽͍͠ϝιουΛ௥Ճ͠·͢ ‼

Slide 31

Slide 31 text

💡 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 Λࢦఆʣ

Slide 32

Slide 32 text

💡 source_location ͸ Method ͚ͩ͡Όͳ͍ Proc, UnboundMethod, Binding Ϋϥεʹ΋ఆ͕ٛ͋Δ

Slide 33

Slide 33 text

Ϋϥε໊ Ϋϥεͷ໾ׂ source_loc a tionͰ औಘͰ͖Δ৘ใ Proc ϒϩοΫ΍ Proc Λද͢ ͦͷ Proc ͕ఆٛ͞Εͨ৔ॴ UnboundMethod ΫϥεͷΠϯελϯεϝιου ʢະόΠϯυʣΛද͢ ͦͷϝιου͕ఆٛ͞Εͨ৔ॴ Binding ม਺ͷείʔϓ΍࣮ߦίϯςΩε τΛද͢ ͦͷ binding ͕औಘ͞Εͨ৔ॴ 💡 source_location ͸ Method ͚ͩ͡Όͳ͍ Proc, UnboundMethod, Binding Ϋϥεʹ΋ఆ͕ٛ͋Δ

Slide 34

Slide 34 text

✍ Proc#source_location https://docs.ruby-lang.org/ja/latest/method/Proc/i/source_location.html Proc͕ఆٛ͞Εͨ৔ॴΛฦ͢

Slide 35

Slide 35 text

✍ UnboundMethod#source_location https://docs.ruby-lang.org/ja/latest/class/UnboundMethod.html#I_SOURCE_LOCATION ΫϥεͷΠϯελϯεϝιουͷఆٛ৔ॴΛಛఆ͢Δ UnboundMethod ͸ɺϨγʔόΛ࣋ͨͳ͍ϝιουΛද͢Ϋϥε ಛఆͷΠϯελϯεʹόΠϯυ͞Ε͍ͯͳ͍ঢ়ଶ

Slide 36

Slide 36 text

✍ Binding#source_location https://docs.ruby-lang.org/ja/latest/class/Binding.html#I_SOURCE_LOCATION ͦͷ binding ͕औಘ͞Εͨ৔ॴΛฦ͢ Binding Λ࢖͏ͱɺݱࡏͷείʔϓΛΩϟϓνϟ͠ɺޙ͔Βૢ࡞ɾࢀরͰ͖Δ eval ͰείʔϓΛࢦఆͯ͠ૢ࡞ͨ͠Γɺ pry ͰσόοάͰ͖Δ

Slide 37

Slide 37 text

rb_define_method ͔Βݟ͍ͯ͘🔍 Method#source_location ͸ C ݴޠͷ rb_method_location ؔ਺Λ ݺͼग़͍ͯ͠Δ

Slide 38

Slide 38 text

rb_method_location ͸͜͜ 🚩 https://github.com/ruby/ruby/blob/c27f433d7c0ddb13501f7e19a0158da3aec1577c/proc.c#L3045-L3057

Slide 39

Slide 39 text

VALUE ͬͯͳʹʁ ໭Γ஋΍Ҿ਺ͷVALUEͬͯ Ͳ͏͍͏ҙຯͳΜͩΖ͏ʁ 👀

Slide 40

Slide 40 text

💡 VALUE ͱ͸ • CݴޠͰ Ruby ͷ͢΂ͯͷΦϒδΣΫτΛද͢ܕ • RubyͰ͸ɺ͢΂ͯͷΦϒδΣΫτ͕ VALUE ͷܕΛ ࢖ͬͯ؅ཧ͞Ε͍ͯΔ https://github.com/ruby/ruby/blob/master/include/ruby/internal/value.h VALUE ͸ Cݴޠͷ uintptr_t ܕͱͯ͠ఆٛ͞Ε͍ͯΔ

Slide 41

Slide 41 text

rb_method_location Ҿ਺ͱͯ͠ɺRuby ͷΦϒδΣΫτͰ͋Δ VALUE ܕͷ method Λड͚औ͍ͬͯΔ

Slide 42

Slide 42 text

࣍͸ method_def_location ΛݟΔ 🔍

Slide 43

Slide 43 text

method_def_location ͸͜͜ 🚩 https://github.com/ruby/ruby/blob/ c27f433d7c0ddb13501f7e19a0158da3aec1577c/proc.c#L3027-L3036

Slide 44

Slide 44 text

method_def_location ΛಡΈղ͘ᶃ ͜ͷҾ਺͸ɺRubyͷϝιουఆٛΛද͢ߏ଄ମ rb_method_de f inition_t ΁ͷϙΠϯλ ϝιουఆٛͷৄࡉ৘ใʢϝιουͷछྨ΍ϝιουͷຊମͳͲʣΛؚ ΜͰ͍Δߏ଄ମ https://github.com/ruby/ruby/blob/dfc25204235079e23eadf9e0ba860c1ebcb14325/method.h#L179-L198

Slide 45

Slide 45 text

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 ϝιου

Slide 46

Slide 46 text

method_def_location ΛಡΈղ͘ᶅ ͦΕҎ֎ͷ௨ৗͷϝιουͷ৔߹ ɾmethod_def_iseq ؔ਺Λ࢖༻ͯ͠ϝιουఆٛͷ໋ྩγʔέϯεʢISeqʣΛऔಘ ɾͦͷҐஔ৘ใΛ iseq_loc a tion ؔ਺Λ࢖ͬͯฦ͢

Slide 47

Slide 47 text

💡Ruby ͷ໋ྩγʔέϯεʢISeqʣͱ͸ • Ruby ͷίʔυ͸௚઀࣮ߦ͞ΕͣɺҰ౓όΠτίʔυʹม׵͞ΕΔ • ͜ͷόΠτίʔυ໋͕ྩγʔέϯεʢISeq / Instruction Sequenceʣ • ISeq ͸ϝιουఆٛ࣌΍εΫϦϓτͷղੳ࣌ʹ࡞ΒΕΔ • Ruby VM ͸ ISeq Λղऍɾ࣮ߦ͢Δ͜ͱͰϓϩάϥϜΛಈ͔͢ Ruby VM Ruby ͷίʔυ ໋ྩγʔέϯεʢISeqʣ ม׵ ղऍɾ࣮ߦ

Slide 48

Slide 48 text

໋ྩγʔέϯεΛݟͯΈΔ 🔍 https://docs.ruby-lang.org/ja/latest/class/RubyVM=3a=3aInstructionSequence.html RubyVM::InstructionSequence Ϋϥε͸ ໋ྩγʔέϯεʢISeqʣΛද͢Ϋϥε disassemble ϝιουͰਓ͕ؒಡΊΔจࣈྻʹ ม׵ͯ͘͠ΕΔ

Slide 49

Slide 49 text

໋ྩγʔέϯεΛݟͯΈΔ 🔍 ISeqͷதʹϝιου͕ఆٛ͞ΕͨϑΝΠϧ΍ ߦ൪߸Λ͍࣋ͬͯΔ source_location͸ɺISeq ͷதʹ͋Δ ϝιουͷఆٛ৔ॴͷ৘ใΛฦ͍ͯ͠Δ

Slide 50

Slide 50 text

💡໋ྩγʔέϯεͱ source_location • Ruby ͷϝιου͸ఆٛ࣌ʹ໋ྩγʔέϯεʢISeqʣʹ ม׵͞ΕΔ • ISeq ʹ͸ɺϝιουͷఆٛϑΝΠϧ΍ߦ൪߸ͳͲͷ৘ ใؚ͕·Ε͍ͯΔ • ௨ৗͷϝιουͷ৔߹ɺsource_location ͸ ISeq ͔Βఆ ٛ৔ॴΛऔಘͯ͠ฦ͢ 💡

Slide 51

Slide 51 text

3. Θ͔ͬͨ͜ͱ 💡

Slide 52

Slide 52 text

💡source_location ͕ฦ͢৘ใ͸ ϝιουͷछྨ ϝιουఆٛ৔ॴΛ͍࣋ͬͯΔ৔ॴ source_loc a tion ͷॲཧ ௨ৗͷϝιου ໋ྩγʔέϯεʢISeqʣ ໋ྩγʔέϯε͔Βϝιουఆٛ৔ ॴΛฦ͢ ଐੑΞΫηε༻ͷ ϝιου Ruby ͷϝιουͷఆٛ৘ใΛ֨ೲ͢ Δߏ଄ମʢrb_method_de f inition_tʣ ߏ଄ମ͔Βϝιουఆٛ৔ॴΛฦ͢

Slide 53

Slide 53 text

• Method#source_location ͸ɺϝιουͷఆٛ৘ใΛ ࣮ߦ࣌ʹಈతʹղੳ͢ΔͷͰ͸ͳ͘ɺ͋Β͔͡Ίϝ ιουఆٛ࣌ʹੜ੒͞Ε͍ͯΔ৘ใΛฦ͍ͯͨ͠ 💡 • Ruby Ͱ͸ɺϝιου͕Ͳ͜Ͱఆٛ͞Εͨͷ͔Λޙ ͔Β؆୯ʹ஌Δ͜ͱ͕Ͱ͖Δ͘͠Έ͕͋Δ ࢖͍৺஍΍ख৮Γ͕͍͍ Method#source_loc a tion͕ ΍ͬͺΓ޷͖ʂ

Slide 54

Slide 54 text

4. ;Γ͔͑ͬͯ 🔭

Slide 55

Slide 55 text

͸͡Ίͯ Ruby ͷίʔυΛͷ͍ͧͯΈͨ AI ʹ൐૸ͯ͠΋Βͬͨ ʮಡΜͩʯͱ͍͏ΑΓʮோΊΔʯʹ͍ۙମݧ ཧղͰ͖ͳ͍͜ͱ΋ଟ͍͚ΕͲ ৽͍͠ؾ͖ͮ΋ͨ͘͞Μ

Slide 56

Slide 56 text

Θ͔Βͳ͍͚Ͳͨͷ͍͠ Θ͔Βͳ͍͔Βͨͷ͍͠ 🙌

Slide 57

Slide 57 text

source_location Λ͖͔͚ͬʹ ·ͨҧ͏ Ruby ͷίʔυ΋ ಡΜͰ͍͖͍ͨ

Slide 58

Slide 58 text

͋Γ͕ͱ͏͍͟͝·ͨ͠