Slide 1

Slide 1 text

Node.js v20 Ͱ௥Ճ͞Ε ͨ URL Parser Ada ʹͭ ͍ͯ 2023/05/09 @ ؔ੢NodeֶԂ

Slide 2

Slide 2 text

Twitter: @yosuke_furukawa Github: yosuke-furukawa

Slide 3

Slide 3 text

URL Parser ͳʹͦΕ͓͍͍͠ ͷʁ • URL Parser ͦ΋ͦ΋Կʁ > new URL("https://example.com"); URL { href: 'https://example.com/', origin: 'https://example.com', protocol: 'https:', username: '', password: '', host: 'example.com', hostname: 'example.com', port: '', pathname: '/', search: '', searchParams: URLSearchParams {}, hash: '' }

Slide 4

Slide 4 text

URL Parser ͳʹͦΕ͓͍͍͠ ͷʁ • URL Parser ͦ΋ͦ΋Կʁ > new URL("https://example.com"); URL { href: 'https://example.com/', origin: 'https://example.com', protocol: 'https:', username: '', password: '', host: 'example.com', hostname: 'example.com', port: '', pathname: '/', search: '', searchParams: URLSearchParams {}, hash: '' } ͜͏͍͏΍ͭ

Slide 5

Slide 5 text

URLͬͯͨ͘͞ΜͷύʔπͰͰ ͖ͯΜͶΜɻ • ͦΕͧΕ෦෼͝ͱʹ෼ׂ͓ͯ͘͠ͱ৭ʑྑ͍͜ͱ͕͋Δɻ • ྫ͑͹ϧʔςΟϯά • ྫ͑͹ϦΫΤετ࣮ߦ • Node.js ͩͬͯ ESM ͷϩʔμʔ಺ͰϞδϡʔϧऔಘ͢Δͱ͖࢖ͬ ͯͨΓ͢Δ

Slide 6

Slide 6 text

URL Parser ͕ʁͲ͏ͳͬͨΜʁ • ؆୯ʹݴ͏ͱ଎͘ͳͬͨɻ • Node.js v20 ͔Β v19 ͷൺֱ

Slide 7

Slide 7 text

URL Parser ͕ʁͲ͏ͳͬͨΜʁ • ͞ΒʹDeno v1.32.1 ΍Bun v0.5.8ͱͷൺֱ

Slide 8

Slide 8 text

ԿΛͨ͠Β଎͘ͳͬͨͷ͔

Slide 9

Slide 9 text

Legacy URL Parser • const url = require("url"); • Ͱݺͼग़͢΍ͭ • JavaScript ੡ • Legacy URL Parser ͱͯ͠ղઆ͞Ε͍ͯΔ • طʹࠓ͸ deprecated ѻ͍

Slide 10

Slide 10 text

Ұݸલͷ URL Parser • new URL() Ͱݺͼग़͢΍ͭ • JavaScript Ͱ binding ͞ΕͯΔ͕ɺ parser ຊମ ͸ C++ (not ada) • φΠʔϒͳ࣮૷ • ଎͍͜ͱΑΓ΋ spec ʹ஧࣮ͳ͜ͱΛ໨ࢦͯͨ͠

Slide 11

Slide 11 text

JavaScript vs C++

Slide 12

Slide 12 text

JavaScript vs C++ • Αٞ͘࿦ʹͳΔ໰୊ • JavaScript ͰίʔυΛॻ͘ͱॳظίετ͸஗͍͕ɺJITͷӨڹͰߴ଎ԽͰ ͖Δɻ • C++ ͰίʔυΛॻ͘ͱ଎͍͕ɺJITͷԸܙ͸ड͚ΒΕͳ͍ɻ • C++ Ͱશ෦ॻ͍ͨΒ͡Ό͋ྑ͍ͷ͔ʁͱ͍͏ͱɺͦ͏Ͱ΋ͳ͍ɻ։ൃί ετ΍ϝϞϦ΁ͷέΞ͕ॏཁʹͳΔɻ • ͜ͷ࣌఺Ͱ͸ WHATWG URL vs Legacy URL ͸ͲͪΒ΋࢒͍ͯ͘͠ํ਑ Ͱ։ൃ͞Ε͍ͯͯɺύϑΥʔϚϯεൺֱ͸ͦΜͳʹଟ͘͞Ε͍ͯͳ͍ɻ

Slide 13

Slide 13 text

JavaScript and C++

Slide 14

Slide 14 text

JavaScript and C++ • ݁ہ C++ Ͱॻ͘ͱͯ͠΋ JavaScript ͷΠϯλϑΣʔεͰఏڙ͞ Ε͍ͯΔͷͰɺJS <=> C++ ؒͷ৘ใͷड͚౉͕͠ඞཁʹͳΔɻ • ݴ͍׵͑Δͱ JS ͷੈքͱ C++ ͷੈք͕ Node.js ʹ͸ଘࡏ͢Δɻ • JS ͔Β C++ ʹ৘ใͷड͚౉͠Λ͢Δ࣌ʹߦ͍ͬͯΔͷ͕ String ͷ serialize ͱ͍͏ॲཧɻ • Node.jsͰBuffer Λ௚઀࢖ͬͨ͜ͱ͕͋Δਓ͸ serialize ͞Εͨจ ࣈྻΛ௚઀࢖͍ͬͯΔɻ

Slide 15

Slide 15 text

Serialize ॲཧΛ೗Կʹߴ଎ʹ ͢Δ͔͕ϙΠϯτ

Slide 16

Slide 16 text

ݱࡏͷ URL Parser • new URL() Ͱݺͼग़͢΍ͭ • Ada ͱݺ͹ΕΔύʔαʔ(C++)Ͱ࣮૷͞Εͯ Δɻ • JSͱC++ͷόΠϯσΟϯά΋༻ҙ͞Ε͍ͯΔɻ • String ͷ serialize ΛۃྗলྗԽ͍ͯ͠Δɻ

Slide 17

Slide 17 text

࡞ઓ1: จࣈྻΛύʔε͢Δ࣌ʹશ෦ Λจࣈʹม׵͠ͳ͍࡞ઓ

Slide 18

Slide 18 text

શ෦Λจࣈʹม׵͠ͳ͍࡞ઓ • URL ͷͲ͔͜ΒͲ͜·Ͱ͕Կͷ৘ใͳͷ͔ͱ ͍͏ offset ஋͚͓ͩ࣋ͬͯ͘ɻ

Slide 19

Slide 19 text

શ෦Λจࣈʹม׵͠ͳ͍࡞ઓ • URL ͷͲ͔͜ΒͲ͜·Ͱ͕Կͷ৘ใͳͷ͔ͱ ͍͏ offset ஋͚͓ͩ࣋ͬͯ͘ɻ จࣈྻͷTFSJBMJ[F͸Ұճ͚ͩʂͲ͜ͷจࣈ͔ΒͲ͜ͷจࣈ·Ͱ͕Կͳͷ ͔Λ΋͓͖ͬͯɺͦΕ͕௚઀+4ʹόΠϯυ͞ΕΔ࢓૊ΈΛ࡞ͬͯΔ

Slide 20

Slide 20 text

࡞ઓ2: C++͔ΒJSʹ௚઀όΠϯσΟ ϯά͢Δ࡞ઓ

Slide 21

Slide 21 text

C++͔ΒJSʹ௚઀όΠϯσΟϯ ά͢Δ࡞ઓ • AliasedUint32Arrayͱݺ͹ΕΔಛघͳ TypedArray Λ࢖ͬͯ C++ ࣮૷͔Β௚઀JSʹ ૹΔɻ • Serialize Λͱ͜ͱΜߴ଎Խ͢Δɻ

Slide 22

Slide 22 text

࡞ઓ3: ஗ԆಡΈࠐΈ

Slide 23

Slide 23 text

஗ԆಡΈࠐΈ • ඞཁʹͳΔΪϦΪϦ·Ͱ࣮ߦ͠ͳ͍࡞ઓ • ΞΫηε͢Δͱ͖ͷඞཁͳϓϩύςΟ͕Θ ͔ͬͨΒͦ͜·ͰύʔεΛߦ͏ɻ

Slide 24

Slide 24 text

͜͏ͯ͠ߴ଎Խ͞Εͨ Ada Λ࢖ͬͨURL Parser͕ ஀ੜͨ͠

Slide 25

Slide 25 text

Enjoy Node.js v20!!