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

RubyVM を PHP で実装する 〜Hello World を出力するまで〜

memory
PRO
October 08, 2023

RubyVM を PHP で実装する 〜Hello World を出力するまで〜

PHP Conference 2023
English Title: How to implement RubyVM written in PHP - Until to output Hello World -

memory
PRO

October 08, 2023
Tweet

More Decks by memory

Other Decks in Programming

Transcript

  1. Ί΋Γʔ
    RubyVM Λ PHP Ͱ࣮૷͢Δ

    ʙHello World Λग़ྗ͢Δ·Ͱʙ
    PHP ΧϯϑΝϨϯε 2023

    View Slide

  2. Ί΋Γʔ
    m3m0r7
    ෳ਺ͷελʔτΞοϓ΍্৔اۀͰΤϯδ
    χΞɼEMɼTLɼࣥߦ໾һ CTO ͷܦݧΛܦ
    ΔɻRuby on Rails ΍ Go Λ࢖༻͍ͯ͠Δ
    גࣜձࣾΤϯϖΠ΁ 2023 ೥ 7 ݄ʹΤϯδ
    χΞͱͯ͠δϣΠϯɻ2023 ೥ 10 ݄͔Β
    EM ͱͯ͠ಇ͍͍ͯ·͢ɻ

    memory1994
    m3m0r7

    View Slide


  3. View Slide


  4. աڈʹ JVM (Java Virtual Machine) Λ PHP Ͱ࣮૷ͨ͠಺༰Ͱొஃ͓ͯ͠Γ·͢
    ※ݱࡏࢲ͸ BASE גࣜձࣾΛୀ৬͓ͯ͠Γɼ

    ࢿྉ͸౰࣌ͷ΋ͷΛҾ༻͓ͯ͠Γ·͢ɻ
    ※ݱࡏࢲ͸ גࣜձࣾ GameWith Λୀ৬͓ͯ͠Γɼ

    ࢿྉ͸౰࣌ͷ΋ͷΛҾ༻͓ͯ͠Γ·͢ɻ

    View Slide


  5. ࢲࣗ਎ɼPHP Λච಄ʹ Go ΍ TypeScript ͳͲ
    ༷ʑͳݴޠΛֶश͖ͯ͠·ͨ͠

    View Slide


  6. ࣍ୈʹ৽͍͠ݴޠΛ "ී௨ʹ" ֶͿʹ͸

    ܹ͕ࢗ଍Γͳ͘ͳ͖ͬͯ·ͨ͠

    View Slide


  7. Ruby ΋ྫ֎Ͱ͸͋Γ·ͤΜ

    View Slide


  8. ֶशํ๏΋͋Δఔ౓ࣗ෼ͷதͰཱ֬Ͱ͖͍ͯΔ
    ͷͰϞνϕʔγϣϯ΋ͳ͔ͳ্͔͕Γ·ͤΜ

    View Slide


  9. Ϟνϕʔγϣϯ্͕͕Βͳ͍ͷͰͦͷݴޠͷ

    ؾ࣋ͪΛཧղ͢ΔͳΜͯ΋ͬͯͷ΄͔Ͱ͢

    View Slide


  10. ͦ͜Ͱߟ͑·ͨ͠

    View Slide


  11. Ͳ͏΍ͬͨΒܹࢗυϦϒϯʹݴޠΛֶ΂Δͷ͔

    View Slide


  12. Ͳ͏΍ͬͨΒؾ࣋ͪΛཧղͰ͖Δͷ͔

    View Slide


  13. ʮͦ͏ͩ VM Λ࡞Ζ͏ʯ
    ʮVM Λ࡞Ε͹ؾ࣋ͪΛཧղͰ͖Δ͸ͣʯ

    View Slide


  14. ࢲͷఱ࢖͕ͦ͏͞͞΍͘ͷͰ͢

    View Slide


  15. ΋͏ී௨ʹ͸໭Ε·ͤΜ

    View Slide

  16. VM (Virtual Machine) ʹ͍ͭͯ
    RubyVM ͷ͘͠Έ
    RubyVM ͷ࡞Γํ
    DEMO (͕࣌ؒ͋Ε͹)

    ΞδΣϯμ
    Appendix

    View Slide

  17. ࿩͞ͳ͍͜ͱ

    View Slide

  18. Ruby ͷ Lexer (ࣈ۟ղੳث)
    Ruby ͷ Parser (ߏจղੳث)
    Ruby ͷॻ͖ํ

    ࿩͞ͳ͍͜ͱ

    View Slide

  19. VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  20. VM ͱ͸ʁ

    View Slide

  21. VM ͱ͸ʁ
    - VM ͱ͸Ծ૝Ϛγϯͷ͜ͱΛࢦ͠ɼίϯϐϡʔλʔͷಈ࡞ΛΤϛϡϨʔγϣϯ
    ʢ࠶ݱʣͤ͞Δ΋ͷͰ͢ɻ
    - VM ্Ͱ Linux/Unix Λಈ͔ͨ͠Γ͍ͯ͠Δํ΋͍Δͱࢥ͍·͢ɻ
    - VM ΛՄೳͱ͢Δ୅දతͳ΋ͷ͸ KVM (Kernel-based Virtual Machine) ͩͬ
    ͨΓɼHyper-V (Windows) ͩͬͨΓɼVirtualBox ͳͲ͕ྫʹ্͕ΔͰ͠ΐ
    ͏ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  22. VM ͱ͸ʁ
    - Type-1, Type-2 ͱ͍͏෼ྨ͕͋ΓɼType-1 ͸ϕΞϝλϧʢϋʔυ΢ΣΞʹμ
    ΠϨΫτͳ΋ͷʣɼType-2 ͸ϗετܕʢطଘͷ OS ্Ͱಈ͘΋ͷʣͰ͢ɻ͜
    ΕΒΛ૯ͯ͡ Hyper VisorʢϋΠύʔόΠβʔʣͱݺͿ͜ͱ͕͋Γ·͢ɻ
    - Docker ΋Ծ૝Ϛγϯʹࣅ͍ͯ·͕͢ɼݫີʹ͸ҟͳΓ·͢ɻVM ͸׬શʹ෼
    ཭͞Εͨήετ OS ͷΧʔωϧΛ͍࣋ͬͯΔͷʹରͯ͠ɼDocker ͸ϗετ
    OS ͷΧʔωϧΛڞ༗͍ͯ͠·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  23. VM ͱ͸ʁ
    - ͱ͍͏͜ͱΛॻ͖·͕ͨ͠ɼZend VMɼJVMɼ RubyVM ͸ VM Ͱ͸͋Δ΋ͷ
    ͷɼ͜ͷఆٛʹ͸ݫີʹ͸౰ͯ͸·Γ·ͤΜɻ
    - ͔͠͠ɼઌ΄Ͳॻ͍ͨʮVM ͱ͸Ծ૝Ϛγϯͷ͜ͱΛࢦ͠ɼίϯϐϡʔλʔͷ
    ಈ࡞ΛΤϛϡϨʔγϣϯʢ࠶ݱʣͤ͞Δ΋ͷͰ͢ɻʯͱ͸ಉ౳Ͱ͋ΔͱղऍͰ
    ͖·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  24. VM ͱ͸ʁ
    - CPU ͸໋ྩηοτʹैͬͯಈ࡞͠·͢ɻ͜ͷ໋ྩηοτ͸਎ۙͳ΋ͷͰݴ͑
    ͹ Intel ΍ ARM ͳͲʹ΋͋ΓɼͦΕͧΕҟͳΓ·͢ɻ
    - ͜ͷ CPU ͷ໋ྩηοτΛஞ࣮࣍ߦͤ͞Δ͜ͱ͕ίϯϐϡʔλʔ͕ಈ͘ݪཧͷ
    ҰͭͰ͕͢ɼZend VM ΍ JVMɼRubyVM ʹ΋໋ྩηοτ͕͋Γɼ·ΔͰίϯ
    ϐϡʔλʔ͕ಈ͘ݪཧʹଇ࣮ͬͯߦ͞Ε͍ͯ·͢ɻ
    - ͦͷͨΊɼΤϛϡϨʔγϣϯͱ͍͏จ຺Ͱ͸ VM Ͱ͋ΔͱղऍͰ͖ΔͷͰ͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  25. VM ͱ͸ʁ
    - ͦͯ͠ɼ͜ΕΒͷ VM ͷ΄ͱΜͲ͸ελοΫϚγϯͱͯ͠ಈ࡞͠·͢ɻ
    - ଞʹҰൠతͳ΋ͷ͸ϝϞϦϨδελϚγϯͳͲ͕͋Γ·͢ɻ͜Ε͸ Intel ΍
    ARM ͳͲ͕֘౰͠·͢ɻ
    - ຊτʔΫͰ͸ɼϝϞϦϨδελϚγϯʹ͍ͭͯͷղઆ͸ׂѪ͠·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  26. ελοΫϚγϯͬͯͳʹʁ

    View Slide

  27. ελοΫϚγϯͬͯͳʹʁ
    - ελοΫϚγϯͱ͸ɼσʔλߏ଄ͷҰͭͰσʔλ
    Λ௥Ճʢϓογϡʣ͠ͳ͕Βɼ໋ྩηοτʹΑͬ
    ͯͦͷ௥Ճͨ͠σʔλΛऔಘʢϙοϓʣͯ͠ɼԿ
    ͔͠ΒͷܭࢉΛߦ͍ͬͯ͘ίϯϐϡʔλͷΞʔΩ
    ςΫνϟͰ͢ɻ
    - ྫ͑͹ʮελοΫ͔Β 2 ͭ஋Λϙοϓ͠Ճࢉͤ͞
    ͨ΋ͷΛϓογϡ͢Δʯͱ໋͍ͬͨྩηοτ΋͋
    Γ·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ
    1 ճ໨ʹϓογϡ͞Εͨσʔλ
    2 ճ໨ʹϓογϡ͞Εͨσʔλ
    N ճ໨ʹϓογϡ͞Εͨσʔλ

    σʔλΛϓογϡ σʔλΛϙοϓ
    Կ͔͠Βͷ໋ྩηοτͰ
    σʔλΛ࢖༻
    Կ͔͠Βͷ໋ྩηοτͰ
    σʔλΛελοΫʹ௥Ճ

    View Slide

  28. ໋ྩηοτͬͯͳʹʁ

    View Slide

  29. ໋ྩηοτͬͯͳʹʁ
    - ໋ྩηοτͱ͸ίϯϐϡʔλʹԿ͔͠Βͷಈ࡞Λࢦࣔ͢ΔͨΊͷίϚϯυʢ໋
    ྩʣͷू߹ͷ͜ͱΛࢦ͠·͢ɻ
    - ྫ͑͹ɼΘ͔Γ΍໋͍͢ྩʹ͸ʮՃࢉʯʮݮࢉʯʮ৐ࢉʯʮআࢉʯͷΑ͏ͳ࢛
    ଇԋࢉ΍ʮಛఆͷϧʔνϯΛ࣮ߦ͢ΔʯͰ͋ͬͨΓʮ഑ྻΛ࡞੒ʯ͢Δͱ͔ʮจ
    ࣈྻΛ਺ࣈʹม׵͢Δʯͱ͔༷ʑͳ΋ͷ͕͋Γ·͢ɻ
    - ΋ͪΖΜɼVM ʹΑ໋ͬͯྩηοτ͸ҟͳΓ·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  30. ໋ྩηοτͬͯͳʹʁ
    - ͨͩݴ͑Δͷ͸ɼࣅͨΑ͏ͳ໋ྩηοτ͕େମͲͷ VM ʹ΋ଘࡏ͍ͯ͠·͢ɻ
    - ໋ྩηοτ͸ͲΕ΋୯७ԽΛ໨ࢦ͍ͯ͠Δ܏޲͕ଟ͍΋ͷ͕ଟ͍Ͱ͢ɻ୯७Խ
    Λ໨ࢦ͢ઃܭࢥ૝ͷ͜ͱΛ RISC ʢReduced Instruction Set Computerʣͱ
    ݴ͍·͢ɻٯʹ CISC (Complex Instruction Set Computer) ͱ͍͏ෳࡶͰ͸
    ͋Δ໋͕ྩ਺ΛۃྗݮΒͨ͠λΠϓͷ΋ͷ΋͋Γ·͢ɻ
    - ࠷ۙͰ͸͋Μ·Γࠩҟ͕ͳ͍ͱ΋ݴΘΕ͍ͯ·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  31. ໋ྩηοτͬͯͳʹʁ
    - ·໋ͨྩ͸Ҿ਺ʢΦϖϥϯυʣΛऔΔ΋ͷ͕͋Γ·͢ɻ͜ͷΦϖϥϯυͱε
    λοΫΛۦ࢖໋ͯ͠ྩΛ࣮ߦ͍͖ͯ͠·͢ɻ
    - ·ͨɼίϚϯυΛ൪߸Ͱදͨ͠΋ͷΛʮΦϖϨʔγϣϯίʔυʢΦϖίʔυɼ
    OP CodeʣʯɼώϡʔϚϯϦʔμϒϧʹͨ͠΋ͷΛʮχʔϞχοΫ
    ʢmnemonicʣʯͱݴͬͨΓ͠·͢ɻ
    - ࣍ͷϖʔδ͔Β 1 + 2 + 3 ΛελοΫϚγϯͱٖͯ͠ࣅ໋ྩηοτΛ༻͍ͯܭ
    ࢉ͢ΔྫΛࣔ͠·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  32. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    View Slide

  33. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    - constadd ໋ྩ͸ 1 ͭͷΦϖϥϯυΛऔΓɼͦΕΛελοΫ
    ʹϓογϡ͢Δ໋ྩ
    - plus ͸ελοΫ͔Β 2 ͭ஋Λϙοϓ͠ɼͦΕΛՃࢉͨ͠΋ͷ
    ΛελοΫʹϓογϡ͢Δ໋ྩ
    - output ͸ελοΫ͔ΒҰͭϙοϓ͠ग़ྗ͢Δ໋ྩ
    - ্هͷ 3 ͭͷ໋ྩͰ࣮ݱՄೳͰ͢ɻ͜ͷҰ࿈ͷྲྀΕΛ໋ྩ
    γʔέϯεͱݴͬͨΓ͠·͢ɻ

    View Slide

  34. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    1
    ελοΫʹ 1 Λϓογϡ

    View Slide

  35. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    1
    ελοΫʹ 2 Λϓογϡ
    2

    View Slide

  36. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    1
    2 ͭͷσʔλΛϙοϓ
    2
    3
    Ճࢉͨ݁͠ՌΛϓογϡ

    View Slide

  37. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    3
    ελοΫʹ 3 Λϓογϡ
    3

    View Slide

  38. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    3
    2 ͭͷσʔλΛϙοϓ
    3
    6
    Ճࢉͨ݁͠ՌΛϓογϡ

    View Slide

  39. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ

    VM (Virtual Machine) ʹ͍ͭͯ
    constadd (operand: 1)
    constadd (operand: 2)
    constadd (operand: 3)
    plus
    plus
    output
    ελοΫ
    6
    1 ͭͷσʔλΛϙοϓ

    View Slide

  40. 1 + 2 + 3 Λٙࣅ໋ྩηοτͰܭࢉ͢Δ
    - ֓Ͷ΄ͱΜͲͷ VM ͸ઌఔͷղઆͷΑ͏ͳܗͰ࣮૷͞Ε͍ͯ·͢ɻ͜ΕΒΛԠ
    ༻ͨ͠΋ͷ͕ Zend VM ͩͬͨΓɼJVM ͩͬͨΓɼͦͯ͠ຊτʔΫͷझࢫͰ͋
    Δ RubyVM Ͱ͢ɻ
    - Ͱ͸ RubyVM ͸ͲͷΑ͏ʹ࣮૷͢ΔͷͰ͠ΐ͏͔ɻ࣍ͷηΫγϣϯͰղઆ͠
    ͍͖ͯ·͢ɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  41. ༨ஊ
    - ઌ΄Ͳͷ໋ྩγʔέϯεΛ࠷దԽ͢Δͱ࣮͸ʮconstadd (operand: 6)ʯͱ
    ʮoutputʯ͚ͩͰࡁΈ·͢ɻ໋ྩ࠷దԽΛߦ͏͜ͱͰܭࢉ͢΂͖εςοϓΛল
    ུͰ͖ΔͷͰɼߴ଎Խ͕ݟࠐ·Ε·͢ɻ
    - ͜͏͍ͬͨߴ଎ԽΛߦ͏ͷ͕ʮJIT/AOT ࠷దԽʯͱݴΘΕͨΓ͠·͢ɻ
    - JIT ʢJust In TimeʣίϯύΠϧํࣜͱ AOT ʢAhead Of TimeʣίϯύΠϧํ
    ͕ࣜ͋Γ·͕͢ɼຊτʔΫͰ͸ׂѪ͠·͢ɻChatGPT ʹฉ͍ͯΈͯͶɻ

    VM (Virtual Machine) ʹ͍ͭͯ

    View Slide

  42. VM Λ࡞Δͷʹඞཁͳ΋ͷ

    View Slide

  43. ΍Δؾ
    ࠜؾ
    ෛ͚ͳ͍ؾ

    1
    2
    3
    VM Λ࡞Δͷʹඞཁͳ΋ͷ

    View Slide

  44. RubyVM ͷ͘͠Έ

    View Slide

  45. RubyVM ͱ͸ʁ

    View Slide

  46. RubyVM ͱ͸
    - RubyVM ͸ YARV (Yet Another Ruby Vm) ͱ΋ݺ͹Ε Sasada Koichi
    (@koichisasada) ͞Μ͕ Ruby ޲͚ͷԾ૝Ϛγϯͱ࣮ͯ͠૷͖ͯͨ͠΋ͷͰ͢
    [1]ɻ
    - YARV ͸୺తʹݴ͑͹ɼISeqʢInstruction Sequenceʣͱݺ͹ΕΔ໋ྩγʔέ
    ϯεʢ࣮ߦ͢΂໋͖ྩͷҰཡʣͱɼͦͷ໋ྩγʔέϯεʹର͢Δϝλ৘ใͷू
    ߹Ͱ͢ɻ

    RubyVM ͷ͘͠Έ
    [1]: https://sitaramshelke.medium.com/inside-rubyvm-967b25e234db

    View Slide

  47. RubyVM ͱ͸
    - Լਤ͸ Hello World! Λग़ྗ͢ΔͨΊͷ YARV Ͱ͢ɻ

    RubyVM ͷ͘͠Έ

    View Slide

  48. RubyVM ͱ͸
    - Լਤ͸ Hello World! Λग़ྗ͢ΔͨΊͷ YARV Ͱ͢ɻ

    RubyVM ͷ͘͠Έ
    Hello World! ͱ͍͏จࣈྻ͕ݟ͑·͢Ͷ

    View Slide


  49. The header section (36 bytes)
    The payload section
    The instruction sequence offsets section (The information is each of instruction sequence offsets; N>0 * 4 bytes)
    The global object offsets section (The information is each of global object offsets; N>0 * 4 bytes)
    The extra data (if embedded extra data; N>=0 bytes)
    A part of instruction sequences
    A part of global objects
    The RUBY_PLATFORM name section (string)
    An information of string / class /
    fi
    xed number / bool types and data
    An information of instruction sequence section (In normally, 44 info * 4 bytes = 176 bytes notice: no considered hamming weight)

    A code section (N>0 bytes)

    A local table section (N>=0 bytes)
    A call info entry section (N>=0 bytes)

    The structure of YARV
    The alignment section (Filled by 0xff to align every 2 bytes)
    ※ Ruby ຊମͷ C ࣮૷ΛಡΜͰࢲ͕ղऍͨ͠΋ͷΛςΩετɾਤʹදͨ͠΋ͷͰ͢ɻ

    View Slide

  50. RubyVM ͱ͸
    - Ruby Ͱ Hello World! Λग़ྗ͢Δʹ͸࣮͸ࠨਤͷ
    ίʔυͰॆ଍͠·͢ɻ͔͠͠ɼYARV ʹͳΔͱ࿩
    ͕มΘΓ·͢ɻ
    - RubyVM ʹݶΒͣ VM Λ࣮૷͠ɼHello World Λ
    ग़ྗ͢Δ·Ͱَ͕໳Ͱ͢ɻ໋ྩηοτΛ࣮૷͢Δ
    ͷ͸ͦ͜·Ͱۤ࿑͠·ͤΜ͕ɼ໋ྩηοτΛΤ
    ϛϡϨʔτ͢Δ VM ͦͷ΋ͷΛ࣮૷͢Δͷʹۤ࿑
    ͠·͢ɻͦΕָ͕ܹࢗ͘͠తͳͷͰ͢ɻ

    RubyVM ͷ͘͠Έ

    View Slide


  51. Hello World ͕ग़ྗͰ͖ͨͱ͖͸ɼͦΕ͸΋͏

    View Slide


  52. ຐԦ৓ʹ౸ୡͨ͠Α͏ͳؾ࣋ͪʹͳΓ·͢

    View Slide

  53. RubyVM ͷ࡞Γํ

    View Slide


  54. View Slide


  55. ChatGPT Ͱ͸ղઆͰ͖ͳ͍͜ͱΛղઆ͠·͢

    View Slide


  56. ※ PHP Ҏ֎Ͱ΋࣮૷Ͱ͖·͢

    View Slide

  57. ͦ΋ͦ΋Ͳ͏΍࣮ͬͯ૷͢Δͷʁ

    View Slide

  58. ͦ΋ͦ΋Ͳ͏΍࣮ͬͯ૷͢Δͷʁ
    - JVM ʹ͸ Java Virtual Machine Speci
    fi
    cation[1] ͱݺ͹ΕΔυΩϡϝϯτ͕
    ॆ࣮͍ͯ͠·͢ɻ
    - Java ͸اۀओମͰ͕͢ɼRubyVM ͷ৔߹ίϛϡχςΟʹΑͬͯ։ൃ͞Ε͍ͯ
    Δ͜ͱ΋͋Γ༗ࢤͨͪʹΑͬͯυΩϡϝϯτͷ੔උ͕ͳ͞Ε͍ͯ·͕͢ VM ͷ
    ࣮૷ํ๏ʹݶͬͯݴ͑͹اۀओମͱൺֱ͢ΔͱͲ͏ͯ͠΋ݶք͕͋Γ·͢ɻ
    - ͦΜͳதɼRubyVM Λ࡞Δʹ͸Ͳ͏ͨ͠Β͍͍Ͱ͠ΐ͏͔ɻ

    RubyVM ͷ࡞Γํ
    [1]: https://docs.oracle.com/javase/specs/jvms/se8/html/

    View Slide

  59. ౴͑: C Ͱॻ͔ΕͨίʔυΛಡΉ

    View Slide

  60. https://github.com/m3m0r7/rubyvm-on-php

    View Slide

  61. RubyVM ͷߏ଄

    View Slide

  62. ※ Ruby ͷόʔδϣϯ͸ 3.2 Ͱղઆ͠·͢

    View Slide

  63. େ·͔ͳྲྀΕ

    View Slide

  64. େ·͔ͳྲྀΕ

    RubyVM ͷ࡞Γํ
    YARV ϔομʔͷಡΈࠐΈ
    Instruction Sequence ͷΦϑηοτ৘ใͷಡΈࠐΈ
    άϩʔόϧΦϒδΣΫτͷΦϑηοτ৘ใͷ

    ಡΈࠐΈ
    Instruction Sequence ͷಡΈࠐΈ
    0 ൪໨ͷ Instruction Sequence ͷ࣮ߦ

    View Slide

  65. Ͳ͏΍ͬͯ PHP ͰόΠφϦΛಡΉͷ͔

    View Slide

  66. Ͳ͏΍ͬͯ PHP ͰόΠφϦΛಡΉͷ͔
    - ͦ΋ͦ΋ YARV ϑΝΠϧΛੜ੒͢Δͱ͜Ζ͔ΒελʔτͰ͢ɻRuby ʹ͸
    Instruction Sequence Λు͖ग़ͨ͢Ίͷɹ
    RubyVM::InstructionSequence.compile ͕༻ҙ͞Ε͍ͯ·͢ɻҎԼͷΑ͏ͳ
    ίϚϯυΛ༻͍ͯ HelloWorld.yarv ͱ͍͏ YARV ϑΝΠϧΛ࡞੒͠·͢ɻ

    RubyVM ͷ࡞Γํ

    View Slide

  67. Ͳ͏΍ͬͯ PHP ͰόΠφϦΛಡΉͷ͔
    - VM ࣮૷ʹ͓͍ͯɼΑ͘༻͍ΒΕΔ PHP ͷؔ਺͸ fread, fseek, unpack ͷ 3 छ
    ྨͰ͢ɻ͓͖֮͑ͯ·͠ΐ͏ɻ
    - ΋ͪΖΜ unpack Λ࢖Θͳ͍Ͱߦ͏࣮૷΋ϏοτԋࢉΛ༻͍Ε͹ՄೳͰ͢ɻϏο
    τԋࢉʹ͍ͭͯ͸ׂѪ͠·͢ɻ
    - PHP ͸ C ݴޠͱҧ͍ɼࢦఆͨ͠ܕͰόΠφϦΛಡΜͰ͘Εͳ͍ͷͰɼࢦఆͨ͠
    Φϑηοτʢfseekʣ͔ΒจࣈྻͰҰ౓औಘʢfreadʣͨ͋͠ͱʹ਺஋ܕͳΓɼ
    ුಈখ਺఺ܕͳΓʹม׵ͯ͋͛͠Δඞཁʢunpackʣ͕ੜ͡·͢ɻ

    RubyVM ͷ࡞Γํ

    View Slide

  68. ϔομʔΛಡΉ

    View Slide

  69. େ·͔ͳྲྀΕ

    RubyVM ͷ࡞Γํ
    YARV ϔομʔͷಡΈࠐΈ
    Instruction Sequence ͷΦϑηοτ৘ใͷಡΈࠐΈ
    άϩʔόϧΦϒδΣΫτͷΦϑηοτ৘ใͷ

    ಡΈࠐΈ
    Instruction Sequence ͷಡΈࠐΈ
    0 ൪໨ͷ Instruction Sequence ͷ࣮ߦ

    View Slide


  70. magic
    major version
    minor version
    size
    extra size
    global object list size
    iseq list offset
    global object list offset
    YARV ͷϔομʔ
    4 byte
    4 byte
    4 byte
    4 byte
    4 byte
    4 byte
    4 byte
    4 byte
    YARB (Yet Another Ruby Binary) ͱ͍͏

    ஋͕औಘͰ͖·͢
    ίϯύΠϧ͞Εͨ Ruby ͷϝδϟʔόʔδϣϯ͕औಘ
    Ͱ͖·͢ɻྫͷ৔߹ʮ3ʯͰ͢
    ίϯύΠϧ͞Εͨ Ruby ͷϚΠφʔόʔδϣϯ͕औಘ
    Ͱ͖·͢ɻྫͷ৔߹ʮ2ʯͰ͢
    όΠφϦͷจࣈྻ௕͕औಘͰ͖·͢
    Instruction Sequence ͕͍ͭ֨͘ೲ͞Ε͍ͯΔ͔Λ
    औಘͰ͖·͢
    Ruby ͷγϯϘϧͷ৘ใ͕͍ͭ֨͘ೲ͞Ε͍ͯΔ͔Λ
    औಘͰ͖·͢ɻ
    όΠφϦ্ͷ Instruction Sequence ͷҐஔ৘ใΛऔ
    ಘͰ͖·͢ɻ
    Ruby ͷγϯϘϧͷ৘ใͳͲͷҐஔ৘ใ͕֨ೲ͞Εͯ
    ͍ΔϦετΛऔಘͰ͖·͢ɻ
    ͏·͘औಘͰ͖Δͱ

    ӈਤͷΑ͏ʹͳΓ·͢
    iseq size
    4 byte
    ಠࣗʹ௥Ճ͞ΕΔ֦ுσʔλͷจࣈྻ௕͕औಘͰ͖
    ·͢

    View Slide


  71. V (unsigned long, ϦτϧΤϯσΟΞϯ) Ͱऔಘ͠·͢

    View Slide

  72. Φϑηοτ৘ใΛऔಘ

    View Slide

  73. େ·͔ͳྲྀΕ

    RubyVM ͷ࡞Γํ
    YARV ϔομʔͷಡΈࠐΈ
    Instruction Sequence ͷΦϑηοτ৘ใͷಡΈࠐΈ
    άϩʔόϧΦϒδΣΫτͷΦϑηοτ৘ใͷ

    ಡΈࠐΈ
    Instruction Sequence ͷಡΈࠐΈ
    0 ൪໨ͷ Instruction Sequence ͷ࣮ߦ

    View Slide


  74. iseq list offset ʹΧʔιϧΛҠಈ
    iseq list size ෼ϧʔϓΛճ͠ 4 όΠτ͝ͱͷ

    Φϑηοτ৘ใΛऔಘ͢Δ
    global object list offset ʹΧʔιϧΛҠಈ
    global object list size ෼ϧʔϓΛճ͠ 4 όΠτ͝ͱ
    ͷΦϑηοτ৘ใΛऔಘ͢Δ
    Instruction Sequence ͷΦϑηοτ৘ใϦετΛऔಘ
    Global Object ͷΦϑηοτ৘ใϦετΛऔಘ

    View Slide

  75. Instruction Sequence ͷಡΈࠐΈ

    View Slide

  76. େ·͔ͳྲྀΕ

    RubyVM ͷ࡞Γํ
    YARV ϔομʔͷಡΈࠐΈ
    Instruction Sequence ͷΦϑηοτ৘ใͷಡΈࠐΈ
    άϩʔόϧΦϒδΣΫτͷΦϑηοτ৘ใͷ

    ಡΈࠐΈ
    Instruction Sequence ͷಡΈࠐΈ
    0 ൪໨ͷ Instruction Sequence ͷ࣮ߦ

    View Slide

  77. Instruction Sequence ͷಡΈࠐΈ
    - RubyVM ͷ࣮૷ʹ͸ޮ཰తʹόΠφϦΛѻ͏ͨΊʹ
    ʮibf_(?:load|dump_write)_small_valueʯͱ͍͏֓
    ೦͕͋Γ·͢[1]ɻ
    - ϋϛϯάॏΈ[2] ʢpopcount, population countʣͳ
    ͲΛ༻͍ͯόΠτ௕ΛՄมతʹѻ͍ͬͯΔ΋ͷͰ͢ɻ
    ࣮૷ྫ͸ࠨਤͷ௨Γɻ

    RubyVM ͷ࡞Γํ
    [1]: https://github.com/ruby/ruby/blob/2f603bc4/compile.c#L11262-L11273

    [2]: https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%9F%E3%83%B3%E3%82%B0%E9%87%8D%E3%81%BF

    View Slide

  78. Instruction Sequence ͷಡΈࠐΈ
    - readSmallValue ͕࣮૷Ͱ͖ͨΒಡΈࠐΉ΂͖ 0 ൪໨ͷ Instruction
    Sequence ͷσʔλߏ଄ΛಡΈࠐΜͰ͍͖·͢ɻ
    - ͜ͷσʔλߏ଄ɼ࣮͸ͱͯ΋ڊେͰ Instruction Sequence ͷϝλ৘ใʢྫ֎
    ςʔϒϧͳͲʣʹ֘౰͢Δ΋ͷͳͷͰ͕͢ɼͦͷϝλ৘ใͷ਺͸ 50 ݸҎ্͋
    Γ·͢…ɻ
    - ͜ͷσʔλߏ଄શͯΛಡ·ͳͯ͘΋ɼHelloWorld ͷग़ྗͰ͋Ε͹໰୊ͳ͘Մ
    ೳͳͷͰɼׂѪͯ͠ඞཁͳ 4 ͭͷϝλ৘ใΛಡΈࠐΈ·͢ɻ

    RubyVM ͷ࡞Γํ

    View Slide

  79. Instruction Sequence ͷಡΈࠐΈ
    - ۩ମతͳ࣮૷ྫ͸ Ruby ຊՈͷ࣮૷ʢ https://github.com/ruby/ruby/blob/
    2f603bc4/compile.c#L12125 ʣΛಡΉ͔ɼRubyVM on PHP ʢ https://
    github.com/m3m0r7/rubyvm-on-php/blob/0.3.2.2/src/VM/Core/Runtime/
    Kernel/Ruby3_2/InstructionSequence/
    InstructionSequenceProcessor.php#L61 ʣͷ࣮૷Λ͝ཡ͍ͩ͘͞ɻ

    RubyVM ͷ࡞Γํ

    View Slide


  80. type
    iseq size
    bytecode offset
    bytecode size
    Instruction Sequence ΛಡΉ
    sv
    sv
    sv
    sv
    ※ sv ͸ small value ͷུ
    Instruction Sequence ͷΦϑηοτϦετ 0 ൪໨

    ʹΧʔιϧΛҠಈ

    View Slide

  81. Instruction Sequence ͷ࣮ߦ

    View Slide

  82. େ·͔ͳྲྀΕ

    RubyVM ͷ࡞Γํ
    YARV ϔομʔͷಡΈࠐΈ
    Instruction Sequence ͷΦϑηοτ৘ใͷಡΈࠐΈ
    άϩʔόϧΦϒδΣΫτͷΦϑηοτ৘ใͷ

    ಡΈࠐΈ
    Instruction Sequence ͷಡΈࠐΈ
    0 ൪໨ͷ Instruction Sequence ͷ࣮ߦ

    View Slide

  83. Instruction Sequence ͷ࣮ߦ
    - ઌ΄ͲಡΈࠐΜͩ Instruction Sequence ͔Β
    $bytecodeO
    ff
    set, $iseqSize Λ༻͍ͯɼ໋ྩγʔέϯε
    Λऔಘ͠·͢ɻ
    - HelloWorld! Λग़ྗ͢Δࡍʹ࢖͏໋ྩηοτ͸ʮputself
    (18)ʯʮputstring (21)ʯʮopt_send_without_block
    (51)ʯʮleave (60)ʯͷ 4 छྨͰ͢ɻ
    - ࠨਤͷΑ͏ʹχʔϞχοΫΛॻ͖ग़͠·͢ɻ

    RubyVM ͷ࡞Γํ
    ͜ͷΦϖϨʔγϣϯίʔυͱχʔϞχοΫͷඥ͚ͮ͸


    https://github.com/ruby/ruby/blob/ruby_3_2/yjit/src/cruby_bindings.inc.rs#L849-
    L1050 Ͱॻ͔Ε͍ͯ·͢

    View Slide

  84. Instruction Sequence ͷ࣮ߦ

    RubyVM ͷ࡞Γํ
    putself
    putstring(operand: "HelloWorld!")
    leave
    opt_send_without_block
    ελοΫ
    ελοΫʹ࣮ߦதͷίϯςΩετΛ

    ϓογϡ
    ࣮ߦதͷίϯςΩετ

    View Slide

  85. Instruction Sequence ͷ࣮ߦ

    RubyVM ͷ࡞Γํ
    putself
    putstring(operand: "HelloWorld!")
    leave
    opt_send_without_block
    ελοΫ
    ελοΫʹ HelloWorld! ͷ

    จࣈྻΛϓογϡ
    ࣮ߦதͷίϯςΩετ
    "HelloWorld!"

    View Slide

  86. Instruction Sequence ͷ࣮ߦ

    RubyVM ͷ࡞Γํ
    putself
    putstring(operand: "HelloWorld!")
    leave
    opt_send_without_block
    ελοΫ
    2 ͭͷελοΫΛϙοϓ
    ࣮ߦதͷίϯςΩετͷ 

    puts ϝιουΛݺͼग़͠
    ࣮ߦதͷίϯςΩετ
    "HelloWorld!"

    View Slide

  87. Instruction Sequence ͷ࣮ߦ

    RubyVM ͷ࡞Γํ
    putself
    putstring(operand: "HelloWorld!")
    leave
    opt_send_without_block
    ελοΫ
    ←࣮ߦͷऴྃॲཧɼฦΓ஋ΛૹΔ

    View Slide

  88. Instruction Sequence ͷ࣮ߦ
    - ͪͳΈʹɼYARV ʹม׵͞Εͨ͋ͱͷ໋ྩγʔέϯεΛऔಘ͢Δʹ͸ʢjavap ί
    ϚϯυͷΑ͏ͳ΋ͷ͸ʣʮputs RubyVM::InstructionSequence.compile("puts
    'HelloWorld!'", "HelloWorld.rb").disasmʯͷΑ͏ʹ͢ΔͱՄೳͰ͢ɻ

    RubyVM ͷ࡞Γํ

    View Slide

  89. Instruction Sequence ͷ࣮ߦ
    - ࠨਤͷΑ͏ʹݺͼग़͠ݩͷ
    Main ΫϥεͱάϩʔόϧͳΦ
    ϒδΣΫτʹอଘ͞Ε͍ͯΔ஋
    Λऔಘ͢ΔͨΊͷ loadObject
    Λ࣮૷͠·͢ɻ

    RubyVM ͷ࡞Γํ
    ͜͜ͷ൪߸͸ https://github.com/ruby/ruby/blob/ruby_3_2/compile.c#L12906-
    L12939 ͷ 5 ൪໨ͷؔ਺Λࢦ͍ͯ͠·͢ (ibf_load_object_string)

    View Slide


  90. putself ໋ྩͷ࣮૷
    putstring ໋ྩͷ࣮૷
    opt_send_without_block ໋ྩͷ࣮૷
    leave ໋ྩͷ࣮૷

    View Slide

  91. Instruction Sequence ͷ࣮ߦ
    - ࠨਤͷΑ͏ʹ HelloWorld! ͕ग़ྗ͞ΕΔ͜
    ͱ͕Θ͔Γ·͢ɻ
    - ࠓ·Ͱͷιʔείʔυͷྫ͸ҎԼͷ gist ʹ
    ·ͱΊͯ͋Γ·͢ɻ
    - https://gist.github.com/
    m3m0r7/226e20c8115caf4a9d43b291861
    f978b

    RubyVM ͷ࡞Γํ

    View Slide

  92. DEMOʢ͕࣌ؒ͋Ε͹ʣ

    View Slide

  93. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    ʢ࣍ϖʔδҎ߱ʹ Appendix ͕͖ͭͮ·͢ʣ

    View Slide

  94. Appendix: CallInfoEntry ʹ͍ͭͯ

    View Slide

  95. Appendix: CallInfoEntry ʹ͍ͭͯ

    RubyVM ͷ࡞Γํ
    - RubyVM ্ͷ CallInfoEntry ͸࣮ߦ͞ΕΔϝιουͷϝλ৘ใΛऔಘ͢ΔͨΊ
    ʹඞཁͳ΋ͷͰ͢ɻ
    - ֨ೲ͞Ε͍ͯΔ৘ใ͸ʮϝιου໊ʯʮҾ਺ͷ਺ʯͳͲͰ͢ɻຊདྷ͸͜ΕΒΛ
    ༻͍ͯɼಈతʹϝιουΛ࣮ߦʢopt_send_without_block ໋ྩͷ࣮ߦʣΛ͞
    ͤΔඞཁ͕͋Γ·͢ɻ
    - CallInfoEntry ͸࣍ͷϖʔδͷΑ͏ʹ࣮૷͢Δ͜ͱͰ puts Λࢦఆͤͣʹݺͼग़
    ͢͜ͱ͕Ͱ͖·͢ɻ

    View Slide


  96. $bytecodeSize ม਺ͷਅԼʹ௥Ճɻ

    ࢖͏ͷ͸͜ͷ 2 ͭͷม਺ͷΈ
    ※ଞͷม਺΋ʮϩʔΧϧม਺ʯͱ͔
    ʮྫ֎ॲཧʯͱ͔༷ʑͳ༻్ͰඞཁͰ͕͢ HelloWorld! ͷ

    ग़ྗͰ͸ඞਢͰ͸ͳ͍ͷͰׂѪ͠·͢
    $ciSize ͷਅԼʹҎԼΛ௥Ճ
    ग़ྗ݁Ռ

    View Slide


  97. มߋ

    View Slide


  98. $ciIndex = 0 ͷ௥Ճ
    มߋ

    View Slide

  99. Appendix: CallInfoEntry ʹ͍ͭͯ

    RubyVM ͷ࡞Γํ
    - ͜ΕͰ CallInfoEntry Λ࢖ͬͯϝιου໊Λࣗಈతʹղܾɼ·ͨҾ਺ͷ਺΋ղ
    ܾ͍ͯ͠ΔͷͰɼҾ਺͕૿͑ͨ৔߹Ͱ΋ϝιουͷݺͼग़͕͠Ͱ͖ΔΑ͏ʹͳ
    Γ·͢ɻ
    - ΋ͪΖΜ CallInfoEntry Ҏ֎ʹ΋ϩʔΧϧม਺ςʔϒϧʢϝιου͕ड͚औΔ
    Ҿ਺ͷ৘ใʣͰ͋ͬͨΓɼྫ֎ॲཧͰ͋ͬͨΓɼॏཁͳ৘ใ΋͋Γ·͢ɻ
    - HelloWorld! Λग़ྗͰ͖ͨઌɼ΋͋͠ͳ͕ͨ RubyVM ͷ࣮૷ʹڵຯΛ࣋ͪ࢝
    ΊͨΒɼίʔυΛಡΜͰҙຯΛཧղ࣮͠૷ͯ͠Έͯ͸͍͔͕Ͱ͠ΐ͏͔ɻ

    View Slide

  100. Appendix: CallInfoEntry ʹ͍ͭͯ

    RubyVM ͷ࡞Γํ
    - มߋՕॴ·ͰؚΊͨίʔυ͸ҎԼͷ gist Λࢀর͍ͯͩ͘͠͞
    - https://gist.github.com/m3m0r7/226e20c8115caf4a9d43b291861f978b?
    permalink_comment_id=4686761#gistcomment-4686761

    View Slide

  101. Appendix: RubyVM ͷ໋ྩηοτ਺ʹ͍ͭͯ

    View Slide

  102. Appendix: RubyVM ͷ໋ྩηοτ਺ʹ͍ͭͯ

    RubyVM ͷ࡞Γํ
    - RubyVM ͷ໋ྩηοτͷ਺͸ 100 ݸ΄ͲͰ͢ʢ࣮ମ͸ 200 ݸ΄ͲͰ͕͢ɼ൒
    ෼͸໋ྩΛτϨʔε͢ΔͨΊͷ໋ྩηοτͰ͢ʣɻͪͳΈʹ JVM ͸ 150 ݸ΄
    ͲͰ͢ʢSE 13ʣɻ
    - ୯७ͳ HelloWorld! ͷग़ྗ΍ FizzBuzzɼΫΠοΫιʔτͷϨϕϧײͰ͋Ε
    ͹ɼશ࣮ͯ૷͠ͳͯ͘΋͍͔ͭ͘ͷ໋ྩηοτΛ࣮૷͢Ε͹࣮ߦ͢Δ͜ͱ͕Մ
    ೳʹͳΓ·͢ɻ

    View Slide

  103. Appendix: RubyVM ͷ໋ྩηοτ਺ʹ͍ͭͯ

    RubyVM ͷ࡞Γํ
    - RubyVM ͕ఏڙ͍ͯ͠Δ໋ྩηοτ͸ҎԼΛࢀর͍ͯͩ͘͠͞
    - https://github.com/ruby/ruby/blob/ruby_3_2/insns.def
    - PHP Ͱͷ࣮૷ྫ͸ҎԼΛࢀর͍ͯͩ͘͠͞ɻ
    - https://github.com/m3m0r7/rubyvm-on-php/tree/0.3.2.2/src/VM/Core/
    Runtime/Executor/Insn/Processor

    View Slide

  104. Appendix: Ͳ͏΍ͬͯ Ruby ຊମΛࣸܦ͢Δ͔

    View Slide

  105. Appendix: Ͳ͏΍ͬͯ Ruby ຊମΛࣸܦ͢Δ͔

    RubyVM ͷ࡞Γํ
    - Ruby ຊମͷɼͱΓΘ͚ VM Λ࣮૷͍ͯ͠ΔՕॴΛͲ͏΍ͬͯࣸܦ͢Δ͔Ͱ͢
    ͕ɼجຊతʹ͸ compile.c ʢ https://github.com/ruby/ruby/blob/ruby_3_2/
    compile.c ʣΛோΊΔͷ͕Ұ൪खͬऔΓૣ͍Ͱ͢ɻ
    - `ibf_load_*` ͱॻ͔Ε͍ͯΔؔ਺Λ௥͏ͱྑ͍Ͱ͢ɻ
    - ͱ͸͍͑ɼͲͷॱ൪Ͱݺͼग़͞ΕΔ͔ʹ͍ͭͯ͸ίʔυΛ௥͍͔ͬͯͳ͍ͱΘ
    ͔Βͳ͍ͷͰɼେ·͔ʹͲ͏΍ͬͯ௥͑͹͍͍͔࣍ϖʔδͰϑϩʔਤΛॻ͍ͯ
    ͓͖·͢ɻ

    View Slide

  106. Appendix: Ͳ͏΍ͬͯ Ruby ຊମΛࣸܦ͢Δ͔

    RubyVM ͷ࡞Γํ
    rb_iseq_ibf_load
    ibf_load_setup
    ibf_load_iseq rb_ibf_load_iseq_compl
    ete
    ibf_load_iseq_each ibf_load_code
    ಡΈࠐΜͩ iseq Λ

    ฦ͢
    ibf_load_small_value
    ibf_load_object
    ibf_load_outer_variables
    ibf_load_param_opt_tabl
    e
    ibf_load_param_keywor
    d
    ibf_load_insns_info_bod
    y
    ibf_load_insns_info_posi
    tions
    ibf_load_local_table
    ibf_load_catch_table
    ibf_load_iseq_each Ͱݺ͹ΕΔؔ਺܈
    ࠶ؼతʹ ibf_load_iseq ͕ݺͼग़͞ΕΔ
    compile.c
    ← Ruby ͷ RubyVM::InstructionSequence.load_from_binary ϝιουΛݺͼग़ͨ͠ࡍʹݺ͹ΕΔؔ਺

    (https://github.com/ruby/ruby/blob/ruby_3_2/iseq.c#3733, https://github.com/ruby/ruby/blob/ruby_3_2/iseq.c#3942)
    iseqw_s_load_from_bina
    ry
    iseq.c
    ibf_load_id

    View Slide

  107. Appendix: ϩʔΧϧม਺ͷׂ౰

    View Slide

  108. Appendix: ϩʔΧϧม਺ͷׂ౰

    RubyVM ͷ࡞Γํ
    - ఆٛͨ͠ϢʔβʔϥϯυͷϝιουΛ࣮૷͢Δࡍʹ᪴͘ϙΠϯτͷҰͭͱͯ͠
    ϩʔΧϧม਺ͷׂ౰͕͋Γ·͢ɻࢲࣗ਎΋͍᪴ͯ·ͨ͠ɻ
    - ఆٛ͞ΕͨϝιουΛ࣮ߦ͢Δࡍʹɼ࣮ߦ࣌ʹʢελοΫʹϓογϡ͓ͯ͘͠
    ͷͰ͸ͳ͘ʣҾ਺Λ༧ΊϩʔΧϧςʔϒϧʹηοτ͓ͯ͘͠ඞཁ͕͋ΔͷͰ͢
    ͕ɼͦͷηοτ͢ΔҾ਺ͷҐஔΛٻΊͳ͚Ε͹ͳΓ·ͤΜɻ
    - ιʔείʔυΛಡΉݶΓ EP (environment pointer) Λ༻ҙͯ͠ٻΊ͍ͯΔΑ͏
    Ͱ͕͢ɼຊࢿྉͰ͸ EP Λ࢖Θͳ͍ͰٻΊ·͢ɻ

    View Slide


  109. VM_ENV_DATA_SIZE ϝιου಺ͷม਺܈ ϝιουͷҾ਺
    local table size: 4
    0 1 2 3 4 6
    5
    slot index
    var4 -> slot[3]
    var3 -> slot[4]
    var2 -> slot[5]
    var1 -> slot[6]
    call info argc: 2
    - ྫͷ varN (N ͸ࣗવ਺, N>0) ͸ ʮVM_ENV_DATA_SIZE + local table size - (N - 1)ʯͰٻΊΒΕ·͢ɻͭ·Γ var1 ͸ʮVM_ENV_DATA_SIZE(3) + local table size(4) - N(1)ʯͰ slot[6] ʹ֨ೲ͞ΕΔ͜ͱ͕Θ͔Γ·͢ɻ
    - ϝιουʹ౉͢Ҿ਺͸ఆٛ͞ΕͨҾ਺ͷॱংͱ͸ٯͰ slot index ʹඥ෇͚Δඞཁ͕͋Γ·͢
    - opcode ͷ [gs]etlocal(?:_WC[01]|) ΋͜Εʹैͬͯ஋ΛऔΔΑ͏ʹͳ͍ͬͯ·͢
    - 3 ൪໨͔Βελʔτͳͷ͸ɼRubyVM ʹඞཁͳ৘ใΛຒΊࠐΜͰ͍ΔͨΊͬΆ͍ʢʁʣʢVM_ENV_DATA_INDEX_ME_CREF, VM_ENV_DATA_INDEX_SPECVAL, VM_ENV_DATA_INDEX_FLAGSʣ
    - Ҿ਺͕͋Δ৔߹͸ϝιουݺͼग़͠ͷલʹ༧Ί slot ʹ஋ΛೖΕͯϝιουݺͼग़͠Λߦ͏ඞཁ͕͋Γ·͢ɻྫͰ͸ var1 ͸ slot[6], var2 ͸ slot[5] ʹ༧Ί஋ΛೖΕ͓ͯ͘ඞཁ͕͋Γ·͢ɻ

    ͳ͓ɼvar3 ΍ var4 ͸಺෦ͷ໋ྩγʔέϯεʹ͓͍ͯ setlocal ͕ݺͼग़͞ΕΔͷͰɼ༧Ί஋ΛೖΕ͓ͯ͘ඞཁ͸͋Γ·ͤΜɻ

    (࣮૷ͷώϯτ: https://github.com/m3m0r7/rubyvm-on-php/blob/0.3.2.2/src/VM/Core/Runtime/Executor/CallBlockHelper.php#L121 )

    View Slide

  110. Appendix: ϩʔΧϧม਺ͷׂ౰

    RubyVM ͷ࡞Γํ
    - ͞Βʹ RubyVM ͷϩʔΧϧม਺ʹ͸ level ͱ͍͏֓೦͕͋Γ·͢ɻlevel = 0 ͸ݱ
    ࡏͷ࣮ߦίϯςΩετΛද͢΋ͷͰɼlevel ͕ 1, 2, 3 ... ͱ૿͍͑ͯ͘͝ͱʹ level
    ͷ਺͚ͩલͷίϯςΩετʢRuby ຊମͷίʔυ্Ͱ͸ VM_ENV_PREV_EP ϚΫ
    ϩʹ֘౰ʣͷϩʔΧϧม਺Λࢀর͠·͢ʢ࣍ϖʔδਤࢀরʣɻ
    - ࣮ߦதͷίϯςΩετ͔Βݟͯɼ૬ରҐஔͱͯ͠ม਺ͷ͋ΔίϯςΩετͷ৔ॴ
    Λදͨ͠ͷ͕ level ͩͱࢥ͏ͱΘ͔Γ΍͍͔͢΋͠Ε·ͤΜɻ
    - ͦͷͨΊɼ࣮૷࣌ͷ஫ҙ఺ͱͯ͠ίϯςΩετ͸ḪΕΔΑ͏ʹ͓ͯ͘͠ඞཁ͕͋
    Γ·͢ɻ

    View Slide


  111. var3 ΁ͷ୅ೖ͸࣮ߦ࣌ͷίϯςΩετͳͷͰ

    level ͸ 0 Ͱ setlocal_WC0 ͕૸Δ
    var3 ͕ఆٛ͞Ε͍ͯΔͷ͸ҰͭલͷίϯςΩετͳͷͰ

    ࣮ߦதͷίϯςΩετ͔Βݟͯ level ͸ 1 Ͱ getlocal_WC1 ͕૸Δ
    var3 ͕ఆٛ͞Ε͍ͯΔͷ͸ҰͭલͷίϯςΩετͳͷͰ

    ࣮ߦதͷίϯςΩετ͔Βݟͯ level ͸ 1 Ͱ setlocal_WC1 ͕૸Δ
    var1, var2 ͕ఆٛ͞Ε͍ͯΔͷ͸࣮ߦதͷίϯςΩετͳͷͰ


    level ͸ 0 Ͱ getlocal_WC0 ͕૸Δ
    ݺͼग़͠ʢ಺෦తʹ send/
    opt_send_without_block ͳͲͷ
    opcode ͕ݺͼग़͞Εͱ͖ʣ͕͋Δͱ


    ࣮ߦίϯςΩετ͕มΘΔ

    View Slide