Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
YARV INTRODUCTION
Hirofumi Wakasugi
December 20, 2015
Programming
0
33
YARV INTRODUCTION
yochiyochirb 100th meetup (2015-12-20)
Hirofumi Wakasugi
December 20, 2015
Tweet
Share
More Decks by Hirofumi Wakasugi
See All by Hirofumi Wakasugi
5t111111
1
200
5t111111
3
280
5t111111
0
210
5t111111
0
100
5t111111
3
770
5t111111
1
370
5t111111
0
200
5t111111
4
410
5t111111
0
77
Other Decks in Programming
See All in Programming
tooppoo
1
440
kaz29
2
120
dnskimo
8
1.5k
kubode
1
170
yasuakiomokawa
0
430
manfredsteyer
PRO
0
280
n1215
1
430
progate
2
450
kamilahsantos
0
130
drumato
1
220
hyodol2513
2
1.1k
yusuke57
0
120
Featured
See All Featured
mongodb
23
3.9k
denniskardys
220
120k
addyosmani
494
110k
addyosmani
312
21k
malarkey
119
16k
danielanewman
2
550
tammielis
237
23k
bermonpainter
343
26k
chrislema
231
16k
ufuk
56
5.5k
edds
56
9.4k
destraynor
146
19k
Transcript
YARV INTRODUCTION WAKASUGI HIROFUMI DECEMBER 20, 2015
3VCZϓϩάϥϜ͕ಈ͘ΈͷதͰɺ த৺తͳׂͷͭΛΊΔ:"37Λ ؆୯ʹհ͠·͢ɻ YARVINTRODUCTION
:"37 :FU"OPUIFS3VCZ7. w ݱࡏͷ.3* $3VCZ ͷॲཧܥ w 3VCZίʔυΛ࣮ߦ͢ΔͨΊͷԾϚγϯ 7.
w 3VCZͰ.3*ʹऔΓࠐ·Εͨ w ։ൃऀాߞҰࢯ YARVINTRODUCTION
ԾϚγϯͱʁ YARVINTRODUCTION
ιϑτΣΞ͕ಈ࡞͢Δߏ ϋʔυΣΞ 04 ιϑτΣΞ ίϯϐϡʔλʔͰɺ ιϑτΣΞࠨهͷ Α͏ͳϨΠϠʔߏͰ ಈ͘Έͱͳ͍ͬͯ Δ YARVINTRODUCTION
ιϑτΣΞ͕ಈ࡞͢Δߏ ϋʔυΣΞ 04 ιϑτΣΞ ιϑτΣΞ04ͷ"1*Λར༻ 04ͷΧʔωϧ͕ϋʔυΣΞΛ੍ޚ ιϑτΣΞ04ʹΑͬͯʮԾԽʯ͞ΕͨϋʔυΣΞࢿݯΛ׆༻͢Δɻ ͜ͷΑ͏ʹɺؒʹԾԽػߏΛڬΉ͜ͱͰΪϟοϓΛຒΊѻ͍͘͢ͳΔɻ YARVINTRODUCTION
ҰൠతʹʮԾϚγϯʯͱฉ͍ͯࢥ͍ු͔Ϳͷ ϋʔυΣΞ 04 ˞ 04 ͋Δ04ͷ্ʹԾԽ͞ΕͨϚγϯΛߏங ͠ɺผͷ04ͳͲΛಈ͔ͤΔͷ ͨͩɺ:"37ͷΑ͏ͳɺϓϩάϥϛϯάݴ ޠʹ͓͚ΔԾϚγϯΛߟ͑Δͱ͖ʹɺ ͜ͷԾϚγϯͷΠϝʔδʹଊΘΕ͗͢
ͳ͍ํ͕͍͍͔ ˞࣮ࡍʹ΄ͱΜͲΦϦδφϧͷ04εϧʔͯ͠ϋʔυ ΣΞΛૢ࡞Ͱ͖Δ͜ͱ͕ଟ͍ ԾϚγϯ 7JSUVBM#PYͳͲ ιϑτΣΞ YARVINTRODUCTION
ϓϩάϥϛϯάݴޠॲཧܥͱͯ͠ͷ ʮԾϚγϯʯ ϋʔυΣΞ 04 ϓϩάϥϛϯάݴޠ ϓϩάϥϛϯάݴޠԾϚγϯ ͕ղऍͰ͖Δ໋ྩʹม͞ΕɺԾ Ϛγϯ͕ͦͷ໋ྩΛ04ͳͲΑΓ ͍ʹ͑Δ ͖ͬ͞ͷιϑτΣΞ͕ಈ࡞͢Δ
ͨΊͷԾԽػߏͱߟ͑ํಉ͡ ԾϚγϯ YARVINTRODUCTION
7. 7. 7. ϓϩάϥϛϯάݴޠॲཧܥͱͯ͠ͷ ʮԾϚγϯʯ 04 ϓϩάϥϛϯάݴޠ 7. YARVINTRODUCTION 04
04 04 )8 )8 )8 )8 ͜ͷΑ͏ʹɺϓϩάϥϛϯάݴޠࣗମΛ ϚϧνڥʹରԠͰ͖ΔΑ͏ઃܭ͢Δͷ ඇৗʹ͍͕͠ɺԾϚγϯΛؒʹڬ Ή͜ͱͰରԠ࠷దԽ͕༰қʹͳΔ ݴޠԾϚγϯ͕ղऍͰ͖Δ໋ྩΛు͚Ε0, ԾϚγϯͷϚϧνڥରԠൺֱత༰қ
ԾϚγϯ͕ղऍ͢Δͷ όΠτίʔυ YARVINTRODUCTION ϓϩάϥϛϯάݴޠ όΠτίʔυ ԾϚγϯ͕ղऍ Ͱ͖Δ໋ྩྻ ίϯύΠϧ ԾϚγϯ ໋ྩ
ϓϩάϥϜ࣮ߦʜ
දతͳԾϚγϯ YARVINTRODUCTION +BWB+7. w ͓ͳ͡Έʮ8SJUF0ODF 3VO"OZXIFSFʯ w +BWBͪΖΜɺ4DBMBɺ$MPKVSFͳͲଟ͕͜ͷॲཧܥͰಈ࡞͢Δ /&5'SBNFXPSL w
.4͕ͩ044ͱͯ͠ެ։͞Ε͓ͯΓɺຊདྷϓϥοτϑΥʔϜΘͳ͍ w 7#/&5ɺ$ɺ'ͳͲͷݴޠ͕͜ͷॲཧܥͰಈ࡞͢Δ
දతͳԾϚγϯ YARVINTRODUCTION +BWB+7. w ͓ͳ͡Έʮ8SJUF0ODF 3VO"OZXIFSFʯ w +BWBͪΖΜɺ4DBMBɺ$MPKVSFͳͲଟ͕͜ͷॲཧܥͰಈ࡞͢Δ /&5'SBNFXPSL w
.4͕ͩ044ͱͯ͠ެ։͞Ε͓ͯΓɺຊདྷϓϥοτϑΥʔϜΘͳ͍ w 7#/&5ɺ$ɺ'ͳͲͷݴޠ͕͜ͷॲཧܥͰಈ࡞͢Δ --7.--7.*3ͱ͍͏தؒදݱΛར༻͢ ΔͳͲԾϚγϯʹ͍ۙͱ͜Ζ͋Δ͕ɺ ݫີʹίϯύΠϥج൫ͳͷͰ ͪΐͬͱδϟϯϧ͕ҧ͏
ԾϚγϯͷϝϦοτ·ͱΊ YARVINTRODUCTION w ϚϧνڥͷରԠ͕༰қʹͳΔ w ֤ڥͷ࠷దԽ͕͘͢͠ߴԽ͕ظͰ͖Δ w ผͷϓϩάϥϛϯάݴޠͷ։ൃ͍͢͠ ԾϚγϯͱ͍͏հΛ༻ҙ͠ɺϓϩάϥϛϯάݴޠΛ ԾϚγϯͷ໋ྩྻʹίϯύΠϧ͢ΔΈʹΑͬͯɺ
YARVINTRODUCTION YARV
0WFSWJFX YARVINTRODUCTION 04 3VCZίʔυ :"37 04 04 04 )8 )8
)8 )8 :"37 :"37 :"37 $ $ $ $ ᶃ3VCZίʔυ:"37໋ྩྻͷόΠτίʔυʹί ϯύΠϧ͞ΕΔ ᶄ֤ڥʹରԠͨ͠:"37͕ɺڞ௨ͷ:"37໋ྩ ྻΛղऍ͠$ϓϩάϥϜΛੜ࣮ͯ͠ߦ w.3*$ݴޠ࣮ͳͷͰɺ:"37Λհͯ͠$ͷ ϓϩάϥϜͱ࣮ͯ͠ߦ͞ΕΔ wωΠςΟϒίʔυʹม͞ΕΔ+7.ͳͲͱ ͜ͷͰҟͳΔ͕ɺԾԽͷߏతʹಉ͡
:"37໋ྩྻͱʁ YARVINTRODUCTION
def hello(name) "Hello " + name end puts hello("Tom") YARVINTRODUCTION
͜ͷ3VCZίʔυΛίϯύΠϧ͢Δͱʜʁ
YARVINTRODUCTION == disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>=============== 0000 trace 1 ( 1) 0002
putspecialobject 1 0004 putspecialobject 2 0006 putobject :hello 0008 putiseq hello 0010 opt_send_without_block <callinfo!mid:core#define_method, argc:3, ARGS_SIMPLE> 0012 pop 0013 trace 1 ( 5) 0015 putself 0016 putself 0017 putstring "Tom" 0019 opt_send_without_block <callinfo!mid:hello, argc:1, FCALL|ARGS_SIMPLE> 0021 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE> 0023 leave == disasm: <RubyVM::InstructionSequence:hello@<compiled>>=============== local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 2] name<Arg> 0000 trace 8 ( 1) 0002 trace 1 ( 2) 0004 putstring "Hello " 0006 getlocal_OP__WC__0 2 0008 opt_plus <callinfo!mid:+, argc:1, ARGS_SIMPLE> 0010 trace 16 ( 3) 0012 leave ( 2) ͜Μͳ:"37໋ྩྻʹͳΔ
== disasm: <RubyVM::InstructionSequence:<compiled>@<compiled>>=============== 0000 trace 1 ( 1) 0002 putspecialobject
1 0004 putspecialobject 2 0006 putobject :hello 0008 putiseq hello 0010 opt_send_without_block <callinfo!mid:core#define_method, argc:3, ARGS_SIMPLE> 0012 pop 0013 trace 1 ( 5) 0015 putself 0016 putself 0017 putstring "Tom" 0019 opt_send_without_block <callinfo!mid:hello, argc:1, FCALL|ARGS_SIMPLE> 0021 opt_send_without_block <callinfo!mid:puts, argc:1, FCALL|ARGS_SIMPLE> 0023 leave == disasm: <RubyVM::InstructionSequence:hello@<compiled>>=============== local table (size: 2, argc: 1 [opts: 0, rest: -1, post: 0, block: -1, kw: -1@-1, kwrest: -1]) [ 2] name<Arg> 0000 trace 8 ( 1) 0002 trace 1 ( 2) 0004 putstring "Hello " 0006 getlocal_OP__WC__0 2 0008 opt_plus <callinfo!mid:+, argc:1, ARGS_SIMPLE> 0010 trace 16 ( 3) 0012 leave ( 2) ʁ YARVINTRODUCTION
YARVINTRODUCTION puts 2 + 3 ࣈ۟ղੳ ߏจղੳ 5IF-POHBOE8JOEJOH3PBEUP:"37*OTUSVDUJPOT 3VCZίʔυ ίϯύΠϧ
:"37໋ྩྻ
YARVINTRODUCTION ࣈ۟ղੳ 3VCZίʔυΛจࣈͣͭಡΈࠐΈղੳ͢Δ 10.times do |n| puts n end
YARVINTRODUCTION ࣈ۟ղੳ 3VCZίʔυΛจࣈͣͭಡΈࠐΈղੳ͢Δ U J N F
T E P c O c 10.times do |n| puts n end
YARVINTRODUCTION ࣈ۟ղੳ 3VCZίʔυΛจࣈͣͭಡΈࠐΈղੳ͢Δ U J N F
T E P c O c 10.times do |n| puts n end U*/5&(&3 U*%&/5*'*&3 UJNFT LFZXPSE@EP c U*%&/5*'*&3 O c
YARVINTRODUCTION ࣈ۟ղੳ 3VCZίʔυΛจࣈͣͭಡΈࠐΈղੳ͢Δ U J N F
T E P c O c 10.times do |n| puts n end U*/5&(&3 U*%&/5*'*&3 UJNFT LFZXPSE@EP c U*%&/5*'*&3 O c τʔΫϯྻ
YARVINTRODUCTION puts 2 + 3 ࣈ۟ղੳ ߏจղੳ 5IF-POHBOE8JOEJOH3PBEUP:"37*OTUSVDUJPOT 3VCZίʔυ ίϯύΠϧ
:"37໋ྩྻ ίʔυΛτʔΫϯྻʹղ
YARVINTRODUCTION ߏจղੳ U*/5&(&3 U*%&/5*'*&3 UJNFT LFZXPSE@EP c U*%&/5*'*&3
O c method_call: ... | primary_value '.' operation2 | ... จ๏نଇʹϚον ύʔα͕จ๏نଇʹج͍ͮͯτʔΫϯྻͷղੳΛߦ͏
লུʜ YARVINTRODUCTION ߏจղੳ QSPHSBN NFUIPE BEECMPDL DBMM JOUFHFS 10 QFSJPE
JEFOUJpFS times EPCMPDL ߏจղੳʹΑͬͯ"45 நߏจ ͕ੜ͞ΕΔ
YARVINTRODUCTION ߏจղੳ 3JQQFSΛ͏ͱ࣮ࡍʹ"45Λ֬ೝͰ͖Δ require 'ripper' require 'pp' code = <<EOS
10.times do |n| puts n end EOS pp Ripper.sexp(code) [:program, [[:method_add_block, [:call, [:@int, "10", [1, 0]], :".", [:@ident, "times", [1, 3]]], [:do_block, [:block_var, [:params, [[:@ident, "n", [1, 13]]], nil, nil, nil, nil, nil, nil], false], [[:command, [:@ident, "puts", [2, 2]], [:args_add_block, [[:var_ref, [:@ident, "n", [2, 7]]]], false]]]]]]] 4ࣜʂ
YARVINTRODUCTION puts 2 + 3 ࣈ۟ղੳ ߏจղੳ 5IF-POHBOE8JOEJOH3PBEUP:"37*OTUSVDUJPOT 3VCZίʔυ ίϯύΠϧ
:"37໋ྩྻ ίʔυΛτʔΫϯྻʹղ τʔΫϯྻ͔Β"45Λੜ
YARVINTRODUCTION :"37໋ྩྻͷίϯύΠϧ ΑΓ୯७ͳ3VCZίʔυΛݩʹઆ໌ puts 2 + 3 3VCZίʔυ /0%&@4$01& /0%&@'$"--
̼FUIPE@JEputs /0%&@$"-- NFUIPE@JE+ /0%&@-*5 2 /0%&@-*5 3 Ϩγʔό Ҿ "45ϊʔυ
putself putobject 2 putobject 3 send <callinfo!mid:+, argc:1, … send
<callinfo!mid:puts, argc:1, ... YARVINTRODUCTION :"37໋ྩྻͷίϯύΠϧ "45ߏΛḷΓͳ͕Β :"37໋ྩྻελοΫʹϓογϡ͍ͯ͘͠ /0%&@'$"-- ̼FUIPE@JEputs /0%&@$"-- NFUIPE@JE+ :"37໋ྩྻ /0%&@-*5 2 /0%&@-*5 3
putself putobject 2 putobject 3 opt_plus opt_send_simple <callinfo!mid:puts, argc:1, ...
YARVINTRODUCTION :"37໋ྩྻͷίϯύΠϧ :"37໋ྩྻ࠷దԽ͞ΕΔ /0%&@'$"-- ̼FUIPE@JEputs /0%&@$"-- NFUIPE@JE+ :"37໋ྩྻ /0%&@-*5 2 /0%&@-*5 3 ߋʹ࠷దԽΛߦ͍ɺ ࠷దԽ໋ͨ͠ྩʹஔ͖͑Δ
YARVINTRODUCTION puts 2 + 3 ࣈ۟ղੳ ߏจղੳ 5IF-POHBOE8JOEJOH3PBEUP:"37*OTUSVDUJPOT 3VCZίʔυ ίϯύΠϧ
:"37໋ྩྻ ίʔυΛτʔΫϯྻʹղ τʔΫϯྻ͔Β"45Λੜ "45͔Β࠷దԽ͞Εͨ :"37໋ྩྻ όΠτίʔυ Λੜ
YARVINTRODUCTION :"37໋͕ྩʹै͍$ϓϩάϥϜΛ࣮ߦ ͜ͷΑ͏ʹͯ͠3VCZϓϩάϥϜ࣮ߦ͞ΕΔ $ cat example.rb puts 2 + 3
$ ruby example.rb 5 ࣈ۟ղੳɺ ߏจղੳɺ :"37໋ྩྻͷίϯύΠϧɺ $ϓϩάϥϜͷ࣮ߦ
YARVINTRODUCTION ·ͱΊ 3VCZͷ͘͠ΈΛΔͱ 3VCZ,BJHJΛͬͱָ͠ΊΔʂ
YARVINTRODUCTION ࢀߟ ˒ :"37.BOJBDT w IUUQNBHB[JOFSVCZJTUOFU :BSW.BOJBDT ˒ 3VCZͷ͘͠Έ3VCZ6OEFSB.JDSPTDPQF w
IUUQTFTUPSFPINTIBDPKQUJUMFT1 ҎԼͷهࣄॻ੶Λࢥ͍͖ͬΓࢀߟʹ͠·ͨ͠
よちよち.rb 回オメデトウ