YAPC::Okinawa 2018 Onnasonの資料です
The World of Inline ModuleYAPC::Okinawa 2018 Onnason@moznion
View Slide
@moznionSoftware EngineerࣾʹPerlϓϩδΣΫτ͋Γ·ͤΜ͕Δؾ࣍ୈͰͰ͖·͢
Inline?
Inline?• https://metacpan.org/pod/distribution/Inline/lib/Inline.pod• > Write Perl Subroutines in Other Programming Languages• ʮPerlͷؔΛଞͷݴޠͰॻ͍ͯΈࠐΜͰ࣮ߦ͢Δʯ• ͝ଘ Ingy döt Net ޚେͷΞΠσΞ (2000)
Sample Code
Demo
How does it work?
How does it work? (Inline::C)• PerlͷίϯύΠϧϑΣΠζͰίϯύΠϧ͍ͯ͠Δ• _Inline/ σΟϨΫτϦʹՌ͕Ͱ͖Δ• md5ͷϑΟϯΨʔϓϦϯτ͕༩͞ΕΔ• ίϯύΠϧͯ͠Ͱ͖ͨόΠφϦΛμΠφϛοΫϦϯΫ
How does it work? (Inline::C)
How does it work? (Inline::Python)• Python.hΛXSϨΠϠͰΈࠐΜͰ͍Δ• Python.hΛͬͯpythonίʔυΛevalͯ͠result objectʹ͢Δ• result objectΛperlίʔυʹม• Python.hͰpythonίʔυ͔Β໊લۭؒใΛҾͬ͜ൈ͘• Ҿͬ͜ൈ໊͍ͨલۭؒΛperlίʔυʹຒΊࠐΉ• Pythonͷݺͼग़͠෦Λϥοϓͯ͠perl͔Βݺͼग़͠Մೳʹ͢Δ• ͳͲ……
Why Inline?
Why Inline?• > The most obvious reason is performance.• > you may be able to remove a bottleneck in your Perl codeby using another language
Why Inline?• > There are already two major facilities for extending Perl withC. They are XS and SWIG.• > There is a big fat learning curve involved with setting upand using the XS• (SWIGʹର͢Δݴٴͳ͠)
࣮ࡍͳͥInlineΛ?• Perlͷࢿ࢈͕͋ΓɼͲ͏ͯ͠PerlͰΔඞཁ͕͋Γɼ ͦͯ͠PerlͰύϑΥʔϚϯε͕ग़ͳ͍෦Λิ͏• ྫ͑ܭࢉ
Seriously?
Seriously?• (ঢ়گʹΑͬͯ) Ϛδ
Benchmark• https://gist.github.com/moznion/83dfd5cccb6a8d59a7a7e9e101d64cf8
Benchmark
Pros/Cons
Pros• طଘࢿ࢈Λ্ͬͨͰ؆୯ʹυʔϐϯά͕Մೳ• ଞͷݴޠΛૉʹॻ͚ΔͷͰɼXSΑΓൺֱతͱ͖͍ͬͭ͢ [ཁग़య]• https://metacpan.org/pod/distribution/Inline-C/lib/Inline/C/Cookbook.pod• ο
Cons• ىಈ࣌ͷΦʔόϔου͕͋Δ• ڥߏங͕େม• ଈࢮ͢ΔՄೳੑ͕͋Δ
Management Cost• ॲཧܥ͕2ͭ (͋Δ͍ͦΕҎ্) ʹͳΔίετ• ։ൃڥඋ͕͠ΜͲ͍ (όʔδϣϯϩοΫ)• ຊ൪ڥඋ͠ΜͲ͍• όʔδϣϯϩοΫ• όʔδϣϯΞοϓ• Inline::X ͕͏Ϟδϡʔϧͷόʔδϣϯཧ
ଈࢮʁ
Mentality• ͦΕ͔ΓͳΜͱ……• ͞·͟·ͳঢ়گʹΑΔ (ใྔ͕ແ)
GLUE language
άϧʔݴޠ• ଞͷιϑτΣΞίϯϙʔωϯτͱ࿈ܞͤ͞ΔͨΊͷݴޠ• e.g. γΣϧεΫϦϓτ
PerlͷཱͪҐஔ• ϓϩάϥϛϯάݴޠPerlΑΓൈਮ• > ಉ࣌ʹଟ͘ͷϑΝΠϧϓϩηεͱ௨৴Ͱ͖Δͱ͍͏͜ͱ͕ɺPerl͕ྑ͍άϧʔݴޠͰ͋Δཧ༝ (ͷͻͱͭ) ʹͳ͍ͬͯΔ• > ΤΫεςϯγϣϯϞδϡʔϧʹΑͬͯ෦ʹଞͷͷΛΈࠐΊΔ͜ͱ
Glue => Inline• Inlineͱάϧʔݴޠͷࢥڧؔ͘࿈͍ͯ͠Δ• PerlΛ࣮ߦج൫ͱͯ͠ଞͷݴޠΛΈࠐΜͰಈ͔͢• Perlͷࢿ࢈ͱଞͷݴޠͷࢿ࢈ͱΛγʔϜϨεʹ݁ͼ͚ͭΔ͜ͱ͕ Ͱ͖Δ
͔͠͠άϧʔݴޠͬͯฉ͔ͳ͘ͳΓ·ͨ͠Ͷ• Over HTTPͷAPI callingͷൃୡ• ݴޠΑΓԼͷϨΠϠͷΠϯλʔϑΣʔε͕ͬͨͷͰɼͦ͜ͰؤுΔඞཁ͕ബ͘ͳͬͨͱ͍͏ͷ͋Γͦ͏• ͔ͭͯͷCORBASOAPXMLRPCΑΓஅવʹڥΑ͘ͳͬͨ
• ͱݴ͑Over HTTPͰAPIΛݺͼग़ͦ͏ͱ͢ΔͱϨΠςϯγ͕͋Δ• ͦͷϨΠςϯγ͕ແࢹͰ͖ͳ͘ͳΔλΠϛϯάଘࡏ͢Δ• ͦͷ࣌ͷͨΊͷग़ϋονͱͯ͠Inline͑Δ͔͠͠άϧʔݴޠͬͯฉ͔ͳ͘ͳΓ·ͨ͠Ͷ
ର͢ΔLLVMͷख๏• ҃ΔݴޠΛ҃Δݴޠʹม͢Δͱ͍͏ख๏• ໌Β͔ʹਖ਼͍͠ʂʂʂʂʂ• ͜Εʮάϧʔݴޠʯ͕ਰୀ͍ͯͬͨ͠ҰҼͰͳ͍͔
Perl6ͷເ• use Inline::Perl5• use Inline::Go• ͦͯ͠ଞݴޠͷมcompiler• Java• Perl5• JavaScript• ͳΜͰॻ͚Δ!!!
ॴײ
ॴײ• Perlͷطଘࢿ࢈͕ࢧతͰɼͲ͏ͯ͠ΘͶͳΒͳ͍߹ બࢶͷҰͭʹͳΓ͑Δ• ʮશ෦ॻ͖ͧ͢ʂʂʂʯ͕Ͱ͖ͳ͍͜ͱੈͷதʹଟ͍• ͦͯ͠ಘͯͯ͠ʮશ෦ॻ͖ͧ͢ʂʂʂʯϙγϟΓ͕ͪ• ο
ॴײ• ͓ͱͳ͘͠XSͰॻ͘ͱ͍͏ํ๏͋Δ• ͓ͦΒ͘ϝϯόʔ͕XSͷΤΩεύʔτͰ͋Δඞཁ͕͋Δ• ͦ͏Ͱͳ͍߹υΩϡϝϯτʹ͋ΔΑ͏ʹ։ൃʹ͕͔͔࣌ؒΔ• ͔ͦ͠͠͏ͳͬͯ͘ΔͱPerlͰॻ͍͍ͯΔͷ͔Կͳͷ͔Θ͔Βͳ͘ ͳΔͧ……
ॴײ• ʮPerlͷطଘࢿ࢈͕ࢧతͰɼͲ͏ͯ͠ΘͶͳΒͳ͍߹ʯͰͳ͍߹• ಛʹ͏ඞཁͳ͍ͱࢥ͏……• ʮͲ͏ͯ͠Perlॻ͖ͨ͘ͳ͍ʂʂʯͱ͍͏γνϡΤʔγϣϯʹର͢Δग़ϋονͰͳ͍ɹ• ʮPerlॻ͚ͳ͍͚Ͳϫϯνϟϯ……ʯͱ͔ͳ͍• ਓΛڻ͔ͤΔͷ͕తͷ߹༗ޮ (ʁ) ͔͠Εͳ͍
ॴײ• > Maybe the best reason is "Because you want to!". Diversity keeps the worldinteresting. TMTOWTDI!• ࣄͩͱͦ͏ݴ͓ͬͯΕΜ……
·ͱΊ
·ͱΊ• PerlͷInlineϞδϡʔϧʹ͍ͭͯ͝հΛ͠·ͨ͠• PerlͷInlineϞδϡʔϧͷpros/consʹ͍ͭͯઆ໌͠·ͨ͠• ओʹੑೳ໘Ͱͷڧ͞Λૂ͑·͢• άϧʔݴޠͷࠓੲʹ͍ͭͯ͠·ͨ͠• InlinePerl͕ݏʹͳͬͨਓͷͨΊͷग़ϋονͰͳ͍
མึͻΖ͍: ͜Μͳʹ͋ΔInlineϞδϡʔϧ
͜Μͳʹ͋ΔInlineϞδϡʔϧ
͜Μͳʹ͋ΔInlineϞδϡʔϧ• DAVIDO/Inline::CPP• RHOELZ/Inline::Lua• MIYAGAWA/Inline::Basic• RRS/Inline::Tcl• NEILW/Inline::ASM• etc...
མึͻΖ͍: InlineϞδϡʔϧͷॻ͖ํ
InlineϞδϡʔϧͷॻ͖ํ• આ໌͢Δʹ͋·Γʹ͕࣌ؒͳ͍͜ͱ͕༧͞ΕΔͷͰͬ͘͟Γ• registerॻ͘• buildॻ͘• load/bindॻ͘• ʂʂʂ (͜͜ʹࢸΔ·Ͱʹͱͯͭͳ͍࿑ྗΛཁ͢Δ)
InlineϞδϡʔϧͷॻ͖ํ• Inline::CͱInline::PythonΑ͘Ͱ͖͍ͯΔͷͰࢀߟʹͳΔͱࢥ͍·͢
Q?