[ã¢ããã€ã¹ãèªã]ãµã€ã¯ã«ã®ä»ã®19ã®éšå
ããŒã1ïŒ ãšã³ãžã³ãã©ã³ã¿ã€ã ã¡ã«ããºã ãã³ãŒã«ã¹ã¿ãã¯ã®æŠèŠ
ããŒã2ïŒ V8å éšãšã³ãŒãã®æé©åã«ã€ããŠ
ããŒã3ïŒ ã¡ã¢ãªç®¡çã4çš®é¡ã®ã¡ã¢ãªãªãŒã¯ãããã³ããããšã®æŠã
ããŒã4ïŒ ã€ãã³ãã«ãŒããéåæãããã³éåæ/åŸ æ©ã䜿çšããŠã³ãŒããæ¹åãã5ã€ã®æ¹æ³
ããŒã5ïŒ WebSocketãšHTTP / 2 + SSEã äœãéžã¶ïŒ
ããŒã6ïŒ WebAssemblyã®æ©èœãšç¯å²
ããŒã7ïŒ Web Workersãš5ã€ã®äœ¿çšã·ããªãª
ããŒã8ïŒ ãµãŒãã¹ã¯ãŒã«ãŒ
ããŒã9ïŒ Webããã·ã¥éç¥
ããŒã10ïŒ MutationObserverã䜿çšããŠDOMã®å€æŽã远跡ãã
ããŒã11ïŒ WebããŒãžã¬ã³ããªã³ã°ãšã³ãžã³ãšããã©ãŒãã³ã¹ãæé©åããããã®ãã³ã
ããŒã12ïŒ ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ãæé©åãããã©ãŠã¶ãŒã®ãããã¯ãŒã¯ãµãã·ã¹ãã
ããŒã12ïŒ ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ãæé©åãããã©ãŠã¶ãŒã®ãããã¯ãŒã¯ãµãã·ã¹ãã
ããŒã13ïŒ CSSãšJavaScriptã䜿çšããã¢ãã¡ãŒã·ã§ã³
ããŒã14ïŒ JSã®ä»çµã¿ïŒæœè±¡æ§æããªãŒã解æãããã³ãã®æé©å
ããŒã15ïŒ JSã®ä»çµã¿ïŒã¯ã©ã¹ãšç¶æ¿ãBabelããã³TypeScriptã§ã®ãã©ã³ã¹ãã¬ãŒã·ã§ã³
ããŒã16ïŒ JSã®ä»çµã¿ïŒã¹ãã¬ãŒãž
ããŒã17ïŒ JSã®ä»çµã¿ïŒShadow DOMãã¯ãããžãŒãšWebã³ã³ããŒãã³ã
ããŒã18ïŒ JSã®ä»çµã¿ïŒWebRTCããã³P2Péä¿¡ã¡ã«ããºã
ããŒã19ïŒ JSã®ä»çµã¿ïŒã«ã¹ã¿ã èŠçŽ
ããŒã2ïŒ V8å éšãšã³ãŒãã®æé©åã«ã€ããŠ
ããŒã3ïŒ ã¡ã¢ãªç®¡çã4çš®é¡ã®ã¡ã¢ãªãªãŒã¯ãããã³ããããšã®æŠã
ããŒã4ïŒ ã€ãã³ãã«ãŒããéåæãããã³éåæ/åŸ æ©ã䜿çšããŠã³ãŒããæ¹åãã5ã€ã®æ¹æ³
ããŒã5ïŒ WebSocketãšHTTP / 2 + SSEã äœãéžã¶ïŒ
ããŒã6ïŒ WebAssemblyã®æ©èœãšç¯å²
ããŒã7ïŒ Web Workersãš5ã€ã®äœ¿çšã·ããªãª
ããŒã8ïŒ ãµãŒãã¹ã¯ãŒã«ãŒ
ããŒã9ïŒ Webããã·ã¥éç¥
ããŒã10ïŒ MutationObserverã䜿çšããŠDOMã®å€æŽã远跡ãã
ããŒã11ïŒ WebããŒãžã¬ã³ããªã³ã°ãšã³ãžã³ãšããã©ãŒãã³ã¹ãæé©åããããã®ãã³ã
ããŒã12ïŒ ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ãæé©åãããã©ãŠã¶ãŒã®ãããã¯ãŒã¯ãµãã·ã¹ãã
ããŒã12ïŒ ããã©ãŒãã³ã¹ãšã»ãã¥ãªãã£ãæé©åãããã©ãŠã¶ãŒã®ãããã¯ãŒã¯ãµãã·ã¹ãã
ããŒã13ïŒ CSSãšJavaScriptã䜿çšããã¢ãã¡ãŒã·ã§ã³
ããŒã14ïŒ JSã®ä»çµã¿ïŒæœè±¡æ§æããªãŒã解æãããã³ãã®æé©å
ããŒã15ïŒ JSã®ä»çµã¿ïŒã¯ã©ã¹ãšç¶æ¿ãBabelããã³TypeScriptã§ã®ãã©ã³ã¹ãã¬ãŒã·ã§ã³
ããŒã16ïŒ JSã®ä»çµã¿ïŒã¹ãã¬ãŒãž
ããŒã17ïŒ JSã®ä»çµã¿ïŒShadow DOMãã¯ãããžãŒãšWebã³ã³ããŒãã³ã
ããŒã18ïŒ JSã®ä»çµã¿ïŒWebRTCããã³P2Péä¿¡ã¡ã«ããºã
ããŒã19ïŒ JSã®ä»çµã¿ïŒã«ã¹ã¿ã èŠçŽ
ããã¯ãV8ãšã³ãžã³ã®äŸã䜿çšããJavaScriptã®æ©èœã«ç¹åããã·ãªãŒãºã®2çªç®ã®è³æã§ãã æåã¯ãV8ã©ã³ã¿ã€ã ã¡ã«ããºã ãšã³ãŒã«ã¹ã¿ãã¯ã«ã€ããŠè©±ããŸããã ä»æ¥ã¯ãJSã®ãœãŒã¹ã³ãŒããå®è¡å¯èœããã°ã©ã ã«å€ããV8ã®æ©èœã詳ãã調ã¹ãã³ãŒããæé©åããããã®ãã³ããå ±æããŸãã
![](https://habrastorage.org/web/943/041/288/9430412889624157ba2482b65b11d955.jpg)
JSãšã³ãžã³ã«ã€ããŠ
JavaScriptãšã³ãžã³ã¯ãããã°ã©ã ãã€ãŸãJavaScriptã§èšè¿°ãããã³ãŒããå®è¡ããã€ã³ã¿ãŒããªã¿ãŒã§ãã ãšã³ãžã³ã¯ãããŸããŸãªã¢ãããŒãã䜿çšããŠå®è£ ã§ããŸããåŸæ¥ã®ã€ã³ã¿ãŒããªã¿ãŒã®åœ¢åŒã§ãåçã³ã³ãã€ã©ãŒïŒãŸãã¯JITã³ã³ãã€ã©ãŒïŒã®åœ¢åŒã§ãããã°ã©ã ãå®è¡ããåã«ãJSã®ãœãŒã¹ã³ãŒããç¹å®ã®åœ¢åŒã®ãã€ãã³ãŒãã«å€æããŸãã
äžè¬çãªJavaScriptãšã³ãžã³ã®å®è£ ã®ãªã¹ãã以äžã«ç€ºããŸãã
- V8ã¯C ++ã§èšè¿°ããããªãŒãã³ãœãŒã¹ãšã³ãžã³ã§ãGoogleãéçºäžã§ãã
- Rhino-ãã®ãªãŒãã³ãœãŒã¹ãšã³ãžã³ã¯Mozilla FoundationããµããŒãããå®å
šã«Javaã§æžãããŠããŸãã
- SpiderMonkeyã¯ãNetscape Navigatorã§éå»ã«äœ¿çšãããä»æ¥Firefoxã§äœ¿çšãããæåã®JSãšã³ãžã³ã§ãã
- JavaScriptCoreã¯ãNitroãšããŠç¥ãããAppleãSafariãã©ãŠã¶çšã«éçºããå¥ã®ãªãŒãã³ãœãŒã¹ãšã³ãžã³ã§ãã
- KJSã¯ãKDEãããžã§ã¯ãã®äžéšã§ããKonquerorãã©ãŠã¶çšã«Harry PortenãéçºããKDE JSãšã³ãžã³ã§ãã
- ChakraïŒJScript9ïŒ-Internet Explorerçšã®ãšã³ãžã³ã
- ChakraïŒJavaScriptïŒã¯ãMicrosoft Edgeã®ãšã³ãžã³ã§ãã
- Nashornã¯ãOracleãé¢äžããOpenJDKã®äžéšã§ãããªãŒãã³ãœãŒã¹ãšã³ãžã³ã§ãã
- JerryScriptã¯ãã¢ãã®ã€ã³ã¿ãŒãããçšã®è»œéãšã³ãžã³ã§ãã
ãã®èšäºã§ã¯ãV8ã®æ©èœã«çŠç¹ãåœãŠãŸãã
ãªãV8ãšã³ãžã³ãäœæãããã®ã§ããïŒ
ãªãŒãã³ãœãŒã¹ã®V8ãšã³ãžã³ã¯Googleã«ãã£ãŠäœæãããC ++ã§èšè¿°ãããŠããŸãã ãã®ãšã³ãžã³ã¯ãGoogle Chromeãã©ãŠã¶ãŒã§äœ¿çšãããŸãã V8ãä»ã®ãšã³ãžã³ãšç°ãªãç¹ã«å ããŠãäžè¬çãªãµãŒããŒç°å¢Node.jsã§äœ¿çšãããŠããŸãã
![](https://habrastorage.org/getpro/habr/post_images/486/f41/b75/486f41b75341debfac4fa3aff0d0da6a.png)
V8ããŽ
V8ãèšèšããéãéçºè ã¯ãã©ãŠã¶ãŒã§JavaScriptã®ããã©ãŒãã³ã¹ãåäžãããããšã«çæããŸããã ããã°ã©ã ã®é«éå®è¡ãå®çŸããããã«ãV8ã¯ã€ã³ã¿ãŒããªã¿ãŒã䜿çšããã«JSã³ãŒããããå¹ççãªãã·ã³ã³ãŒãã«å€æããŸãã ãšã³ãžã³ã¯ãããã°ã©ã ã®å®è¡äžã«JavaScriptã³ãŒãããã·ã³åœä»€ã«ã³ã³ãã€ã«ããSpiderMonkeyãRhinoïŒMozillaïŒãªã©ã®å€ãã®ææ°ã®JavaScriptãšã³ãžã³ã®ãããªåçã³ã³ãã€ã«ã¡ã«ããºã ãå®è£ ããŸãã äž»ãªéãã¯ãJSããã°ã©ã ã®å®è¡æã«V8ããã€ãã³ãŒããŸãã¯äžéã³ãŒãã䜿çšããªãããšã§ãã
V8ã§äœ¿çšããã2ã€ã®ã³ã³ãã€ã©ãŒã«ã€ããŠ
å éšããã€ã¹V8ã¯ãæè¿ç»å ŽããããŒãžã§ã³5.9ã®ãªãªãŒã¹ã§å€æŽãããŸããã ãã®åã«ã圌ã¯2ã€ã®ã³ã³ãã€ã©ãŒã䜿çšããŸããã
- full-codegenã¯ãæ¯èŒçäœéã®ãã·ã³ã³ãŒããçæããã·ã³ãã«ã§éåžžã«é«éãªã³ã³ãã€ã©ã§ãã
- ã¯ã©ã³ã¯ã·ã£ããã¯ãæé©åãããã³ãŒããçæãããããè€éãªæé©åJITã³ã³ãã€ã©ã§ãã
ãšã³ãžã³å ã§ããã€ãã®ã¹ã¬ããã䜿çšãããŸãã
- ããããæåŸ
ã§ãããã®ãæ±ãã¡ã€ã³ã¹ã¬ããïŒãœãŒã¹JSã³ãŒããèªã¿åãããããã³ã³ãã€ã«ããŠå®è¡ããŸãã
- ã¡ã€ã³ã¹ã¬ããã®å®è¡äžã«ã³ãŒããæé©åããã³ã³ãã€ã«ã¹ã¬ããã
- ãããã¡ã€ã©ãŒã®ãããŒãããã°ã©ã ãæãå€ãã®æéãè²»ããã¡ãœããã«ã€ããŠã·ã¹ãã ã«éç¥ããŸãããã®çµæãCrankshaftã¯ãããã®ã¡ãœãããæé©åã§ããŸãã
- ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã¡ã«ããºã ããµããŒãããããã€ãã®ã¹ã¬ããã
JSã³ãŒãã®æåã®å®è¡æã«ãV8ã¯å®å šãªcodegenã³ã³ãã€ã©ãŒã䜿çšããŸãããã®ã³ã³ãã€ã©ãŒã¯ãè¿œå ã®å€æãªãã§ã解æããJavaScriptã³ãŒãããã·ã³ã³ãŒãã«çŽæ¥å€æããŸãã ããã«ããããã·ã³ã³ãŒãã®å®è¡ããã°ããéå§ã§ããŸãã V8ã¯ããã°ã©ã ã®äžéãã€ãã³ãŒãè¡šçŸã䜿çšããªããããã€ã³ã¿ãŒããªã¿ãŒã¯äžèŠã§ãã
ã³ãŒãããã°ããå®è¡ãããåŸããããã¡ã€ã©ãŒã¹ããªãŒã ã¯ååãªããŒã¿ãåéãããããã·ã¹ãã ã¯æé©åããå¿ èŠã®ããã¡ãœãããææ¡ã§ããŸãã
次ã«ãå¥ã®ã¹ã¬ããã§ãæé©åã¯ã¯ã©ã³ã¯ã·ã£ããããå§ãŸããŸãã éçãªåäžå²ãåœãŠïŒSSAïŒã¢ãã«ã䜿çšããŠãæœè±¡JavaScriptæ§æããªãŒãé«ã¬ãã«ã®è¡šçŸã«å€æããŸãã ãã®ãã¥ãŒã¯ãæ°ŽçŽ ãšåŒã°ããŸãã ã¯ã©ã³ã¯ã·ã£ããã¯ãæ°ŽçŽ å¶åŸ¡ãããŒã°ã©ãã®æé©åãè©Šã¿ãŸãã ã»ãšãã©ã®æé©åã¯ãã®ã¬ãã«ã§å®è¡ãããŸãã
åã蟌ã¿ã³ãŒã
ããã°ã©ã ã®æåã®æé©åã¯ãå¯èœãªéãå€ãã®ã³ãŒããäºåã«åŒã³åºãå Žæã«çµ±åããããšã§ãã åã蟌ã¿ã³ãŒããšã¯ãé¢æ°åŒã³åºãã³ãã³ãïŒé¢æ°ãåŒã³åºãããè¡ïŒãæ¬æã«çœ®ãæããããã»ã¹ã§ãã ãã®ç°¡åãªæé ã«ããã次ã®æé©åãããçç£çã«ããããšãã§ããŸãã
![](https://habrastorage.org/getpro/habr/post_images/05d/a01/726/05da01726cdd03f6d9336bd1d1e49c2e.png)
é¢æ°åŒã³åºãã¯ãã®æ¬äœã«çœ®ãæããããŸã
é衚瀺ã®ã¯ã©ã¹
JavaScriptã¯ãããã¿ã€ãããŒã¹ã®èšèªã§ããã¯ã©ã¹ã¯ãããŸããã ããã®ãªããžã§ã¯ãã¯ãã¯ããŒã³äœæããã»ã¹ã䜿çšããŠäœæãããŸãã ããã«ãJSã¯åçããã°ã©ãã³ã°èšèªã§ããã€ãŸãããªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããåŸãæ°ããããããã£ãè¿œå ããããæ¢åã®ããããã£ãåé€ãããã§ããŸãã
ã»ãšãã©ã®JSã€ã³ã¿ãŒããªã¿ãŒã¯ãïŒ ããã·ã¥é¢æ°ã®äœ¿çšã«åºã¥ãïŒèŸæžã®ãããªæ§é ã䜿çšããŠããªããžã§ã¯ãã®ããããã£å€ã®å Žæã«é¢ããæ å ±ãã¡ã¢ãªã«ä¿åããŸãã ãã®ãããªæ§é ã䜿çšãããšãJavaãCïŒãªã©ã®éåçèšèªãããJavaScriptã§ããããã£å€ãååŸããã®ãé£ãããªããŸãã ããšãã°ãJavaã§ã¯ããªããžã§ã¯ãã®ãã¹ãŠã®ããããã£ã¯ãããã°ã©ã ã®ã³ã³ãã€ã«åŸã«å€æŽãããªããªããžã§ã¯ãåè·¯ã«ãã£ãŠæ±ºå®ãããåçã«è¿œå ãŸãã¯åé€ããããšã¯ã§ããŸããïŒCïŒã«ã¯åçåãããããšã«æ³šæããå¿ èŠããããŸãããããã§ã¯ç¡èŠã§ããŸãïŒã ãã®çµæãããããã£å€ïŒãŸãã¯ãããã®ããããã£ãžã®ãã€ã³ã¿ïŒã¯ãã¡ã¢ãªå ã®é£ç¶ãããããã¡ãšããŠãåºå®ãªãã»ããã§ä¿åã§ããŸãã ãªãã»ããã¹ãããã¯ããããã£ã®ã¿ã€ãã«åºã¥ããŠç°¡åã«æ±ºå®ã§ããŸãããJavaScriptã§ã¯ããã°ã©ã ã®å®è¡äžã«ããããã£ã®ã¿ã€ããå€ããå¯èœæ§ããããããããã¯äžå¯èœã§ãã
èŸæžã䜿çšããŠã¡ã¢ãªå ã®ãªããžã§ã¯ãããããã£ã®ã¢ãã¬ã¹ãææ¡ããã®ã¯éåžžã«éå¹ççã§ãããããV8ã¯ä»£ããã«å¥ã®ã¡ãœããã䜿çšããŸãïŒé ãã¯ã©ã¹ é衚瀺ã¯ã©ã¹ã¯ãå®è¡æã«äœæãããããšãé€ããŠãJavaãªã©ã®å žåçãªãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã®éåžžã®ã¯ã©ã¹ã«äŒŒãŠããŸãã 次ã®äŸã䜿çšããŠããããã©ã®ããã«æ©èœããããèŠãŠã¿ãŸãããã
function Point(x, y) { this.x = x; this.y = y; } var p1 = new Point(1, 2);
new Point(1, 2)
åŒã³åºããçºçãããšãV8ã¯é衚瀺ã®ã¯ã©ã¹
C0
äœæããŸãã
![](https://habrastorage.org/web/3d0/84e/665/3d084e665eff4c868f6abc09a6cb5cf1.jpg)
æåã®é衚瀺ã¯ã©ã¹C0
ãããŸã§ã®ãšãããã³ã³ã¹ãã©ã¯ã¿ãŒãå®è¡ãããåã§ãã
Point
ãªããžã§ã¯ãã«ã¯ããããã£ããªããããã¯ã©ã¹
C0
空ã§ãã
Point
é¢æ°ã®æåã®ã³ãã³ããå®è¡ããããšããã«ãV8ã¯
C0
åºã¥ã2çªç®ã®é ãã¯ã©ã¹
C1
ãäœæããŸãã
C1
ã¯ãããããã£
x
ãèŠã€ããã¡ã¢ãªå ã®äœçœ®ïŒãªããžã§ã¯ããã€ã³ã¿ãåºæºãšããïŒã瀺ããŸãã ãã®å Žåãããããã£xã¯ãªãã»ãã 0ã«æ ŒçŽãããŸããã€ãŸããã¡ã¢ãªå ã®
Point
ãªããžã§ã¯ããé£ç¶ãããã¡ãŒãšèŠãªãå Žåãæåã®ãªãã»ããã¯ããããã£
x
察å¿ããŸãã ããã«ãV8ã¯ã¯ã©ã¹
C1
ãžã®é·ç§»ã«é¢ããæ å ±ãã¯ã©ã¹
C0
è¿œå ããŸããããã¯ãããããã£
x
ã
Point
ãªããžã§ã¯ãã«è¿œå ãããå Žåãé衚瀺ã®ã¯ã©ã¹ã
C0
ãã
C1
å€æŽããå¿ èŠãããããšã瀺ããŸãã äžã®å³ã«ç€ºãããã«ã
Point
ãªããžã§ã¯ãã®é衚瀺ã¯ã©ã¹ã¯ã
1
ã¯ã©ã¹ã«ãªããŸããã
![](https://habrastorage.org/web/4f8/210/0d4/4f82100d46b84183a50a626111de2c5f.jpg)
ãªããžã§ã¯ãã«æ°ããããããã£ãè¿œå ããããã³ã«ãæ°ããé衚瀺ã¯ã©ã¹ãžã®ç§»è¡ã«é¢ããæ å ±ãå€ãé衚瀺ã¯ã©ã¹ã«è¿œå ãããŸãã é衚瀺ã®ã¯ã©ã¹éã®é·ç§»ã¯ãåãããã«äœæããããªããžã§ã¯ããåãé衚瀺ã®ã¯ã©ã¹ãæã€ããšãã§ãããããéèŠã§ãã 2ã€ã®ãªããžã§ã¯ãã«å ±éã®é衚瀺ã¯ã©ã¹ããããåãããããã£ãè¿œå ãããå Žåãé·ç§»ã«ãããäž¡æ¹ã®ãªããžã§ã¯ããåãæ°ããé衚瀺ã¯ã©ã¹ãšããã«ä»éãããã¹ãŠã®æé©åãããã³ãŒããåãåãããšãä¿èšŒãããŸãã
this.y = y
ã³ãã³ãã
this.y = y
ããã®ããã»ã¹ãç¹°ãè¿ã
this.y = y
ïŒããããäžèšã®ã³ãã³ãã§
x
ããããã£ãè¿œå ããåŸã
Point
é¢æ°å ã§è¡ãããŸãïŒã
ããã§ãæ°ããé衚瀺ã¯ã©ã¹
C2
ãäœæãããé·ç§»æ å ±ãã¯ã©ã¹
C1
è¿œå ãããŸããããã¯ã
y
ããããã£ã
Point
ãªããžã§ã¯ãïŒããã¯æ¢ã«
x
ããããã£ãå«ããªããžã§ã¯ãïŒã«è¿œå ããããšããªããžã§ã¯ãã®é衚瀺ã¯ã©ã¹ã
C2
![](https://habrastorage.org/web/80d/221/e49/80d221e494cc43cb8865b81df04be730.jpg)
ãªããžã§ã¯ãã«yããããã£ãè¿œå ããåŸã®C2ã¯ã©ã¹ã®äœ¿çšãžã®ç§»è¡
é衚瀺ã®ã¯ã©ã¹éã®é·ç§»ã¯ããªããžã§ã¯ãã«ããããã£ãè¿œå ãããé åºã«äŸåããŸãã ãã®ãµã³ãã«ã³ãŒããèŠãŠãã ããã
function Point(x, y) { this.x = x; this.y = y; } var p1 = new Point(1, 2); p1.a = 5; p1.b = 6; var p2 = new Point(3, 4); p2.b = 7; p2.a = 8;
åæ§ã®ç¶æ³ã§ããªããžã§ã¯ã
p1
ãš
p2
ãåãé ãã¯ã©ã¹ãšé ãã¯ã©ã¹ã®åãé·ç§»ããªãŒãæã€ãšä»®å®ã§ããŸãã ãã ããå®éã«ã¯ããã§ã¯ãããŸããã ãŸããããããã£
a
ãªããžã§ã¯ã
p1
ã«è¿œå ããã次ã«ããããã£
b
è¿œå ãããŸãã ããããã£
b
æåã«
p2
ã«è¿œå ããã次ã«
b
è¿œå ãããŸãã ãã®çµæããªããžã§ã¯ã
p1
ãš
p2
ã«ã¯ç°ãªãé衚瀺ã¯ã©ã¹ããããŸã-é衚瀺ã¯ã©ã¹éã®ç°ãªãé·ç§»ãã¹ã®çµæã§ãã ãã®ãããªå Žåãé ãããã¯ã©ã¹ãåå©çšã§ããããã«ãåçããããã£ãåãé åºã§åæåããããšããå§ãããŸãã
çµã¿èŸŒã¿ãã£ãã·ã¥
V8ã¯ãçµã¿èŸŒã¿ã®åŒã³åºããã£ãã·ã¥ãšåŒã°ããå¥ã®ææ³ã䜿çšããŠãåçã«åæå®ãããèšèªã®å®è¡ãæé©åããŸãã çµã¿èŸŒã¿ãã£ãã·ã¥ã¯ãåãã¡ãœããã®ç¹°ãè¿ãåŒã³åºããåãã¿ã€ãã®ãªããžã§ã¯ãã䜿çšããŠçºçããåŸåããããšãã芳å¯ã«åºã¥ããŠããŸãã 詳现ã«ã€ããŠã¯ã ãã¡ããã芧ãã ãã ã äžèšã®è³æãèªã¿ãªããããããæ·±ãæãäžããæéããªãå Žåã¯ãããã§çµã¿èŸŒã¿ãã£ãã·ã¥ã®æŠå¿µãç°¡åã«èª¬æããŸãã
ããã§ã¯ããããã¯ãã¹ãŠã©ã®ããã«æ©èœããŸããïŒ V8ã¯ãæè¿åŒã³åºãããã¡ãœããã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããªããžã§ã¯ãã¿ã€ãã®ãã£ãã·ã¥ãä¿æãããã®æ å ±ã䜿çšããŠãå°æ¥ãã©ã¡ãŒã¿ãŒãšããŠæž¡ããããªããžã§ã¯ãã®ã¿ã€ãã«é¢ããä»®å®ãè¡ããŸãã V8ãã¡ãœããã«æž¡ããããªããžã§ã¯ãã®ã¿ã€ãã«ã€ããŠæ£ããä»®å®ãç«ãŠãããšãã§ããå Žåããªããžã§ã¯ãã®ããããã£ã«ã¢ã¯ã»ã¹ããæ¹æ³ãèŠã€ããããã»ã¹ãã¹ããããã代ããã«ããªããžã§ã¯ãã®é衚瀺ã¯ã©ã¹ãžã®ä»¥åã®åŒã³åºãããä¿åãããæ å ±ã䜿çšã§ããŸãã
é ãã¯ã©ã¹ãšçµã¿èŸŒã¿ã®åŒã³åºããã£ãã·ã¥ã®æŠå¿µã¯ã©ã®ããã«é¢é£ããŠããŸããïŒ ãªããžã§ã¯ãã®ã¡ãœãããåŒã³åºããããšãV8ãšã³ãžã³ã¯ãç¹å®ã®ããããã£ã«ã¢ã¯ã»ã¹ããããã®ãªãã»ããã決å®ããããã«ããã®ãªããžã§ã¯ãã®é衚瀺ã¯ã©ã¹ã«ã¢ã¯ã»ã¹ããå¿ èŠããããŸãã åãé ãã¯ã©ã¹ãžã®åãã¡ãœããã®2åã®åŒã³åºãã«æåããåŸãV8ã¯é ãã¯ã©ã¹ã«ã¢ã¯ã»ã¹ããæäœãçç¥ããããããã£ã®ãªãã»ããã«é¢ããæ å ±ããªããžã§ã¯ããã€ã³ã¿ãŒèªäœã«è¿œå ããŸãã ä»åŸãã®ã¡ãœãããåŒã³åºããšãV8 ã¯é衚瀺ã¯ã©ã¹ãå€æŽãããŠããªããšæ³å®ããé衚瀺ã¯ã©ã¹ãžã®ä»¥åã®åŒã³åºãåŸã«ä¿åããããªãã»ããã䜿çšããŠãç¹å®ã®ããããã£ã®ã¡ã¢ãªã¢ãã¬ã¹ã«çŽæ¥ç§»åããŸãã ããã«ãããã³ãŒãã®å®è¡é床ãå€§å¹ ã«åäžããŸãã
ãã«ãã€ã³ã³ãŒã«ãã£ãã·ã³ã°ããåãã¿ã€ãã®ãªããžã§ã¯ããå ±æã®é衚瀺ã¯ã©ã¹ã䜿çšããããšãéåžžã«éèŠãªçç±ã§ãã åãã¿ã€ãã®2ã€ã®ãªããžã§ã¯ããäœæããŸãããç°ãªãé ãã¯ã©ã¹ïŒäžèšã®äŸã®ããã«ïŒã䜿çšãããšãV8ã¯çµã¿èŸŒã¿ãã£ãã·ã¥ã䜿çšã§ããŸããããªããžã§ã¯ããåãã¿ã€ãã§ãã£ãŠãã察å¿ããé ãã¯ã©ã¹ã«ã¯ç°ãªããªãã»ãããå²ãåœãŠãããããã§ããããããã£ã
![](https://habrastorage.org/web/c28/006/adf/c28006adf58644e19ca0487ca318dfdd.jpg)
åãã¿ã€ãã®ãªããžã§ã¯ãã衚瀺ãããŸããããããã®ããããã£aãšbã¯ç°ãªãé åºã§äœæãããç°ãªããªãã»ãããæã£ãŠããŸãã
ãã·ã³ã³ãŒããžã®ã³ã³ãã€ã«
æ°ŽçŽ ã°ã©ããæé©åããããšãã¯ã©ã³ã¯ã·ã£ããã¯ããããªããŠã ãšåŒã°ããäœã¬ãã«ã®ãã¥ãŒã«å€æããŸãã ã»ãšãã©ã®ãªããŠã å®è£ ã¯ãã·ã¹ãã ã¢ãŒããã¯ãã£ã«äŸåããŠããŸãã ããšãã°ããã®ã¬ãã«ã§ã¯ãã¬ãžã¹ã¿ãå²ãåœãŠãããŸãã
ãã®çµæããªããŠã è¡šçŸã¯ãã·ã³ã³ãŒãã«ã³ã³ãã€ã«ãããŸãã 次ã«ããªã³ã¹ã¿ãã¯äº€æïŒOSRïŒãšåŒã°ããåŠçãè¡ãããŸãã ããã°ã©ã ãå€ãã®æéãè²»ããã¡ãœãããã³ã³ãã€ã«ããã³æé©åããåã«ãæé©åãããŠããªããªãã·ã§ã³ã䜿çšããå¿ èŠããããŸãã 次ã«ãäœæ¥ãäžæããããšãªããV8ã¯ã³ã³ããã¹ãïŒã¹ã¿ãã¯ãã¬ãžã¹ã¿ãŒïŒãå€æãããããæé©åãããããŒãžã§ã³ã®ã³ãŒãã«åãæ¿ããããšãã§ããŸãã ä»ã®æé©åã«å ããŠãV8ãæåã«ã³ãŒããåã蟌ãããšãèãããšãããã¯éåžžã«é£ããã¿ã¹ã¯ã§ãã ãããå®è¡ã§ãããšã³ãžã³ã¯V8ã ãã§ã¯ãããŸããã
æé©åã倱æããå Žåã¯ã©ããªããŸããïŒ ããã«å¯Ÿããä¿è·ããããŸã-ããããæé©å解é€ã ããã¯éå€æãç®çãšããŠããããšã³ãžã³ãšæé©åã®åºç€ã«ãã£ãŠè¡ãããä»®å®ãçŸå®ãšäžèŽããªããªã£ãå Žåã«ãã·ã¹ãã ãæé©åãããŠããªãã³ãŒãã®äœ¿çšã«æ»ããŸãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®å ŽåãV8ã¯åŸæ¥ã®ãããŒã¯ã¢ã³ãã¹ã€ãŒããç³»å³ã¢ãããŒãã䜿çšããŠãåäžä»£ã®ã³ãŒããããŒã¯ããã³ã¯ãªã¢ããŸãã ããŒãã³ã°æ®µéã§ã¯ãJavaScriptã®å®è¡ãåæ¢ããŸãã ã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠäœæãããã·ã¹ãã ã®è² è·ãå¶åŸ¡ããã³ãŒãã®å®è¡ãããå®å®ãããããã«ãV8ã¯ã€ã³ã¯ãªã¡ã³ã¿ã«ããŒãã³ã°ã¢ã«ãŽãªãºã ã䜿çšããŸãïŒããŒãå šäœããã€ãã¹ãã代ããã«ãããŒãã®äžéšã®ã¿ããã€ãã¹ããŠãå¯èœãªãã¹ãŠãããŒã¯ããããšããŸãã ãã®åŸãéåžžã®ã³ãŒãå®è¡ãåéãããŸãã ããŒãäžã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒã®æ¬¡ã®ãã¹ã¯ãåã®ã¬ããŒãžã³ã¬ã¯ã¿ãŒãçµäºãããšããããå§ãŸããŸãã ããã«ãããéåžžã®ã³ãŒãå®è¡äžã«éåžžã«çãäžæåæ¢ãå¯èœã«ãªããŸãã æ¢ã«è¿°ã¹ãããã«ãåã ã®ã¹ã¬ããã¯ã¡ã¢ãªã¯ãªãŒãã³ã°ãã§ãŒãºã«é¢äžããŠããŸãã
ç¹ç«ãšTurboFan
ä»å¹Žã®V8ããŒãžã§ã³5.9ã®ãªãªãŒã¹ã æ°ããã³ãŒãå®è¡ãã€ãã©ã€ã³ãå°å ¥ãããŸããã ããã«ããã®ãã€ãã©ã€ã³ã䜿çšãããšããã¹ãã§ã¯ãªãå®éã®JavaScriptã¢ããªã±ãŒã·ã§ã³ã§ãããã©ãŒãã³ã¹ã®å€§å¹ ãªåäžãšå€§å¹ ãªã¡ã¢ãªç¯çŽãå®çŸã§ããŸãã
æ°ããã·ã¹ãã ã¯ãIngnitionã€ã³ã¿ãŒããªã¿ãŒãšææ°ã®TurboFanæé©åã³ã³ãã€ã©ãŒã«åºã¥ããŠããŸãã ãããã®æ°ããV8ã¡ã«ããºã ã®è©³çŽ°ã¯ã ãã®èšäºã«èšèŒãããŠããŸãã
V8 5.9ã®ãªãªãŒã¹ã«äŒŽããå®å šãªã³ãŒãçæãšã¯ã©ã³ã¯ã·ã£ããïŒ2010幎以éV8ã§äœ¿çšãããŠãããã¯ãããžãŒïŒã¯é©çšãããªããªããŸãã V8ããŒã ã¯æ°ããããŒã«ãéçºããæ°ããJavaScriptæ©èœã«å¯Ÿå¿ãããããã®æ©èœããµããŒãããããã«å¿ èŠãªæé©åãå®è£ ããããšããŠããŸãã æ°ãããã¯ãããžãŒãžã®ç§»è¡ãšå€ãã¡ã«ããºã ã®ãµããŒãã®æåŠã¯ãããã·ã³ãã«ã§ç®¡çããããã¢ãŒããã¯ãã£ãŒã«åããV8ã®éçºãæå³ããŸãã
![](https://habrastorage.org/getpro/habr/post_images/73e/e4a/0c4/73ee4a0c446f749e046cf7ac43e65678.png)
JSã®ãã©ãŠã¶ãŒãšãµãŒããŒã®ãŠãŒã¹ã±ãŒã¹ã®ããã©ãŒãã³ã¹ãã³ãããŒã¯ã®æ¹å
ãããã®æ¹åã¯ã»ãã®å§ãŸãã«ãããŸããã æ°ããIgnitionããã³TurboFanããŒã¹ã®ã³ãŒãå®è¡ãã€ãã©ã€ã³ã¯ãJavaScriptã®ããã©ãŒãã³ã¹ãæ¹åããV8ãããçµæžçã«ãããããªãæé©åãžã®æãéããŸãã
V8ã®æ©èœã®äžéšã確èªããã³ãŒããæé©åããããã®ãã³ããæäŸããŸãã ã¡ãªã¿ã«ããã®ãã¹ãŠã¯ãäžã§èª¬æããå 容ããæšæž¬ããããšãã§ããŸãã
V8ã®Javascriptæé©åã¢ãããŒã
- ãªããžã§ã¯ãã®ããããã£ã®é åº ã ãªããžã§ã¯ãã®ããããã£ã¯åžžã«åãé åºã§åæåããŸãã ããã¯ãåãé衚瀺ãªããžã§ã¯ããåãé衚瀺ã¯ã©ã¹ã䜿çšãããã®çµæãæé©åãããã³ãŒãã䜿çšããããã«å¿
èŠã§ãã
- åçãããã㣠ã ãªããžã§ã¯ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããåŸã«ãªããžã§ã¯ãã«ããããã£ãè¿œå ãããšãé衚瀺ã®ã¯ã©ã¹ãå€æŽããããªããžã§ã¯ãã§ä»¥åã«äœ¿çšãããŠããé衚瀺ã®ã¯ã©ã¹ã«å¯ŸããŠæé©åãããã¡ãœãããé
ããªããŸãã ããããã£ãåçã«è¿œå ãã代ããã«ããªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§ããããã£ãå²ãåœãŠãŸãã
- æ¹æ³ åãã¡ãœãããè€æ°ååŒã³åºãã³ãŒãã¯ãè€æ°ã®ç°ãªãã¡ãœããã1ååŒã³åºãã³ãŒããããé«éã«å®è¡ãããŸãïŒçµã¿èŸŒã¿ãã£ãã·ã¥ã®ããïŒã
- é
å ããŒãé£ç¶çªå·ã§ã¯ãªãã¹ããŒã¹é
åãé¿ããŸãã ã¹ããŒã¹é
åãã€ãŸãèŠçŽ ã®äžéšãæ¬ èœããŠããé
åã¯ãããã·ã¥ããŒãã«ãšããŠã·ã¹ãã ã«ãã£ãŠåŠçãããŸãã ãã®ãããªé
åã®èŠçŽ ã«ã¢ã¯ã»ã¹ããã«ã¯ãããå€ãã®ã³ã³ãã¥ãŒãã£ã³ã°ãªãœãŒã¹ãå¿
èŠã§ãã ããã«ã倧èŠæš¡ãªé
åã®ã¡ã¢ãªã®æ©æå²ãåœãŠãé¿ããããã«ããŠãã ããã å¿
èŠã«å¿ããŠãµã€ãºã倧ãããããšããã§ãããã æåŸã«ãé
åå
ã®èŠçŽ ãåé€ããªãã§ãã ããã ãã®ããããããã¯ãŸã°ããªé
åã«ãªããŸãã
- çªå· V8ã¯ã32ãããã䜿çšããŠãªããžã§ã¯ããžã®æ°å€ãšãã€ã³ã¿ãŒãè¡šããŸãã 1ãããã䜿çšããŠã32ãããå€ããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒïŒãã©ã°-1ïŒã§ããããæŽæ°ïŒãã©ã°-0ïŒã§ããããå€å¥ããŸããããã¯ãå°æŽæ°ïŒSMall IntegerãSMIïŒãšåŒã°ããŸãããã®é·ãã31ãããã§ããããšã æ°å€ã®ä¿åã«31ããã以äžãå¿
èŠãªå ŽåãV8ã¯æ°å€ãããã¯ããŠå粟床æ°å€ã«å€æãããã®æ°å€ãæ ŒçŽããæ°ãããªããžã§ã¯ããäœæããŸãã æ°å€ãJSãªããžã§ã¯ãã«ãããã³ã°ããé¢åãªæäœãé¿ããããã«ãå¯èœãªéã31ãããã®ç¬Šå·ä»ãæ°å€ã䜿çšããããã«ããŠãã ããã
ãŸãšã
SessionStackã§ã¯ãJSã³ãŒããèšè¿°ããéã«äžèšã®ååã«åŸãããåªããŠããŸãã V8ã®å éšã¡ã«ããºã ãã©ã®ããã«æ©èœããããå°ãç解ããäžèšã®å 容ãèæ ®ããŠãããã°ã©ã ã®å質ãšããã©ãŒãã³ã¹ãæ¹åã§ããããšãé¡ã£ãŠããŸãã
芪æãªãèªè ïŒ JSã³ãŒããæé©åããããã®ãã³ããæããŠãã ããã