Node.jsã¯ãåœåããV8 JSãšã³ãžã³ã«äŸåããŠãããV8 JSãšã³ãžã³ã¯èª°ããç¥ã£ãŠãããæããèšèªã³ãã³ãã®å®è¡ãæäŸããŸãã V8ã¯ãGoogleãChromeãã©ãŠã¶ãŒçšã«äœæããJavaScriptä»®æ³ãã·ã³ã§ãã åœåãããå°ãªããšã競åãšã³ãžã³ãããé«éãªJavaScriptãå®çŸããããã«V8ãäœæãããŸããã 匷ãåä»ãã®ãªãåçèšèªã®å Žåãé«ãããã©ãŒãã³ã¹ãå®çŸããã®ã¯ç°¡åãªããšã§ã¯ãããŸããã V8ããã³ãã®ä»ã®ãšã³ãžã³ã¯ããã®åé¡ãããè¯ããããè¯ã解決ããŠããŸãã ãã ããæ°ãããšã³ãžã³ã¯ãJSå®è¡ã®é床ãäžãããã ãã§ã¯ãããŸããã ããã¯ãã³ãŒãæé©åãžã®æ°ããã¢ãããŒãã®å¿
èŠæ§ã§ããããŸãã ä»æ¥æéã ã£ããã¹ãŠãå°æ¥æ倧ã®ããã©ãŒãã³ã¹ã§ç§ãã¡ãåã°ããããã§ã¯ãããŸããã é
ããšã¿ãªããããã¹ãŠãããã§ãããšã¯éããŸããã
TurboFan V8ã®ä»æ§ã¯ã³ãŒãã®æé©åã«ã©ã®ããã«åœ±é¿ããŸããïŒ è¿ãå°æ¥ã«èªåèªèº«ã瀺ãããã«ãä»æ¥ã®æè¡ã¯ã©ã®ããã«æé©ãšèããããŠããŸããïŒ æè¿ã®V8ããã©ãŒãã³ã¹ãã©ãŒã¯ã©ã®ããã«åäœããŸããïŒãŸãããããã«äœãæåŸ
ã§ããŸããïŒ ãã®è³æã§ã¯ããããããã³ä»ã®å€ãã®è³ªåã«å¯ŸããçããèŠã€ããããšããŸããã
ããããã»ããŒã¯ã»ã¯ã¬ã¡ã³ããš
ããããªã»ã³ãªãŒãã®å
±åäœæ¥ã®ææã
ããã«ãããŸãã çŽ æã¯ãV8éçºããŒã ã®
Francis Hinkelmannãš
Benedict Meirerã«ãã£ãŠç¢ºèªãããŸããã

JavaScriptãé«éã§å®è¡ã§ããV8ãšã³ãžã³ã®äžå¿éšåã¯ãJITïŒJust In TimeïŒã³ã³ãã€ã©ãŒã§ãã å®è¡æã«ã³ãŒããæé©åã§ããåçã³ã³ãã€ã©ãŒã§ãã V8ãæåã«äœæããããšããJITã³ã³ãã€ã©ãŒã¯FullCodeGenãšåä»ããããŸãããããã¯ïŒ
Yang Guoãæ£ããè¿°ã¹ãŠããããã«ïŒãã®ãã©ãããã©ãŒã ã®æåã®æé©åã³ã³ãã€ã©ãŒã§ãã 次ã«ãV8ããŒã ã¯Crankshaftã³ã³ãã€ã©ãäœæããŸãããããã«ã¯ãFullCodeGenã«ã¯å®è£
ãããŠããªãå€ãã®ããã©ãŒãã³ã¹æé©åãå«ãŸããŠããŸããã
90幎代ããJavaScriptãèŠãŠããã£ãšäœ¿ã£ãŠãã人ãšããŠãã©ã®ãšã³ãžã³ã«é¢ä¿ãªããJSã³ãŒãã®ã©ã®ã»ã¯ã·ã§ã³ãåäœãé
ããããã«å®å
šã«éèªæã«ãªãããšããã°ãã°ããããšã«æ°ä»ããŸããã䜿çšãããŸãã ããã°ã©ã ãäºæ³ãããé
ãå®è¡ãããçç±ã¯ããã°ãã°ç解ããã®ãå°é£ã§ããã
è¿å¹ŽãMatteo Collinaãšç§ã¯ãNode.jsã®é«æ§èœã³ãŒããèšè¿°ããæ¹æ³ãèŠã€ããããšã«çŠç¹ãåœãŠãŠããŸããã åœç¶ãããã¯ãV8 JSãšã³ãžã³ã«ãã£ãŠã³ãŒããå®è¡ããããšãã«ãã©ã®ã¢ãããŒããé«éã§ãã©ã®ã¢ãããŒããé
ãããç¥ãããšãæå³ããŸãã
V8ããŒã ãæ°ããJITã³ã³ãã€ã©ãŒTurboFanãäœæããã®ã§ãä»åºŠã¯ããã©ãŒãã³ã¹ã«é¢ãããã¹ãŠã®åææ¡ä»¶ã確èªããŸãã
æé©åã³ã³ãã€ã«ã®æŸæ£ã«ã€ãªãããããç¥ããããœãããŠã§ã¢æ§æãæ€èšããŸãã ããã«ãããã§ã¯ãããŸããŸãªããŒãžã§ã³ã®V8ã®ããã©ãŒãã³ã¹ãç 究ããããšãç®çãšãããããè€éãªç 究ââãæ±ããŸãã ããã¯ãã¹ãŠãç°ãªãããŒãžã§ã³ã®Nodeããã³V8ã䜿çšããŠèµ·åãããäžé£ã®ãã€ã¯ããã³ãããŒã¯ãéããŠè¡ãããŸãã
ãã¡ãããV8çšã«ã³ãŒããæé©åããåã«ãæåã«APIãã¢ã«ãŽãªãºã ãããã³ããŒã¿æ§é ã®èšèšã«çŠç¹ãåãããå¿
èŠããããŸãã ãããã®ãã€ã¯ããã³ãããŒã¯ã¯ãNodeã§ã®JavaScriptã®ããã©ãŒãã³ã¹ãã©ã®ããã«å€åããŠãããã瀺ãææšãšèŠãªãããšãã§ããŸãã ãããã®ã€ã³ãžã±ãŒã¿ãŒã䜿çšããŠãã³ãŒãã®å
šäœçãªã¹ã¿ã€ã«ãšãéåžžã®æé©åãé©çšããåŸã«ããã©ãŒãã³ã¹ãæ¹åããæ¹æ³ãå€æŽã§ããŸãã
ããŒãžã§ã³V8 5.1ã5.8ã5.9ã6.0ãããã³6.1ã®ãã€ã¯ããã³ãããŒã¯ã®ããã©ãŒãã³ã¹ãæ€èšããŸãã
V8ããŒãžã§ã³ãšNodeããŒãžã§ã³ã®é¢ä¿ãæ確ã«ããããã«ã次ã®ç¹ã«æ³šæããŠãã ãããV85.1ãšã³ãžã³ã¯Node 6ã§äœ¿çšãããCrankshaft JITã³ã³ãã€ã©ã¯ããã§äœ¿çšãããV8 5.8ãšã³ãžã³ã¯NodeããŒãžã§ã³8.0ã8.2ã§äœ¿çšãããCrankshaftã¯ããã§äœ¿çšãããŸããã¿ãŒããã¡ã³ã
çŸåšãããŒã8.3ããŸãã¯ãããã8.4ã«ã¯ãV8ãšã³ãžã³ããŒãžã§ã³5.9ãŸãã¯6.0ãååšããããšãäºæ³ãããŸãã ãã®èšäºã®å·çæç¹ã§ã®V8ã®ææ°ããŒãžã§ã³ã¯6.1ã§ãã
node-v8å®éšãªããžããªã®Nodeã«çµ±åãããŠããŸãã èšãæããã°ãV8 6.1ã¯Nodeã®å°æ¥ã®ããŒãžã§ã³ã§äœ¿çšãããããšã«ãªããŸãã
ãã®èšäºã®æºåã§äœ¿çšããããã¹ãã³ãŒããšãã®ä»ã®è³æã¯ã
ããã«ãããŸããããã¯ãç¹ã«æªåŠçã®ãã¹ãçµæãããããã¥ã¡ã³ãã§ãã
ã»ãšãã©ã®ãã€ã¯ããã³ãããŒã¯ã¯ãMacbook Pro 2016ã3.3 GHz Intel Core i7ã16 GB 2133 MHz LPDDR3ã¡ã¢ãªã§å®è¡ãããŸãã ãããã®äžéšïŒæ°å€ã®æäœããªããžã§ã¯ãã®ããããã£ã®åé€ïŒã¯ãMacBook Pro 2014ã3 GHz Intel Core i7ã16 GB 1600 MHz DDR3ã¡ã¢ãªã§å®è¡ãããŸããã Node.jsã®ç°ãªãããŒãžã§ã³ã®ããã©ãŒãã³ã¹æž¬å®ã¯ãåãã³ã³ãã¥ãŒã¿ãŒã§å®è¡ãããŸããã ä»ã®ããã°ã©ã ããã¹ãçµæã«åœ±é¿ããªãããšã確èªããŸããã
ãã¹ããèŠãŠãçµæãå°æ¥ã®ããŒãã«ãšã£ãŠäœãæå³ãããã«ã€ããŠè©±ããŸãããã ãã¹ãŠã®ãã¹ãã¯ã
benchmark.jsããã±ãŒãžã䜿çšããŠå®è¡ãããŸãããåå³ââã®ããŒã¿ã¯ã1ç§ãããã®æäœæ°ã瀺ããŠããŸããã€ãŸããå€ã倧ããã»ã©åªããŠããŸãã
åé¡ãè©Šã/ãã£ãããã
ããç¥ãããŠããæé©å解é€ãã¿ãŒã³ã®1ã€ã¯ã
try/catch
ãããã¯ã䜿çšããããšã§ãã
以äžããã¹ãã®èª¬æã®ãªã¹ãã®æ¬åŒ§å
ã«ãè±èªã®çããã¹ãåãèšèŒãããŠããããšã«æ³šæããŠãã ããã ãããã®ååã¯ããã£ãŒãã§çµæã瀺ãããã«äœ¿çšãããŸãã ããã«ããã¹ãäžã«äœ¿çšãããã³ãŒããããã²ãŒãããã®ã«åœ¹ç«ã¡ãŸãã
ãã®ãã¹ãã§ã¯ã4ã€ã®ãã¹ãã±ãŒã¹ãæ¯èŒããŸãã
- ãã®äžã«ãã
try/catch
èšç®ãå®è¡ããé¢æ°ïŒsum with tr catchïŒã
try/catch
ãããã¯ãªãã§èšç®ãå®è¡ããé¢æ°ïŒtry catchãªãã®åèšïŒã
try
ïŒsum wrappedïŒãããã¯å
ã§èšç®ãå®è¡ããé¢æ°åŒã³åºãã
try/catch
ã䜿çšããã«èšç®ãå®è¡ããé¢æ°åŒã³åºãïŒåèšé¢æ°ïŒã
â
GitHubã§ã³ãŒãããã¹ããã
try/catch
ããã©ãŒãã³ã¹ãžã®æªåœ±é¿ã«ã€ããŠæ¢ã«ç¥ãããŠããããšãNode 6ïŒV8 5.1ïŒã§ç¢ºèªãããŠãããNode 8.0-8.2ïŒV8 5.8ïŒ
try/catch
ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ã¯ããã«å°ããããšãããããŸãã
ãŸãã
try
ãããã¯ããé¢æ°ãåŒã³åºãããšã¯ã
try
å€éšã§åŒã³åºããããã¯ããã«é
ãããšã«æ³šæããå¿
èŠããããŸããããã¯ãããŒã6ïŒV8 5.1ïŒããã³ããŒââã8.0-8.2ïŒV8 5.8ïŒã®äž¡æ¹ã«åœãŠã¯ãŸããŸãã
ãã ããããŒã8.3+ã§ã¯ã
try
ãããã¯ããé¢æ°ãåŒã³åºããŠãããã©ãŒãã³ã¹ã«ã¯ã»ãšãã©åœ±é¿ããŸããã
ããã«ãããããããèœã¡çããªãã§ãã ããã æé©åã»ãããŒã®ããã€ãã®è³æã«åãçµãã§ããéã«ãããªãç¹å®ã®ç¶æ³ãTurboFanã§ã®æé©å解é€/åæé©åã®ç¡éã®ãµã€ã¯ã«ã«ã€ãªããå¯èœæ§ãããå Žåã«
ãšã©ãŒãçºèŠã
ãŸããã ããã¯ã次ã®ããã©ãŒãã³ã¹ãã©ãŒãã¿ãŒã³ãšèããããŸãã
ãªããžã§ã¯ãããããããã£ãåé€ãã
é·å¹Žã«ããããJSã§é«æ§èœã³ãŒããèšè¿°ããã人ã¯ã ãã§ãïŒå°ãªããšããããã°ã©ã ã®æãè² è·ã®é«ãéšåã«æé©ãªã³ãŒããèšè¿°ããå¿
èŠãããå ŽåïŒã
delete
ã³ãã³ãã¯åé¿ãããŠããŸããã
delete
ã®åé¡ã¯ãV8ãJavaScriptãªããžã§ã¯ãã®åçãªæ§è³ªãåŠçããæ¹æ³ãšãäœã¬ãã«ã®ãšã³ãžã³å®è£
ã§ã®ããããã£ã®æ€çŽ¢ãè€éã«ãããããã¿ã€ããã§ãŒã³ïŒæœåšçã«åçïŒã«èµ·å ããŸãã
ããããã£ãæã€é«æ§èœãªããžã§ã¯ããäœæããV8ãšã³ãžã³ã®ã¢ãããŒãã¯ããªããžã§ã¯ãã®ããã©ãŒã ããã€ãŸããªããžã§ã¯ããæã€ããŒãšå€ïŒãããã¿ã€ããã§ãŒã³ã®ããŒãšå€ãå«ãïŒã«åºã¥ããŠãC ++ã¬ãã«ã§ã¯ã©ã¹ãäœæããããšã§ãã ãããã®æ§é ã¯ããé ãã¯ã©ã¹ããšããŠç¥ãããŠããŸãã ãã ãããã®ã¿ã€ãã®æé©åã¯ããã°ã©ã ã®å®è¡äžã«å®è¡ãããŸãã ãªããžã§ã¯ãã®åœ¢ç¶ãäžæãªå ŽåãV8ã«ã¯å¥ã®ããããã£æ€çŽ¢ã¢ãŒãããããŸãïŒããã·ã¥ããŒãã«æ€çŽ¢ã ãã®ãããªããããã£æ€çŽ¢ã¯éåžžã«é
ããªããŸãã
åŸæ¥ã
delete
ã³ãã³ãã䜿çšããŠãªããžã§ã¯ãããããŒãåé€ããå Žåãããããã£ã«ã¢ã¯ã»ã¹ããåŸç¶ã®æäœã¯ãããã·ã¥ããŒãã«ãæ€çŽ¢ããŠå®è¡ãããŸãã ãã®ãããããã°ã©ããŒã¯
delete
ã³ãã³ãã䜿çšããã代ããã«ããããã£ã
undefined
ã«èšå®ããŸããå€ãç Žå£ãããšããç¹ã§ã¯ãåãçµæã«ãªããŸãããããããã£ã®ååšã確èªããéã«è€éããå¢ããŸãã ãã ããéåžžããã®ã¢ãããŒãã¯ãããšãã°
JSON.stringify
åºåã«
undefined
å€ãå«ãŸã
undefined
ããïŒJSONä»æ§ã«ãããš
undefined
ã¯æå¹ãªå€ã«é©çšãããªãããïŒãã·ãªã¢ã«åã®ããã«ãªããžã§ã¯ããæºåãããšãã«ååã§ãã
ããã§ãæ°ããTurboFanå®è£
ããªããžã§ã¯ãããããããã£ãåé€ããåé¡ã解決ãããã©ããã調ã¹ãŸãããã
ããã§ã¯ã3ã€ã®ãã¹ãã±ãŒã¹ãæ¯èŒããŸãã
- ããããã£ã
undefined
èšå®ãããåŸã®ãªããžã§ã¯ãã®undefined
ïŒ undefined
èšå®ïŒã
delete
ïŒdeleteïŒã³ãã³ãã䜿çšããŠããããã£ãåé€ããåŸã®ãªããžã§ã¯ãã®ã·ãªã¢ã«åã
delete
ã³ãã³ããæåŸã«è¿œå ãããããããã£ãåé€ããããã«äœ¿çšãããåŸã«ãªããžã§ã¯ããã·ãªã¢ã«åããïŒæåŸã®ããããã£ãåé€ããïŒã
â
GitHubã§ã³ãŒãããã¹ããã
V8 6.0ããã³6.1ïŒããŒããªãªãŒã¹ã§ã¯ãŸã 䜿çšãããŠããŸããïŒã§ã¯ããªããžã§ã¯ãã«æåŸã«è¿œå ãããããããã£ãåé€ãããšãããã°ã©ã å®è¡ã®æé©åãããTurboFanãã¹ã«å¯Ÿå¿ãããããããããã£ã
undefined
èšå®ãããããé«éã§ãã ããã¯ãV8éçºããŒã ã
delete
ã³ãã³ãã®ããã©ãŒãã³ã¹ã®æ¹åã«åãçµãã§ããããšã瀺ããŠãããããéåžžã«åªããŠããŸãã
ãã ãããã®æŒç®åã䜿çšãããšãè¿œå ãããããããã£ã®æåŸã§ã¯ãªãããããã£ããªããžã§ã¯ãããåé€ãããå Žåãããããã£ã«ã¢ã¯ã»ã¹ãããšãã«æ·±å»ãªããã©ãŒãã³ã¹ã®äœäžã«ã€ãªãããŸãã ãã®èŠ³å¯ã¯
Jacob Kummerovã«ãã£ãŠå©ããããŸãã
ãJacobKummerovã¯ãæåŸã«è¿œå ãããããããã£ãåé€ãããªãã·ã§ã³ã®ã¿ã調æ»ããããã¹ãã®ç¹ç°æ§ãææããŸããã 圌ã«æè¬ããŸãã ãã®çµæã
delete
ã³ãã³ãã¯å°æ¥ã®NodeãªãªãŒã¹çšã«èšè¿°ãããã³ãŒãã§ã©ãã ã䜿çšã§ãããŸã䜿çšãã¹ãã ãšèšã£ãŠãããããè¡ããªãããšããå§ãããŸãã
delete
ã³ãã³ãã¯åŒãç¶ãããã©ãŒãã³ã¹ã«æªåœ±é¿ãåãŒããŸãã
ãªãŒã¯ãšåŒæ°ã®é
åãžã®å€æ
éåžžã®é¢æ°ã§äœ¿çšã§ããæé»çã«çæããã
arguments
ãªããžã§ã¯ãã®å
žåçãªåé¡ïŒ
arguments
ãªããžã§ã¯ãã®ç¢å°é¢æ°ã¯äœ¿çšã§ããŸããïŒã¯ãé
åã§ã¯ãªãé
åã®ããã«èŠããããšã§ãã
é
åã®ã¡ãœãããŸãã¯ãã®åäœã®æ©èœã䜿çšããã«ã¯ã
arguments
ã®ã€ã³ããã¯ã¹ä»ãããããã£ãé
åã«ã³ããŒããå¿
èŠããããŸãã éå»ã«ãJSéçºè
ã¯ããçãã³ãŒããšããéãã³ãŒããåäžèŠããåŸåããããŸããã ãã®ã¢ãããŒãã¯ãã¯ã©ã€ã¢ã³ãã³ãŒãã®å Žåããã©ãŠã¶ãŒãããŠã³ããŒãããããŒã¿ã®éãåæžããããšãå¯èœã«ããŸããããµãŒããŒã³ãŒãã§åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãããµãŒããŒã³ãŒãã§ã¯ãããã°ã©ã ã®ãµã€ãºãå®è¡é床ãããã¯ããã«éèŠã§ã¯ãããŸããã ãã®çµæã
arguments
ãªããžã§ã¯ããé
åã«å€æããéåžžã«çãæ¹æ³ãéåžžã«äžè¬çã«ãªããŸããïŒ
Array.prototype.slice.call(arguments)
ã ãã®ãããªã³ãã³ãã¯ã
Array
ãªããžã§ã¯ãã®
slice
ã¡ãœãããåŒã³åºãã
arguments
ãªããžã§ã¯ãããã®ã¡ãœããã®
this
ã³ã³ããã¹ããšããŠæž¡ããŸãã
slice
ã¡ãœããã¯ãé
åã®ããã«èŠãããªããžã§ã¯ããæ€åºãããã®åŸã«ãžã§ããå®è¡ããŸãã ãã®çµæã
arguments
ãªããžã§ã¯ãã®ã³ã³ãã³ãããé
åã«çµã¿ç«ãŠãããé
åãååŸããŸãã
ãã ããæé»çã«çæããã
arguments
ãªããžã§ã¯ããé¢æ°ã®ã³ã³ããã¹ãå€ã«æž¡ãããå ŽåïŒããšãã°ã
Array.prototype.slice.call(arguments)
åŒã³åºããšããªã©ãé¢æ°ããè¿ããããå¥ã®é¢æ°ã«æž¡ãããå ŽåïŒãããã¯éåžžããã©ãŒãã³ã¹
Array.prototype.slice.call(arguments)
åŒãèµ·ãããŸãã ãã®å£°æã調ã¹ãŸãã
次ã®ãã€ã¯ããã³ãããŒã¯ã¯ãV8ã®4ã€ã®ããŒãžã§ã³ã§çžäºã«é¢é£ãã2ã€ã®ç¶æ³ã調æ»ããããšãç®çãšããŠããŸãã ã€ãŸããããã¯
arguments
ãªãŒã¯ã®ã³ã¹ããšé
åã«
arguments
ãã³ããŒããã³ã¹ãã§ããã
arguments
ãªããžã§ã¯ãã®ä»£ããã«é¢æ°ã®å€éšã«æž¡ãããŸãã
ãã¹ãã±ãŒã¹ã¯æ¬¡ã®ãšããã§ãã
arguments
ãé
åã«å€æããã«ã arguments
ãªããžã§ã¯ããå¥ã®é¢æ°ã«æž¡ããŸãïŒæŒããããåŒæ°ïŒã
Array.prototype.slice
ïŒArray.prototype.slice argumentsïŒã³ã³ã¹ãã©ã¯ãã䜿çšããŠã arguments
ãªããžã§ã¯ãã®ã³ããŒãäœæããŸãã
for
ã«ãŒãã䜿çšãfor
åããããã£ãã³ããŒããŸãïŒforã«ãŒãã³ããŒåŒæ°ïŒ
- EcmaScript 2015ã®æ¡åŒµæŒç®åã䜿çšããŠãå
¥åããŒã¿ã®é
åãã¹ãã¬ããæŒç®åãšããŠé¢æ°ã«å²ãåœãŠãŸãã
â
GitHubã§ã³ãŒãããã¹ããã
次ã«ãããã©ãŒãã³ã¹ç¹æ§ã®å€åã匷調ããããã«ãæãç·ã°ã©ãã®åœ¢åŒã§è¡šç€ºãããåãããŒã¿ãèŠãŠã¿ãŸãããã

ããããã¹ãŠããå°ãåºããçµè«ã以äžã«ç€ºããŸãã é¢æ°ã®å
¥åããŒã¿ãé
åã®åœ¢ã§åŠçããçç£çãªã³ãŒããæžãå¿
èŠãããå ŽåïŒçµéšããç§ã¯éåžžã«é »ç¹ã«å¿
èŠãšããããšãç¥ã£ãŠããŸãïŒãããŒã8.3以éã§ã¯æ¡åŒµæŒç®åã䜿çšããå¿
èŠããããŸãã Node 8.2以äžã§ã¯ã
for
ã«ãŒãã䜿çšããŠã
arguments
ããããŒãæ°ããïŒä»¥åã«äœæãããïŒé
åã«ã³ããŒããå¿
èŠããããŸãïŒè©³çŽ°ã«ã€ããŠã¯ããã¹ãã³ãŒããåç
§ïŒã
ããã«ãããŒã8.3+ã§ã¯ã
arguments
ãªããžã§ã¯ããä»ã®é¢æ°ã«æž¡ããšããã©ãŒãã³ã¹ãäœäžãããããå®å
šãªé
åãå¿
èŠãšãããé
åã®ããã«èŠãããé
åã§ã¯ãªãæ§é ãæäœã§ããå Žåãä»ã®ããã©ãŒãã³ã¹äžã®å©ç¹ããããŸãã
éšå䜿çšïŒã«ãªãŒåïŒããã³é¢æ°ã³ã³ããã¹ããã€ã³ãã£ã³ã°
é¢æ°ãéšåçã«é©çšïŒãŸãã¯ã«ãªãŒåïŒãããšãå²ãŸããåè·¯ã®å¯èŠé åã«ç¹å®ã®ç¶æ
ãä¿åã§ããŸãã
äŸïŒ
function add (a, b) { return a + b } const add10 = function (n) { return add(10, n) } console.log(add10(20))
ãã®äŸã§ã¯ã
add
é¢æ°ã®ãã©ã¡ãŒã¿ãŒã¯ã
add10
é¢æ°ã®æ°å€10ãšããŠéšåçã«é©çšãããŸãã
bind
ã¡ãœããã®ãããã§ãEcmaScript 5以éãé¢æ°ã®ããçã圢åŒã®éšåçãªäœ¿çšãå¯èœã«ãªããŸããã
function add (a, b) { return a + b } const add10 = add.bind(null, 10) console.log(add10(20))
ãã ããéåžžã
bind
ã¡ãœããã¯äžèšã®ã¯ããŒãžã£ãŒã¡ãœããããã倧å¹
ã«é
ãããã䜿çšãããŸããã
ãã®ãã¹ãã§ã¯ãV8ã®ç°ãªãããŒãžã§ã³ã§
bind
ãšã¹ãããã®äœ¿çšã®éãã枬å®ããŸãã æ¯èŒã®ããã«ãããã§ã¯å
ã®é¢æ°ã®çŽæ¥åŒã³åºãã䜿çšãããŠããŸãã
以äžã«4ã€ã®ãã¹ãã±ãŒã¹ã瀺ããŸãã
- æåã®åŒæ°ïŒé貚ïŒã®äºåçãªéšåé©çšã§å¥ã®é¢æ°ãåŒã³åºãé¢æ°ã
- æåã®åŒæ°ãéšåçã«é©çšãããå¥ã®é¢æ°ãåŒã³åºãç¢å°é¢æ°ïŒå€ªãç¢å°ã«ã¬ãŒïŒã
bind
ã¡ãœããã䜿çšããŠäœæãããé¢æ°ãæåã®åŒæ°ãå¥ã®é¢æ°ã«éšåçã«é©çšããŸãïŒãã€ã³ãïŒã
- éšåçãªã¢ããªã±ãŒã·ã§ã³ã䜿çšããã«é¢æ°ãçŽæ¥åŒã³åºããŸãïŒçŽæ¥åŒã³åºãïŒã
â
GitHubã§ã³ãŒãããã¹ããã
ãã¹ãçµæã®ç·åœ¢å³ã¯ãææ°ããŒãžã§ã³ã®V8ã§æ©èœãæäœããããã®èæ
®ãããæ¹æ³ã®éã«ã»ãšãã©å®å
šãªéãããªãããšãæ確ã«ç€ºããŠããŸãã èå³æ·±ãããšã«ãç¢å°é¢æ°ã䜿çšããéšåçãªã¢ããªã±ãŒã·ã§ã³ã¯ãéåžžã®é¢æ°ã䜿çšãããããã¯ããã«é«éã§ãïŒå°ãªããšããã¹ãã§ã¯ïŒã å®éãçŽæ¥é¢æ°åŒã³åºããšã»ãŒäžèŽããŸãã V8 5.1ïŒããŒã6ïŒããã³5.8ïŒããŒã8.0-8.2ïŒã§ã¯ã
bind
éåžžã«é
ãããããã®ç®çã§ç¢å°é¢æ°ã䜿çšãããšæé«é床ãéæã§ããããšãæããã§ãã ãã ããV8ããŒãžã§ã³5.9ïŒããŒã8.3+ïŒä»¥éã
bind
ããã©ãŒãã³ã¹ã¯å€§å¹
ã«åäžããŠããŸãã ãã®ã¢ãããŒãã¯ãV8 6.1ïŒå°æ¥ã®ããŒãžã§ã³ã®ããŒãïŒã§æéã§ãïŒãã ããããã§ã®ããã©ãŒãã³ã¹ã®éãã¯ã»ãšãã©åºå¥ã§ããŸããïŒã
Nodeã®ãã¹ãŠã®ããŒãžã§ã³ã§æéã®ã«ã¬ãŒæ¹æ³ã¯ãç¢å°é¢æ°ã䜿çšããããšã§ãã æè¿ã®ããŒãžã§ã³ã§ã¯ããã®æ¹æ³ãš
bind
ã®äœ¿çšã®éã
bind
éèŠã§
bind
ãŸãããçŸåšã®ç¶æ
ã§ã¯ãéåžžã®é¢æ°ã䜿çšãããããé«éã§ãã ãã ããããå®å
šãªå
šäœåãåŸãã«ã¯ãããŸããŸãªãµã€ãºã®ããŒã¿ââæ§é ãæã€é¢æ°ã®ããå€ãã®ã¿ã€ãã®éšåé©çšã調æ»ããå¿
èŠããããããåŸãããçµæãã©ã®ãããªç¶æ³ã§ãæå¹ã§ãããšã¯èšããŸããã
æ©èœã³ãŒããµã€ãº
眲åãã¹ããŒã¹ãããã«ã¯ã³ã¡ã³ããå«ãé¢æ°ã®ãµã€ãºã¯ãV8ãé¢æ°ãã€ã³ã©ã€ã³åã§ãããã©ããã«åœ±é¿ãäžããå¯èœæ§ããããŸãã ã¯ããé¢æ°ã«ã³ã¡ã³ããè¿œå ãããšãããã©ãŒãã³ã¹ãçŽ10ïŒ
äœäžããå¯èœæ§ããããŸãã ããã¯å°æ¥å€æŽãããŸããïŒ
ãã®ãã¹ãã§ã¯ã3ã€ã®ã·ããªãªãæ€èšããŸãã
- å°ããªé¢æ°ãåŒã³åºããŸãïŒå°ããªé¢æ°ã®åèšïŒã
- ã³ã¡ã³ãã§è£å®ãããçµã¿èŸŒã¿ã¢ãŒãã§å®è¡ãããå°ããªæ©èœã®äœæ¥ïŒãã¹ãŠäžç·ã«ïŒã
- ã³ã¡ã³ãä»ãã®å€§ããªé¢æ°ã®åŒã³åºãïŒé·ãé¢æ°ã®åèšïŒã
â
GitHubã§ã³ãŒãããã¹ããã
V8 5.1ïŒããŒã6ïŒã§ã¯ãsmallé¢æ°ãšlongã®åèšãã¹ãã®åèšã¯åãçµæã瀺ããŸãã ããã¯ãåã蟌ã¿ã®ä»çµã¿ãå®å
šã«ç€ºããŠããŸãã å°ããªé¢æ°ãåŒã³åºããšãV8ããã®é¢æ°ã®å
容ãåŒã³åºãããå Žæã«æžã蟌ãããšã«äŒŒãŠããŸãã ãããã£ãŠãé¢æ°ã®ããã¹ããèšè¿°ãããšãïŒã³ã¡ã³ããè¿œå ããŠãïŒãåŒã³åºãã®å Žæã«æåã§åã蟌ã¿ãŸãããããã©ãŒãã³ã¹ã¯åãã§ãã ç¹°ãè¿ãã«ãªããŸãããV8 5.1ïŒããŒã6ïŒã§ã¯ãé¢æ°ãç¹å®ã®ãµã€ãºã«éããåŸãã³ã¡ã³ããè¿œå ãããé¢æ°ãåŒã³åºããšãã³ãŒãã®å®è¡ã倧å¹
ã«é
ããªãããšãããããŸãã
Node 8.0-8.2ïŒV8 5.8ïŒã§ã¯ãå°ããªé¢æ°ãåŒã³åºãã³ã¹ããèããå¢å ããããšãé€ããŠãå
šäœãšããŠç¶æ³ã¯åããŸãŸã§ãã ããã¯ãããããCrankshaftãšTurboFanã®èŠçŽ ã®æ··åã«ãããã®ã§ãã1ã€ã®é¢æ°ãCrankshaftã«ããããã1ã€ã®é¢æ°ãTurboFanã«ããå Žåãåã蟌ã¿ã®ã¡ã«ããºã ã®æ
éã«ã€ãªãããŸãïŒã€ãŸããé£ç¶ããŠçµã¿èŸŒãŸããé¢æ°ã®ã¯ã©ã¹ã¿ãŒéã®ç§»è¡ãçºçããã¯ãã§ãïŒã
V8 5.9以éïŒããŒã8.3以éïŒã§ã¯ãã¹ããŒã¹ãã³ã¡ã³ããªã©ã®ç¡é¢ä¿ãªæåãè¿œå ããŠããé¢æ°ã®ããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããã ããã¯ãCurboshaftãªã©ã®æåãã«ãŠã³ããã代ããã«ãTurboFanã
æœè±¡æ§æããªãŒ ïŒASTã
æœè±¡æ§æããªãŒ ïŒã䜿çšããŠé¢æ°ã®ãµã€ãºãèšç®ããããã§ãã TurboFanã¯ãé¢æ°ã®ãã€ãæ°ãèæ
®ãã代ããã«ãé¢æ°ã®å®éã®åœä»€ãåæããŸãããã®ãããV8 5.9ïŒããŒã8.3+ïŒ
ã¹ããŒã¹ããå§ãŸã
ãå€æ°åãæ§æããæåãé¢æ°ã·ã°ããã£ãããã³ã³ã¡ã³ãã¯ãé¢æ°ãåã蟌ãŸãã ã ããã«ãé¢æ°ã®å
šäœçãªããã©ãŒãã³ã¹ãäœäžããŠããããšã«æ³šæããå¿
èŠããããŸãã
ããã§ã®äž»ãªçµè«ã¯ãæ©èœã¯ã§ããéãå°ãããã䟡å€ããããšããããšã§ãã çŸæç¹ã§ã¯ãé¢æ°å
ã®äžèŠãªã³ã¡ã³ãïŒããã«ã¯ã¹ããŒã¹ïŒãé¿ããå¿
èŠããããŸãã ããã«ãæé«ã®ããã©ãŒãã³ã¹ãç®æããŠããå Žåãé¢æ°ãæåã§åã蟌ãïŒã€ãŸããé¢æ°ã³ãŒããåŒã³åºãã®å Žæã«è»¢éããé¢æ°ãåŒã³åºãå¿
èŠããªããªãïŒããšã¯ãæéã®ã¢ãããŒãã§ããç¶ããŸãã ãã¡ãããããã§ãã©ã³ã¹ãåãå¿
èŠããããŸããå®éã®å®è¡å¯èœã³ãŒããç¹å®ã®ãµã€ãºã«éãããšãé¢æ°ã¯ãšã«ããçµã¿èŸŒãŸããªããããä»ã®é¢æ°ã®ã³ãŒããæããããã³ããŒãããšãããã©ãŒãã³ã¹ã®åé¡ãçºçããå¯èœæ§ãããããã§ãã èšãæãããšãæåã§é¢æ°ãåã蟌ãããšã¯ãèãæã€å¯èœæ§ããããŸãã ã»ãšãã©ã®å Žåãã³ã³ãã€ã©ã«é¢æ°ã®åã蟌ã¿ãå§ä»»ããããšããå§ãããŸãã
32ãããããã³64ãããæŽæ°
JavaScriptã®æ°å€åã¯
Number
ã®ã¿ã§ããããšãããç¥ãããŠããŸãã
ãã ããV8ã¯C ++ã§å®è£
ãããŠãããããJavaScriptã®æ°å€ã®åºæ¬çãªã¿ã€ãã¯éžæã®åé¡ã§ãã
æŽæ°ã®å ŽåïŒã€ãŸããå°æ°ç¹ãªãã§JSã§æ°å€ãæå®ããå ŽåïŒãV8ã¯ãã¹ãŠã®æ°å€ã32ãããã§ãããšèŠãªããŸã-ããããããã§ãªããªãéãã å€ãã®å Žåãæ°å€ã¯2147483648ã2147483647ã®ç¯å²ã«ãããããããã¯å
¬å¹³ãªéžæã®ããã§ãã JSçªå·ïŒå
šäœïŒã2147483647ãè¶
ããå ŽåãJITã³ã³ãã€ã©ãŒã¯ãæ°å€ã®åºæ¬åãå粟床åïŒæµ®åå°æ°ç¹ïŒã«åçã«å€æŽããå¿
èŠããããŸã-ããã¯ãæœåšçã«ãä»ã®æé©åã«ç¹å®ã®åœ±é¿ãäžããå¯èœæ§ããããŸãã
ãã®ãã¹ãã§ã¯ã3ã€ã®ã·ããªãªãæ€èšããŸãã
- 32ãããã®ç¯å²ã«åãŸãæ°å€ïŒåèšãå°ããïŒã§ã®ã¿æ©èœããé¢æ°ã
- 32ãããã®æ°å€ãšãããããè¡šãããã«å粟床ããŒã¿åïŒå°ãã倧ïŒãå¿
èŠãšããæ°å€ã®çµã¿åããã§æ©èœããé¢æ°ã
- å粟床æ°ïŒãã¹ãŠå€§ããïŒã§ã®ã¿åäœããé¢æ°ã
â
GitHubã§ã³ãŒãããã¹ããã
ãã®å³ãããããŒã6ïŒV8 5.1ïŒãããŒã8ïŒV8 5.8ïŒããŸãã¯ããŒãã®å°æ¥ã®ããŒãžã§ã³ã«ã€ããŠããäžèšã®èŠ³å¯çµæã¯æå¹ã§ãããšèšããŸãã ã€ãŸãã2147483647ãã倧ããæŽæ°ã䜿çšããèšç®ã¯ãé¢æ°ãæ倧å€ã®ååãŸãã¯3åã®2ã®é åã«ããé床ã§å®è¡ããããšããäºå®ã«ã€ãªãããŸãã ãããã£ãŠãããžã¿ã«IDãé·ãå Žåã¯ãæååã«å
¥ããŠãã ããã
ããã«ãããŒã6ïŒV8 5.1ïŒããã³ããŒââã8.1ããã³8.2ïŒV8 5.8ïŒã§ã¯ãããŒã8.3+ïŒV8 5.9+ïŒããã32ãããã®ç¯å²å
ã®æ°å€ã§ã®æäœãã¯ããã«é«éã«å®è¡ãããããšãéåžžã«é¡èã§ãã ïŒ ãã ããNode 8.3+ïŒV8 5.9+ïŒã®å粟床æ°ã®æäœã¯é«éã§ãã ããã¯ããããã32ãããæ°ã®åŠçé床ãé
ãããã§ããããã¹ãã³ãŒãã§äœ¿çšãããé¢æ°ãŸãã¯
for
ã«ãŒãã®åŒã³åºãé床ã«ã¯é©çšãããŸããã
Jakob Kummerov ã
Yang Guo ãããã³V8ããŒã ã¯ããã®ãã¹ãã®çµæãããæ£ç¢ºã«ãããæ£ç¢ºã«ããã®ã«åœ¹ç«ã¡ãŸããã ããã«ã€ããŠåœŒãã«æè¬ããŠããŸãã
ãªããžã§ã¯ãããããã£ã®åæ
ãªããžã§ã¯ãã®ãã¹ãŠã®ããããã£ã®å€ãååŸãããããã®ã¢ã¯ã·ã§ã³ãå®è¡ããããšã¯äžè¬çãªã¿ã¹ã¯ã§ãã ããã解決ããæ¹æ³ã¯ãããããããŸãã V8ãšNodeã®èª¿æ»æžã¿ã®ããŒãžã§ã³ã®äžã§ãã©ã®ã¡ãœãããæéãã調ã¹ãŸãã
V8ã®ãã¹ãŠã®ãã¹ãæžã¿ããŒãžã§ã³ãåãã4ã€ã®ãã¹ãã¯æ¬¡ã®ãšããã§ãã
hasOwnProperty
ã䜿çšããŠfor-in
ã«ãŒãã䜿çšããããããã£ããªããžã§ã¯ãïŒfor-inïŒã®ããããã£ã§ãããã©ãããå€æããŸãã
Object.keys
ã䜿çšãã Array
ãªããžã§ã¯ãã®reduce
ã¡ãœããã䜿çšããŠããŒãåæããŸãã ããããã£å€ãžã®ã¢ã¯ã»ã¹ã¯ã reduce
æž¡ãããå埩é¢æ°å
ã§å®è¡ãããŸãïŒObject.keysã®æ©èœïŒã
Object.keys
ã䜿çšãã Array
ãªããžã§ã¯ãã®reduce
ã¡ãœããã䜿çšããŠããŒãåæããŸãã ããããã£å€ãžã®ã¢ã¯ã»ã¹ã¯ã reduce
æž¡ãããç¢å°ã€ãã¬ãŒã¿é¢æ°å
ã§å®è¡ãããŸãïŒObject.keysã¯ç¢å°ã§æ©èœããŸãïŒã
for
ã«ãŒãã§Object.keys
ããè¿ãããé
åãç¹°ãè¿ãåŠçããŸãã ãªããžã§ã¯ãã®ããããã£å€ãžã®ã¢ã¯ã»ã¹ã¯ãåããµã€ã¯ã«ã§å®è¡ãããŸãïŒforã«ãŒãä»ãã®Object.keysïŒã
ããã«ãV8ããŒãžã§ã³5.8ã5.9ã6.0ãããã³6.1ã®3ã€ã®è¿œå ãã¹ããå®æœããŸããã
Object.values
ã䜿çšãã Array
ãªããžã§ã¯ãã®reduce
ã¡ãœããã䜿çšããŠãªããžã§ã¯ãã®ããããã£å€ãObject.values
ããŸãïŒObject.valuesæ©èœïŒã
Object.values
ã䜿çšãã Array
ãªããžã§ã¯ãã®reduce
ã¡ãœããã䜿çšããŠå€ãåæãã reduce
ã¡ãœããã«æž¡ãããå埩åé¢æ°ã¯ç¢å°é¢æ°ã§ããïŒObject.valuesã¯ç¢å°ã§æ©èœããŸãïŒã
for
ã«ãŒãã§Object.values
ããè¿ãããé
åãå埩åŠçããŸãïŒ for
ã«ãŒãä»ãã®Object.valuesïŒã
ãã®ããŒãžã§ã³ã¯EcmaScript 2017
Object.values
çµã¿èŸŒã¿ã¡ãœããããµããŒãããŠããªããããV8 5.1ïŒããŒã6ïŒã§ã¯ãããã®ãã¹ããå®è¡ããŸããã§ããã
â
GitHubã§ã³ãŒãããã¹ããã
Node 6ïŒV8 5.1ïŒããã³Node 8.0-8.2ïŒV8 5.8ïŒã§ã¯ã
for-in
ã«ãŒãã䜿çšããããšããééããªããªããžã§ã¯ãã®ããŒãå埩åŠçãããã®ããããã£å€ã«ã¢ã¯ã»ã¹ããæéã®æ¹æ³ã§ãã 40 , 5 , ,
Object.keys
, 8 .
V8 6.0 (Node 8.3)
for-in
- , . , .
V8 6.1 ( , Node), ,
Object.keys
, ,
for-in
, , ,
for-in
V8 5.1 5.8 (Node 6, Node 8.0-8.2).
, TurboFan â , . , , .
Object.values
,
Object.keys
. , , . , , .
, ,
for-in
- , . , .
JS â , , .
:
- (literal).
- EcmaScript 2015 (class).
- - (constructor).
â
GitHub
Node 6 (V8 5.1) .
Node 8.0-8.2 (V8 5.8), EcmaScript 2015, , -. , , Node.
V8 5.9 .
, V8 6.0 (, Node 8.3 8.4) 6.1 ( V8 Node), . 500 ! .
, . , , . , , , ( ).
,
, TurboFan . .
(, ), , . . , . , , , , - . , , , . .
:
- , , (polymorphic with literal).
- , , (polymorphic with constructor).
- (monomorphic string).
- , (monomorphic obj literal).
- , (monomorphic obj with constructor).
â
GitHub
, V8.
V8 6.1 ( , Node) , . , , node-v8, « » V8, V8 6.1.
, , , , , . , , , , API .
, V8 , , ,
d8
. , Node. , , Node ( , Node V8). . , .
debugger
, ,
debugger
.
-. .
:
- ,
debugger
(with debugger). - ,
debugger
(without debugger).
â
GitHub
. V8
debugger
.
, without debugger V8.
:
, , V8 . Node.js, ,
Pino .
, 10 ( â ) Node.js 6.11 (Crankshaft).
â , V8 6.1 (TurboFan).
, , Winston JIT- TurboFan. , , , , . Crankshaft TurboFan, , Crankshaft, TurboFan . Winston, , , , Crankshaft, TurboFan. , Pino Crankshaft. .
ãŸãšã
, , V8 5.1, 5.8 5.9, TurboFan V8 6.0 6.1. , , , , , .
TurboFan (V8 6.0 ). TurboFan , , , « V8» . (Chrome) (Node) . , , , . , . , TurboFan (, Winston Pino).
- JavaScript, , , , - , - . JS-, , V8, .
芪æãªãèªè
ïŒ JavaScript ?