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

Ruby2.7の新機能で簡易版Rubyインタプリタを実装してみる

 Ruby2.7の新機能で簡易版Rubyインタプリタを実装してみる

Hello hey for Engineers vol.3(day2)の発表資料です。
Ruby2.7の新機能パターンマッチを使って簡易版Rubyインタプリタを実装してみるという話です。

5fc8ab822e946a8ddfa46ba15a848392?s=128

fuqda

May 09, 2019
Tweet

Transcript

  1. Ruby2.7ͷ৽ػೳͰ
 ؆қ൛RubyΠϯλϓϦλΛ
 ࣮૷ͯ͠ΈΔ 
 2019/05/09 Hello hey for Engineers vol.3ɹɹ


    
 fuqda(fuqda90)
  2. fuqdaͱਃ͠·͢ ʲܦྺʳ
 4*FS ೥਺ϲ݄ ͔Β
 ແڅΠϯλʔϯϲ݄Λܦͯ
 4503&4KQ΁ྲྀΕண͖೥໨
 
 ʲͦͷଞʳ
 ීஈ͸5BNBSCͱ͍͏


    ଟຎ஍Ҭ ٢঵ࣉʙീԦࢠ·Ͱ ͷ
 ஍Ҭ3VCZίϛϡχςΟΛɹ
 ओ࠵ͯ͠·͢
  3. ࠂ஌ ݸਓత

  4. ݄ʹ5BNBSCͰ ΧϯϑΝϨϯε ΍Γ·͢✨

  5. ςʔϚ͸ʮRubyistͱͯ͠ͷ੒௕ʯ

  6. Tama Rubyձٞ01  ౔ d
 ೚ҙࢀՃͷ࠙਌ձd·Ͱ 
 !ौ୩ηϧϦΞϯλϫʔ' (.0:PVST 

    جௐߨԋɿҏ౻३Ұ͞Μ !KODIJUP 
 جௐߨԋɿޒेཛྷ๜໌͞Μ !JHBJHB 
 ͦͷଞ$'1ʴ5BNBSCϝϯόʔ-5
  7. CFPઈࢍड෇தͰ͢
 (ҰൠࢀՃืू͸6݄։࢝༧ఆ) https://tama-rb.github.io/tamarubykaigi01/

  8. ࠓ೔ͷ͓࿩

  9. Ruby2.7ͷύλʔϯϚονΛ ࢼͯ͠ΈΔͱ͍͏࿩ 3VCZͷτϥϯΫ NBTUFS ʹ
 1BUUFSO.BUDIJOHͱ͍͏৽ػೳ͕
 ௥Ճ͞Ε͍ͯΔͱͷ͜ͱ
 ͱ͍͏Θ͚Ͱʂຊ೔͸
 ͦΕΛࢼͯ͠Έ·͢

  10. ิ଍ɿRubyKaigi2019Ͱͷ
 ൃද͸ͪ͜Β https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7

  11. ࠓճ
 ύλʔϯϚονϯάΛ ࢼ͢୊ࡐ

  12. 3VCZͰ࡞Δ
 ؆қ൛ 3VCZΠϯλϓϦλ ✨

  13. ʲલఏʳ ͜͜Ͱ࡞ΔΠϯλϓϦλʹ͍ͭͯ͸ɺ
 िץΞεΩʔͰ࿈ࡌ͞Ε͍ͯͨ (2016.09~2017.01)
 RubyͰֶͿRubyͷίʔυΛҰ෦ྲྀ༻͠ɺ
 ͦ͜ʹखΛೖΕ͍ͯ͘ܗͰ
 ਐΊ͍͖ͯ·͢ refs :ʮୈ5ճ RubyͰม਺෇͖ి୎Λ࡞ͬͯΈΔʯ

    https://ascii.jp/elem/000/001/230/1230449/
  14. ͦ΋ͦ΋ΠϯλϓϦλͬͯ… JUFSQSFUFSˠҙຯɿʮ௨༁ʯ
 
 ਓ͕ؒॻ͍ͨιʔείʔυΛ
 ಡΈࠐΜͰϓϩάϥϜͱͯ͠
 ࣮ߦ͢ΔϓϩάϥϜͷ͜ͱ

  15. ྫ͑͹͜ΜͳࣜΛಡΈࠐΜͰ
 ΠϯλʔϓϦλ͕ղऍ͢Δ৔߹

  16. ΠϯλϓϦλ͕
 ΍Δ͜ͱͬͯʁ

  17. ࣈ۟ղੳ ߏจղੳ ࣮ߦ

  18. 1. ࣈ۟ղੳ 
 
 
 จࣈྻΛͭͭ෦඼ͷ഑ྻʹม׵͢Δ
 
 


  19. 2. ߏจղੳ 
 
 
 ϓϩάϥϜͱ࣮ͯ͠ߦՄೳͳߏจ໦ʹม׵͢Δ
 
 


  20. 3. ࣮ߦ ߏจ໦Λೖྗͱͯ͠ϓϩάϥϜΛ࣮ߦ͢Δ

  21. ࣈ۟ղੳ ߏจղੳ ࣮ߦ ࣌ؒͷ౎߹ʹΑΓ ͷ ෦෼͸ग़དྷ߹͍ͷϥΠϒϥϦΛ ྲྀ༻͠·͢

  22. ΍͍ͬͯ͘

  23. ࠓճͷࡐྉᶃ
 ߏจղੳ༻ͷgem NJOSVCZ https://github.com/mame/minruby

  24. ࠓճͷࡐྉᶄ
 ߏจ໦ΛRubyͱ࣮ͯ͠ߦ͢ΔΫϥε ࣮ߦ͢ΔϑΝΠϧ JOUFSQSFUFSSC

  25. ࠓճͷࡐྉᶅ
 ߏจ໦Λ࡞ΔͨΊͷܭࢉࣜΛهࡌͨ͠Ϋϥε ίϚϯυ࣮ߦ͢ΔϑΝΠϧͷҾ਺ͱͳΔϑΝΠϧ ʮ ʯ͕هࡌ͞Ε͍ͯΔ͚ͩ  GPSNVMBSC

  26. ͡Ό࣮͋ࡍɺ 3VCZͷύλʔϯϚονϯάΛ ΠϯλϓϦλͷॲཧͰ࢖͏ͱͯ͠ɺ ͲΜͳ෦෼Ͱ࢖͑ΔͩΖ͏ʁ

  27. ߟ͑ͯΈΔ

  28. case~whenΛεοΩϦॻ͘
 ͨΊʹ࢖͏ͷ͸Ͳ͏ͩΖ͏ʁ ɹɹɹɹ ߏจղੳޙͷ഑ྻ Λ ࠶ؼతʹݕࡧͯ͠Լهͷϝιουͷ 3VCZͱͯ͠
 ࣮ߦ͢Δ෦෼ʹ
 खΛೖΕͯΈΔ

  29. ࢼͯ͠ΈΑ͏

  30. ࠓճ࢖͏
 ύλʔϯϚονϯάͷ छྨ ɹɹɹɹ˞ύλʔϯϚονϯάͷه๏ʹ͸
 ɹɹɹɹ͍͔ͭ͘ͷόϦΤʔγϣϯ͕͋Γ·͢

  31. As Pattern DBTFʹ౉ͬͨ஋͕ ύλʔϯʹҰக͢Δͱ Ұகͨ͠஋ͱ
 Ҏ߱ͷม਺Λ ඥ͚ͮΔ͜ͱ͕ग़དྷΔ

  32. ͦͷଞͷύλʔϯϚονϯάʹ͍ͭͯ 7BMVF1BUUFSO
 7BSJBCMF1FUUFSO
 "MUFSOBUJWF1BUUFSO
 "SSBZ1BUUFSO
 )BTI1BUUFSO ͪ͜Βͷهࣄ͕෼͔Γ΍͔ͬͨ͢ͷͰؾʹͳΔํ͸ͦͪΒ΁
 !NBLJDBNFMʮ3VCZͷ৽ػೳ1BUUFSO.BUDIJOH͕࠷ߴͰͨ͠ʯ
 IUUQTRJJUBDPNNBLJDBNFMJUFNTDEFGEFEC

  33. ΍ͬͯΈͨ

  34. As PatternΛ࢖͏લޙͷมߋࠩ෼ ࠓճͷέʔεͰ͸࠶ؼॲཧΛॻ͔ͳͯ͘΋Α͘ͳΓ·ͨ͠
 ଟগ͸γϡοͱॻ͚͔ͨ΋͠Ε·ͤΜɻ ΋ͬͱ៉ྷʹॻ͚ΔͩΖ͏͚Ͳࠓճ͸ΰϝϯͳ͍͞ʜ

  35. खݩͰಈ͔͢৔߹ ΋͠खݩͰࢼͯ͠Έ͍ͨ ͱ͍͏ํ͸HJTUʹιʔεΛ ஔ͍͓͖ͯ·ͨ͠ͷͰɺ ͦͪΒͰ΋͓ܰ͘ࢼ͠௖͚·͢ ஫) Rubyͷόʔδϣϯ͸2.7.0devͰ͢ https://gist.github.com/Shigeyuki-fukuda/37c2e9da1ac3744ea24920dacd25580f

  36. ࣮ࡍʹಈ͔ͨ݁͠Ռ 
 SBJMTSVOOFSίϚϯυʹҾ਺Λ౉ͯ͠
 ࣮ߦͯ͠Έͨͱ͜ΖΩϟϓνϟͷ௨Γ
 ૝ఆ௨Γͷܭࢉ͕͞Ε·ͨ͠ ܭࢉ݁Ռ͕Ͱ͋Δ͜ͱΛ֬ೝ

  37. ײ૝

  38. ࠓճ΍ͬͯΈͯ… ࠓճ͸ɺ ͷΑ͏ͳԋࢉࢠͱ਺஋ͭͷ୯७ͳܭࢉࣜͰ͕ͨ͠ɺ   ΍ԼهͷΑ͏ͳෳ਺ߦͷܭࢉʹରԠ͠Α͏ͱ͢Δͱ ΋͏গ͠࢖͍ํΛ޻෉͢Δඞཁ͕͋Γͦ͏Ͱ͢ ΋͏গ͠޻෉ͯ͠࡞Γ͔ͨͬͨͰ͕͢ɺ·ͨ࣍ͷػձʹ 
 ɹɹɹɹɹɹɹɹɹɹ

    ɹɹɹɹɹɹɹɹɹɹ FYෳ਺ߦͷܭࢉࣜΛಡΈࠐΉࡍͷྫ
  39. ·ͱΊ

  40. RubyͬͯΠΠͰ͢ΑͶ✨ ࠓճ͸3VCZͷτϥϯΫʹ௥Ճ͞Εͨ ϕʔλ൛ͷύλʔϯϚονϯάΛ3VCZͷΠϯλϓϦλͷ࣮૷ ͱ͍͏έʔεΛྫʹ͍ͬͯ͡Έ·ͨ͠ ΍ͬͺΓ3VCZͰίʔυΛॻ͘ͷָ͍ͬͯ͠Ͱ͢ΑͶ✨☺ 3VCZͷདྷ೥ϦϦʔε͕ࠓ͔Βָ͠ΈͰ͢ SCFOW͔ΒखܰʹམͱͤΔͷͰ
 ·ͩͷํ͸2.7Λࢼͯ͠Έͯ͸͍͔͕Ͱ͠ΐ͏͔

  41. ͱ͍͏Θ͚Ͱ

  42. 8FBSF)JSJOH 4503&4KQ͸
 Ұॹʹಇ͍ͯ͘ΕΔ஥ؒΛืू͍ͯ͠·͢