PHPカンファレンス福岡での発表資料です。
1)1ΧϯϑΝϨϯεԬ1)1ͰֶͿԾϚγϯܕਖ਼نදݱΤϯδϯͷΈ
View Slide
ࣗݾհ‣ ٱอాޫଇ !BOBUPP‣ 6*69σβΠφʔɺ ιϑτΣΞΤϯδχΞ‣ "TQFDUJWF--$ද‣ IUUQBTQFDUJWFJP
ࠓ͢͜ͱ‣ ԾϚγϯܕਖ਼نදݱΤϯδϯͷΈ
ॱʹ͍ͯ͘͜͠ͱ‣ ਖ਼نදݱΤϯδϯͷ࣮ํ๏‣ ԾϚγϯܕਖ਼نදݱΤϯδϯͱ‣ ϚονϯάॲཧͷྲྀΕ‣ 7.ͷ࣋ͭϨδελͱεϨουͱ໋ྩ‣ ਖ਼نදݱͲͷΑ͏ʹίϯύΠϧ͞ΕΔ͔
ࠓͷΛฉ͘ͱͲ͏ͳΔ͔‣ ਖ਼نදݱΤϯδϯͷΈͬͯ͜Μͳʹ୯७ͳͷ͔ ͬͯͼͬ͘Γ͠·͢ ࢲͼͬ͘Γ͠·ͨ͠‣ ਖ਼نදݱΤϯδϯ ͷ7.͕ॻ͚ΔΑ͏ʹͳΓ·͢
ਖ਼نදݱΤϯδϯͷ࣮ํ๏
‣ ͦͦਖ਼نදݱΤϯδϯͷ ࣮ํ๏ʹͳʹ͕͋Δ
ͭʹେผ‣ %'"ϕʔεͷ࣮ํ๏‣ ԾϚγϯ 7.ϕʔεͷ࣮ํ๏
ԾϚγϯϕʔεͷ ਖ਼نදݱΤϯδϯͱ
ԾϚγϯϕʔεͷ࣮VM‣ ਖ਼نදݱ༻ͷ໋ྩΛ࣋ͭ7. ԾϚγϯΛߏங‣ ਖ਼نදݱΛ7.͚ͷ໋ྩʹίϯύΠϧ࣮ͯ͠ߦ‣ 1$3&ͷ࣮͜Ε
ϚονϯάॲཧͷྲྀΕ ਖ਼نදݱΛύʔε ԾϚγϯ༻ͷ໋ྩྻʹม ԾϚγϯͰ࣮ߦ/(hoge|fuga)/ match “hoge”?
ਖ਼نදݱΛύʔε‣ ਖ਼نදݱͷจࣈྻΛड͚औͬͯϝλจࣈΛύʔε/hoge?|fuga(piyo)*//hoge?|fuga(piyo)*/
7.༻ͷ໋ྩྻʹมchar ‘h’char ‘o’char ‘g’char ‘e’split 1, 6jmp 11a(piyo)*/
ԾϚγϯͰ࣮ߦVMchar ‘h’char ‘o’char ‘g’char ‘e’split 1, 6jmp 11্͔Β໋ྩղऍ͍ͯ͘͠‣ ݁Ռ༩͑ΒΕͨจࣈྻ͕Ϛον͢Δ͔Λఆ
ͦͦԾϚγϯ 7.ͬͯͳʹ
ීஈΑ͘ݟ͔͚Δ7.‣ ࣮ࡍͷίϯϐϡʔλΛԾԽͨ͠ͷ‣ ࠓճͷͱ͋·Γؔ͋Γ·ͤΜ
ࠓճͷͷ7.‣ ಛఆͷతͷͨΊʹઃܭ͞ΕͨԾతͳϚγϯ‣ ྫ+7. ;FOE&OHJOF :"37VM
7.ͷجຊߏγϯϓϧϨδελ͕छྨεϨου໋ྩ͕छྨ
ϨδελPC SPจࣈྻͷݱࡏҐஔ4USJOH1PJOUFS໋ྩͷҐஔ1SPHSBN$PVOUFS‣ 7.ʹͦͳΘΔมηοτ‣ ࠷ॳͲͪΒʹ͕ೖ͍ͬͯΔ
1$ʹ͕ೖ͍ͬͯͨΒ‣ ൪ͷ໋ྩΛࠓݟ͍ͯΔͱ͍͏͜ͱ‣ ໋ྩΛಡΈ͜Ή͝ͱʹΠϯΫϦϝϯτ͢ΔPC=3char ‘h’char ‘o’char ‘g’char ‘e’split 1, 6jmp 11
41ʹ͕ೖ͍ͬͯͨΒ‣ ࢼߦ͢Δจࣈྻͷ൪ͷจࣈΛࠓݟ͍ͯΔͱ͍͏͜ͱSP=2 “hogehoge”
εϨου‣ εϨουϨδελ 1$ͱ41Λ࣋ͭ‣ ࣮ߦ࣌ͷίϯςΩετΈ͍ͨͳͷ‣ ฒྻॲཧͱؔͳ͍ThreadPC SP
7.ͷ࠷ॳͷঢ়ଶ‣ 7.࠷ॳҰ͚ͭͩεϨουΛ࣋ͬͯ࢝·Δ‣ ໋ྩΛղऍ͢Δ͏ͪʹ૿ݮ͢ΔThreadVMݱࡏͷεϨου
7.ͱεϨου‣ 7.εϨουΛελοΫ͢Δ‣ 7.Ұ൪্ͷεϨουͷϨδελΛૢ࡞͢ΔThreadThreadThreadVMݱࡏͷεϨου
7.ʹඋΘΔͭͷ໋ྩ‣ KNQ໋ྩࢦఆ͢ΔҐஔδϟϯϓ‣ DIBS໋ྩจࣈͷϚονΛࢼߦ͢Δ‣ NBUDI໋ྩ7.ΛࢭΊͯϚονྃ͢Δ‣ TQMJU໋ྩεϨουΛׂ͢Δ
KNQ໋ྩ‣ KNQYYͷҐஔʹ1$Λઃఆ͢Δ‣ ཁ͢ΔʹHPUPjmp x
ਤPC=0SP=0PC=5SP=0jmp 5‣ 1$Ϩδελ͕ॻ͖Θ͍ͬͯΔ
DIBS໋ྩ‣ ݱࡏҐஔ 41͔ΒYͱ͍͏จࣈΛফඅ͢Δ‣ Ϛονͨ͠Β41͕̍ͭ૿͑Δ‣ Ϛον͠ͳ͔ͬͨΒݱࡏͷεϨουফ͑Δchar x
ਤ‣ ࢼߦ͍ͯ͠Δจࣈྻ͕zBBzͷͱ͖‣ DIBS໋ྩΛ࣮ߦ͢Δͱ41 ൪ͷจࣈͱൺֱͯ͠ Ϛον͢ΔͷͰ41ͱ1$͕૿͑ΔPC=0SP=0PC=1SP=1char ‘a’
ਤ‣ ࢼߦ͍ͯ͠Δจࣈྻ͕zCCzͷͱ͖‣ DIBS໋ྩΛ࣮ߦ͢Δͱ41 ൪ͷจࣈͱൺֱͯ͠ Ϛον͠ͳ͍ͷͰݱࡏͷεϨου͕ফ͑ΔPC=0SP=0char ‘a’
εϨου͕ফ͑ΔͱͲ͏ͳΔ‣ ελοΫͷҰ൪্ͷεϨου͕ݱࡏͷ εϨουʹͳ໋ͬͯྩͷॲཧ͕࢝·Δ‣ ελοΫ͕ۭʹͳͬͨΒ7.ఀࢭϚονࣦഊThreadThreadVM
NBUDI໋ྩ‣ ਖ਼نදݱͷϚον͕ྃͨ͠ͱͯ͠ 7.ͷ࣮ߦΛࢭΊΔϚονޭmatch
TQMJU໋ྩ‣ ݱࡏͷεϨουΛׂͯ͠ɺ ͦΕͧΕͷεϨουͷ1$ʹYͱZΛೖ͢Δ‣ ͪΐͬͱΘ͔ΓͮΒ͍͚ͲҰେࣄͳ໋ྩsplit x, y
ਤPC=0SP=2PC=1SP=2split 1,5PC=5SP=2‣ ෳ͕ऴΘͬͨΒ্ͷεϨου͕ݱࡏͷεϨουʹͳΔ
‣ Ҏ্͜Ε͚ͩɻ‣ ਖ਼نදݱͷେ͜ΕͰදݱՄೳ
ਖ਼نදݱͲ͏ ίϯύΠϧ͞ΕΔ͔
‣ ͲΜͳ෩ʹίϯύΠϧ͞ΕΔ͔հ‣ ࠓ͔Βਖ਼نදݱͷਓؒ7.ʹͳͬͯ ҰݸҰݸ໋ྩΛղऍ͍͖ͯ͠·͠ΐ͏
B0 char ‘a’1 match‣ ؆୯
BCD0 char ‘a’1 char ‘b’2 char ‘c’3 match‣ ͜Ε؆୯
" #࿈݁‣ ໋ྩྻΛ୯७ʹܨ͛ΒΕΔ‣ ࠷ޙʹNBUDI໋ྩΛஔ͘match"ͷ໋ྩྻ#ͷ໋ྩྻ
B Φϓγϣϯ0 split 1,21 char ‘a’2 match‣ DIBSbB`ͷͱ͜Ζʹଞͷਖ਼نදݱͷ໋ྩྻ͕ೖΕΒΕΔ‣ TQMJU໋ྩ͕؊ɻҰݸҰݸ͍ͬͯ͜͏
͋͞ਓؒ7.ʹͳΖ͏Thread PC SP ExecutionT1 0 split 1,2 aaa T2(PC=2)࡞T1 1 char ‘a’ aaa Ϛον͢ΔͷͰSPΛ૿͢T1 2 match aaa Ϛονྃ‣ จࣈྻ͕zBBBzͩͬͨ߹5ͰϚονྃ
จࣈྻ͕zCCCzͩͬͨΒThread PC SP ExecutionT1 0 split 1,2 bbb T2(PC=2)࡞T1 1 char ‘a’ bbb จࣈϚονࣦഊ: T1ফ͑ΔT2 2 match bbb Ϛονྃ‣ 5ͰจࣈϚονࣦഊ͢Δ͕5ͰNBUDI͕࣮ߦ͞ΕΔ‣ ݁ՌϚονޭ
BcCબ0 split 1,31 char ‘a’2 jmp 43 char ‘b’4 match‣ DIBSbB` DIBSbC`ͷͱ͜Ζʹҙͷਖ਼نදݱͷ໋ྩྻ͕ೖΕΒΕΔ
BݸҎ্܁Γฦ͠0 char ‘a’1 split 0, 22 match‣ ܁Γฦ͠ͷϚονʹTQMJU໋ྩ͕׆༂‣ DIBSbB`ͷͱ͜Ζʹҙͷ໋ྩྻΛೖΕΒΕΔ
BݸҎ্܁Γฦ͠0 split 1,31 char ‘a’2 jmp 03 match‣ DIBSbB`ͷͱ͜Ζʹʜ ҎԼུ
B ඇᩦཉͳݸҎ্܁Γฦ͠0 split 3,11 char ‘a’2 jmp 03 match‣ TQMJUͷҾ͕ٯʹͳͬͯΔ
1)1Ͱ࣮ͯ͠ΈͨΒ‣ 7.͚ͩͩͱߦ͙Β͍Ͱ࣮Ͱ͖ͨ‣ IUUQCMPHBTJBMDPKQʹίʔυΛܝࡌ‣ ؆୯ͳͷͰΈ͕Θ͔Ε୭Ͱॻ͚Δʂ
·ͱΊ
·ͱΊ‣ ਖ਼نදݱΤϯδϯͷ࣮๏%'"͏Γํͱ 7.͏Γํͷೋछྨʹେผ‣ 7.ܕਖ਼نදݱΤϯδϯͷجຊࢸͬͯγϯϓϧ‣ ໋ྩͭɺεϨουɺϨδελ͚ͭͩ‣ γϯϓϧ͚ͩͲਖ਼نදݱΛ΄ͱΜͲදݱͰ͖Δ‣ ࣮͕؆୯ͳͷͰॻ͍ͯΈΑ͏
ࠓճͷͷݩωλ‣ 3FHVMBS&YQSFTTJPO.BUDIJOHUIF7JSUVBM.BDIJOF"QQSPBDIͱ͍͏จॻ‣ IUUQTXUDIDPNdSTDSFHFYQSFHFYQIUNM‣ 7.ܕਖ਼نදݱΤϯδϯͷΈͱ ࣮ʹ͍ͭͯղઆ͞Ε͍ͯΔ‣ ฏқͰΘ͔Γ͍͢ʂ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠!BOBUPPCMPHBOBUPPKQ