JavaScriptã®ããã©ãŒãã³ã¹ãšããã°ã®æçš¿ã§ã¯ã
åçžã³ãŒãã®éèŠæ§ã匷調ãããããšããããããŸãããéåžžãåçž/å€çžãšã¯äœãããªãéèŠãªã®ãã«ã€ããŠã¯æç¢ºãªèª¬æããããŸããã ç§èªèº«ã®ã¹ããŒãã§ãããä¿¡ããããªãã»ã©ã®ãã«ã¯ã®äºåæ³ã«åž°çããããšããããããŸã
ã 2çš®é¡ã®æªãïŒã ããã©ãŒãã³ã¹ã«é¢ããã¢ããã€ã¹ãæ±ãããããšãã»ãšãã©ã®å Žåãã¢ãã¢ãŒãã£ãºã ãšã¯äœããããªã¢ãŒãã£ãºã ã¯ã©ãããæ¥ãŠãäœãæªãã®ãã説æããããã«é ŒãŸããŸãã
ãå€åããšããèšèèªäœãå€ãã®æå³ãæã£ãŠãããšããäºå®ã«ãã£ãŠãç¶æ³ã¯è€éã«ãªã£ãŠããŸãã å€å
žçãªãªããžã§ã¯ãæåããã°ã©ãã³ã°ã§ã¯ãããªã¢ãŒãã£ãºã ã¯ãåºæ¬ã¯ã©ã¹ã®åäœããªãŒããŒã©ã€ãã§ããåã¯ã©ã¹ã®äœæã«é¢é£ä»ããããŠããŸãã Haskellããã°ã©ããŒã¯ã代ããã«ãã©ã¡ããªãã¯å€çžæ§ã«ã€ããŠèããã§ãããã ãã ããJavaScriptããã©ãŒãã³ã¹ã¬ããŒãã§èŠåãããããªã¢ãŒãã£ãºã
ã¯ã颿°åŒã³åºãã®ããªã¢ãŒãã£ãºã
ã§ã ã
ãã®ã¡ã«ããºã ãéåžžã«å€ãã®æ¹æ³ã§èª¬æããã®ã§ãããããéãŸã£ãŠãã®èšäºãæžããŸãããä»ã§ã¯å³èã§ã¯ãªããåã«ãªã³ã¯ã匵ãããšãã§ããŸãã
ç§ã¯ãŸããç©äºã説æããæ°ããæ¹æ³ã詊ã¿ãŸãã-çãæŒ«ç»ã®åœ¢ã§ä»®æ³ãã·ã³ã®ã³ã³ããŒãã³ãã®çžäºäœçšãæããŠããŸãã ããã«ããã®èšäºã§ã¯ãéèŠã§ã¯ãªããåé·ã§ããããŸãã¯çŽæ¥é¢é£ããŠããªããšèŠãªãã詳现ã«ã€ããŠã¯èª¬æããŸããã ãããŒã®åçæ€çŽ¢

ç°¡åã«ããããã«ãäž»ã«JavaScriptã®ããããã£ãžã®æãåºæ¬çãªåŒã³åºãïŒä»¥äžã®ã³ãŒãã®
ox
ãªã©ïŒãæ€èšããŸãã åæã«ãããã§èª¬æããŠããããšã¯ãã¹ãŠãããããã£ãŸãã¯ç®è¡æŒç®åã®åŒã³åºãã§ãããã©ããã«ãããããã
åçãã€ã³ãã£ã³ã°ã䜿çšãããã¹ãŠã®æäœã«é©çšãããJavaScriptã ãã§ãªãé©çšã§ããããšãçè§£ããããšãéèŠã§ãã
function f(o) { return ox } f({ x: 1 }) f({ x: 2 })
Interpretators LLCã®åªç§ãªããžã·ã§ã³ã«ã€ããŠã€ã³ã¿ãã¥ãŒãåããJavaScriptä»®æ³ãã·ã³ã®ããããã£ã«ã¢ã¯ã»ã¹ããããã®ã¡ã«ããºã ãèããŠå®è£
ããããã«æ±ããããŸãã æãå¹³å¡ã§åçŽãªçãã¯äœã§ããããïŒ
ECMAScript仿§ïŒECMA 262ïŒããæ¢è£œã®JSã»ãã³ãã£ã¯ã¹ã
ååŸã ãè±èªã®åèªã®
[[Get]]ã¢ã«ãŽãªãºã ã®åèªãC ++ãJavaãRustãMalbolgeããŸãã¯äœ¿çšããä»ã®èšèªã«æžãæãããããç°¡åãªãã®ãèŠã€ããã®ã¯é£ããã€ã³ã¿ãã¥ãŒã®ããã«ã
äžè¬çã«ãã©ã³ãã ãªJSã€ã³ã¿ãŒããªã¿ãŒãéããšã次ã®ãããªãã®ã衚瀺ãããå¯èœæ§ãé«ããªããŸãã
jsvalue Get(jsvalue self, jsvalue property_name) { // 8.12.3 [[Get]] } void Interpret(jsbytecodes bc) { // ... while (/* */) { switch (op) { // ... case OP_GETPROP: { jsvalue property_name = pop(); jsvalue receiver = pop(); push(Get(receiver, property_name)); // TODO(mraleph): strict mode, 8.7.1 3. break; } // ... } } }
ããã¯ããããã£åŒã³åºããå®è£
ããçµ¶å¯Ÿã«æ£ããæ¹æ³ã§ããã1ã€ã®éå€§ãªæ¬ ç¹ããããŸããææ°ã®JSä»®æ³ãã·ã³ãšæ¯èŒããŠãå®è£
ãéåžžã«é
ãã§ãã
ã€ã³ã¿ããªã¿ã¯å¥å¿çã«æ©ãŸãããŸããããããã£ã«ã¢ã¯ã»ã¹ãããã³ã«ãããããã£ãæ€çŽ¢ããããã®äžè¬åãããã¢ã«ãŽãªãºã å
šäœãå®è¡ããå¿
èŠããããŸãã 圌ã¯ä»¥åã®è©Šã¿ããã¯åŠã°ããæ¯åæé«é¡ãæ¯æããããåŸãŸããã ãããã£ãŠãããã©ãŒãã³ã¹æåã®ä»®æ³ãã·ã³ã¯ããããã£ã¢ã¯ã»ã¹ãç°ãªãæ¹æ³ã§å®è£
ããŸãã

ããã§ããã§ã«èŠããªããžã§ã¯ãã«é¢ããæ
å ±ãååŸããŠããããåæ§ã®ãªããžã§ã¯ãã«é©çšã§ããããã«ãªã£ããïŒ çè«çã«ã¯ãããã«ãããäžè¬çãªã¢ã«ãŽãªãºã ã§ã¯ãªããç¹å®ã®
圢ç¶ã®ãªããžã§ã¯ãã«æãé©ããã¢ã«ãŽãªãºã ã䜿çšããããšã§ãå€ãã®æéãç¯çŽã§ããŸãã
ã©ã³ãã ãªããžã§ã¯ãå
ã®ããããã£ã®æ€çŽ¢ã¯æéããããæäœã§ãããããäžåºŠå®è¡ããŠ
ããªããžã§ã¯ãã®
圢åŒãããŒãšããŠäœ¿çšããŠèŠã€ãã£ã
ãã¹ããã£ãã·ã¥ããããšãã
å§ãããŸãã æ¬¡ååã圢ç¶ã®ãªããžã§ã¯ãã«åºäŒã£ããšããæåããèšç®ãããããã¯ããã«é«éã«ãã£ãã·ã¥ãããã¹ãååŸããããšãå¯èœã«ãªããŸãã
ãã®æé©åææ³ã¯ã
ã€ã³ã©ã€ã³ãã£ãã·ã³ã°ãšåŒã°ã
ã 以åã«ããã«ã€ããŠãã§ã«
æžããŠããŸãã ãã®èšäºã§ã¯ãå®è£
ã®è©³çްã«ã€ããŠã¯èª¬æããŸãããããããŸã§èšåããªãã£ã2ã€ã®éèŠãªç¹ã«æ³šæããŸããä»ã®ãã£ãã·ã¥ãšåæ§ã«ãã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ã¯
ãµã€ãº ïŒç¹å®ã®æç¹ã§ãã£ãã·ã¥ãããã¢ã€ãã ã®æ°ïŒãš
容é ïŒã¢ã€ãã ã®æå€§æ°ããã£ãã·ã¥ã§ããŸãïŒã
äŸã«æ»ããŸãã
function f(o) { return ox } f({ x: 1 }) f({ x: 2 })
ox
ã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ã¯ããã€ã®ãšã³ããªããããŸããïŒ
{x: 1}
ãš
{x: 2}
ã¯åã圢ç¶ïŒ
é ãããã¯ã©ã¹ãšåŒã°ããããšãããïŒã§ãããããçãã¯1ã§ã
ãmonomorphicãšåŒã¶ã®ã¯ãã®ãã£ãã·ã¥ç¶æ
ã§ãã
ã¢ãïŒ "one"ïŒ+ã¢ãŒãïŒ "form"ïŒ
ããããç°ãªã圢ç¶ã®ãªããžã§ã¯ãã§é¢æ°
f
ãåŒã³åºããšã©ããªããŸããïŒ
f({ x: 3 })
ãªããžã§ã¯ã
{x: 3}
ãš
{x: 3, y: 1}
ã¯åœ¢ç¶ãç°ãªãããããã£ãã·ã¥ã«ã¯
{x: *}
çšãš
{x: *, y: *}
çšã®2ã€ã®ãšã³ããªãå«ãŸããŠããŸãã æäœã¯ããªã¢ãŒãã£ãºã ã¬ãã«2ã§ããªã¢ãŒãã£ãã¯ã«ãªããŸããã
ããŸããŸãªåœ¢ç¶ã®ãªããžã§ã¯ãã
f
ã«è»¢éãç¶ãããšãã€ã³ã©ã€ã³ãã£ãã·ã¥ã®å®¹éå¶éã«éãããŸã§ããªã¢ãŒãã£ãºã ã®ã¬ãã«ãå¢å ããŸãïŒããšãã°ãV8ã§ã¯ãããããã£ã«ã¢ã¯ã»ã¹ããããã®å®¹éå¶éã¯4ã«ãªããŸãïŒã ãã®åŸããã£ãã·ã¥ã¯
ã¡ã¬ã¢ãŒãã£ãã¯ç¶æ
ã«ãªããŸãã
f({ x: 4, y: 1 }) // , 2 f({ x: 5, z: 1 }) // , 3 f({ x: 6, a: 1 }) // , 4 f({ x: 7, b: 1 }) //

ãã£ãã·ã¥ãå¶åŸ¡äžèœã«æé·ããã®ãé²ãããã«ãã¡ã¬ã¢ãŒãã£ãã¯ç¶æ
ãå¿
èŠã§ãããæ¬è³ªçã«ã¯ããã©ãŒã ãå€ããããããããã«è¿œè·¡ããã®ã¯ç¡æå³ã§ãããšããæå³ã§ãã V8ä»®æ³ãã·ã³ã§ã¯ãã¡ã¬ã¢ãŒãã£ãã¯ç¶æ
ã®ãã£ãã·ã¥ã¯åŒãç¶ãäœãããã£ãã·ã¥ã§ããŸãããããŒã«ã«ã§ã¯ãªãã°ããŒãã«ããã·ã¥ããŒãã«ã«ãã£ãã·ã¥ã§ããŸãã ãµã€ãºã¯åºå®ãããŠãããè¡çªãçºçããå Žåãå€ã¯äžæžããããŸãã
ç解床ããã¹ãããããã®å°ããªæŒç¿ïŒ
function ff(b, o) { if (b) { return ox } else { return ox } } ff(true, { x: 1 }) ff(false, { x: 2, y: 0 }) ff(true, { x: 1 }) ff(false, { x: 2, y: 0 })
ff
颿°ã§å®£èšãããŠããã€ã³ã©ã€ã³ããããã£ã¢ã¯ã»ã¹ãã£ãã·ã¥ã¯ããã€ã§ããïŒ- 圌ãã¯ã©ã®ãããªç¶æ
ã§ããïŒ
çã2ã€ã®ãã£ãã·ã¥ããããåã圢ç¶ã®ãªããžã§ã¯ãã®ã¿ãããããã«è©²åœãããããäž¡æ¹ãšãåçžã§ãã
ããã©ãŒãã³ã¹ãžã®åœ±é¿
ãã®æ®µéã§ãããŸããŸãªã€ã³ã©ã€ã³ãã£ãã·ã¥ç¶æ
ã®ããã©ãŒãã³ã¹ãæããã«ãªããŸãã
- æ¯åãã£ãã·ã¥ããå€ã«ã¢ã¯ã»ã¹ãããšãåçžãæéã§ãïŒ ONE TYPE GOODïŒ ïŒ
- 倿
æ§-ãã£ãã·ã¥å€éã®ç·åœ¢æ€çŽ¢
- Megamorphic-ã°ããŒãã«ããã·ã¥ããŒãã«ãžã®ã¢ã¯ã»ã¹ã æãé
ããã£ãã·ã¥ãªãã·ã§ã³ã§ããããã£ãã·ã¥ãã¹ãããé«éã§ã
- ãã£ãã·ã¥ãã¹ã¯ããã£ãã·ã¥ã«ãªããã£ãŒã«ããžã®ã¢ããŒã«ã§ãã ã©ã³ã¿ã€ã ãžã®åãæ¿ããšæãäžè¬çãªã¢ã«ãŽãªãºã ã®äœ¿çšã«æéãããããŸã
å®éãããã¯çå®ã®ååã«éããŸããïŒçŽæ¥çãªã³ãŒãã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã«å ããŠãã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯å
šèœã®æé©åã³ã³ãã€ã©ãŒã®ãµãŒãã¹ã§ã¹ãã€ãšããŠãæ©èœããŸããããã¯é
ããæ©ãããã³ãŒããããã«é«éåããŸãã
仿§ãšæé©å
ã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ã次ã®2ã€ã®çç±ã§åç¬ã§æå€§ã®ããã©ãŒãã³ã¹ãæäŸããããšã¯ã§ããŸããã
- åã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ç¬ç«ããŠåäœãããã€ããŒã«ã€ããŠã¯äœãç¥ããŸãã
- åã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ãã¹ããå¯èœæ§ããããããã©ã³ã¿ã€ã ã䜿çšããå¿
èŠããããŸããæçµçã«ã¯ãäžè¬åãããå¯äœçšã䌎ãäžè¬åãããæäœã§ãããæ»ãå€ã®ã¿ã€ãã§ããäžæã§ããããšããããããŸãã
function g(o) { return ox * ox + oy * oy } g({x: 0, y: 0})
äžèšã®äŸã§ã¯ã7ã€ã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ããããŸã
.x
ã«2ã€ã
.y
ã«2ã€ã
*
2ã€ã
+
1ã€ã§ãã ãããããç¬ç«ããŠåäœãããªããžã§ã¯ãããã£ãã·ã¥ããããã©ãŒã ã«æºæ ããŠãããã©ããããã§ãã¯ããŸãã
+
æŒç®åã®ç®è¡ãã£ãã·ã¥ã¯ãäž¡æ¹ã®ãªãã©ã³ããæ°å€ã§ãããã©ããããã§ãã¯ããŸãããããã¯*æŒç®åãã£ãã·ã¥ã®ç¶æ
ããæšæž¬ã§ããŸãã ããã«ãV8ã«ã¯æ°å€ã®å
éšè¡šçŸãããã€ãããããããããèæ
®ãããŸãã
JSã®äžéšã®ç®è¡æŒç®ã«ã¯ãåºæã®ç¹å®ã®ã¿ã€ãããããŸããããšãã°
a | 0
a | 0
åžžã«32ãããæŽæ°ãè¿ãã
+a
ã¯åãªãæ°åã§ãããä»ã®ã»ãšãã©ã®æäœã§ã¯ãã®ãããªä¿èšŒã¯ãããŸããã ãã®ãããJSçšã®
AOTã³ã³ãã€ã©ãŒãäœæããã®ã¯éåžžã«å°é£ã§ãã JSã³ãŒããäºåã«äžåºŠã³ã³ãã€ã«ãã代ããã«ãã»ãšãã©ã®JSä»®æ³ãã·ã³ã«ã¯ããã€ãã®å®è¡ã¢ãŒãããããŸãã
ããšãã°ãV8ã¯æåã«ãã¹ãŠãéåžžã®ã³ã³ãã€ã©ã§ã³ã³ãã€ã«ããããã«å®è¡ãéå§ããŸãã åŸã§ãé »ç¹ã«äœ¿çšããã颿°ã¯æé©åã䜿çšããŠåã³ã³ãã€ã«ãããŸãã äžæ¹ãAsm.jsã¯æé»çãªã¿ã€ãã®æäœã䜿çšãããã®å©ããåããŠãéçåä»ãã䜿çšããJavascriptã®éåžžã«å³å¯ã«éå®ããããµãã»ãããèšè¿°ããŸãã ãã®ãããªã³ãŒãã¯ãã¢ãããã£ãã³ã³ãã€ã«ãæšæž¬ããããšãªããèµ·ååã§ãæé©åã§ããŸãã
ã³ãŒããããŠã©ãŒã ã¢ãããããã«ã¯ã次ã®2ã€ã®ç®çãå¿
èŠã§ãã
- èµ·åé
å»¶ãåæžïŒæé©åã³ã³ãã€ã©ã¯ãã³ãŒããååã«äœ¿çšãããŠããå Žåã«ã®ã¿ãªã³ã«ãªããŸã
- ã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ããªããžã§ã¯ãã®ãã©ãŒã ã«é¢ããæ
å ±ãåéããŸãã
äžèšã®ããã«ã人ã
ã®JavaScriptã³ãŒãã«ã¯éåžžãå®å
šã«éçã«å
¥åããŠAOTã³ã³ãã€ã«ããã®ã«ååãªæ
å ±ãå«ãŸããŠããŸããã JITã³ã³ãã€ã©ã¯ãããã°ã©ã ã®åäœãæšæž¬ããç¹å®ã®ä»®å®ã®äžã§ã®ã¿é©åãªæé©åã³ãŒããçæããå¿
èŠããããŸãã ã€ãŸããæé©åããã颿°ã§äœ¿çšããããªããžã§ã¯ããç¥ãå¿
èŠããããŸãã 幞éãªããšã«ãããã¯ãŸãã«ã€ã³ã©ã€ã³ãã£ãã·ã¥ãåéããæ
å ±ã§ãã
- åçžãã£ãã·ã¥ã«ã¯ããã¿ã€ãA ã®ã¿ã衚瀺ãããŸããããšè¡šç€ºãããŸã
- ããªã¢ãŒãã£ãã¯ãã£ãã·ã¥ã«ã¯ããã¿ã€ãA 1 ã...ãA N ããèŠãŠããŸãã ã
- ã¡ã¬ã¢ãŒãã£ãã¯ãã£ãã·ã¥ïŒãã¯ããããããèŠãŸãã...ã

æé©åã³ã³ãã€ã©ã¯ãã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ãã£ãŠåéãããæ
å ±ãåæãããããã
äžéè¡šçŸ ïŒ
IR ïŒãæ§ç¯ããŸãã IRåœä»€ã¯éåžžãJSã§ã®æäœãããå
·äœçã§äœã¬ãã«ã§ãã ããšãã°ã
.x
ããããã£ã«ã¢ã¯ã»ã¹ããããã®ãã£ãã·ã¥ã
{x, y}
圢åŒã®ãªããžã§ã¯ãã®ã¿ãèŠãå Žåãã³ã³ãã€ã©ã¯ãªããžã§ã¯ããžã®ãã€ã³ã¿ããåºå®ãªãã»ããã§å€ãåãåãIRåœä»€ãçæã§ããŸãã ãã¡ãããçä¿¡ãªããžã§ã¯ãã«ãã®æé©åã䜿çšããããšã¯å®å
šã§ã¯ãªããããã³ã³ãã€ã©ã¯ãã®åã«
åãã§ãã¯ã远å ããŸãã åãã§ãã¯ã¯ããªããžã§ã¯ãã®åœ¢ç¶ãšäºæ³ããã圢ç¶ãæ¯èŒããããããç°ãªãå Žåãæé©åãããã³ãŒããå®è¡ã§ããŸããã 代ããã«ãæé©åãããŠããªãã³ãŒããåŒã³åºãããããããå®è¡ãç¶ç¶ãããŸãã ãã®ããã»ã¹ã¯
æé©åè§£é€ãšåŒã°ã
ãŸã ã æé©åãè§£é€ãããå¯äžã®çç±ã¯ãã¿ã€ãã®äžäžèŽã ãã§ã¯ãããŸããã ãŸãã32ãããæ°ã®ç®è¡æŒç®ããã·ã£ãŒãåããããåã®æŒç®ã®çµæããªãŒããŒãããŒãåŒãèµ·ãããå ŽåããŸãã¯ååšããªãé
åã€ã³ããã¯ã¹
arr[idx]
ïŒç¯å²å€ãééã®ããçé
åãªã©ïŒã«ã¢ã¯ã»ã¹ããå Žåã«ãçºçããŸãã ãïŒã

äžèšã®æ¬ ç¹ãè§£æ¶ããã«ã¯æé©åãå¿
èŠã§ããããšãæããã«ãªããŸãã
æé©åãããŠããªãã³ãŒã | æé©åãããã³ãŒã |
---|
åæäœã«ã¯æªç¥ã®å¯äœçšããããå®å
šãªã»ãã³ãã£ã¯ã¹ãå®è£
ããŸãã | ã³ãŒãã®ç¹æ®åã¯äžç¢ºå®æ§ãæé€ãŸãã¯å¶éããå¯äœçšã¯å³å¯ã«ç¥ãããŠããŸãïŒããšãã°ããªãã»ããã«ããããããã£ã®åŒã³åºãã«ã¯ãããããããŸããïŒ |
åæäœã¯ç¬èªã«è¡ãããç¬ç«ããŠåŠç¿ããçµéšãé£äººãšå
±æããŸãã | æäœã¯ãäžç·ã«æé©åãããäœã¬ãã«ã®IRåœä»€ã«åè§£ãããåé·æ§ãæé€ãããŸãã |

ãã¡ãããç¹å®ã®åœ¢åŒã®ãªããžã§ã¯ãçšã«IRãæ§ç¯ããããšã¯ãæé©åãã§ãŒã³ã®æåã®ã¹ãããã«ãããŸããã äžé衚çŸã圢æããããšãã³ã³ãã€ã©ã¯ãããæ°å調ã¹ãŠãäžå€åŒãæ€åºããäœåãªéšåãåãåããŸãã ãã®ã¿ã€ãã®åæã¯éåžžãããã·ãŒãžã£ã®ç¯å²ã«å¶éãããŠãããã³ã³ãã€ã©ãŒã¯ååŒã³åºãã§èããããææªã®å¯äœçšãèæ
®ããããšãäœåãªããããŸãã åŒã³åºãã¯ãæå®ãããŠããªãæäœã§é衚瀺ã«ã§ããããšã«æ³šæããŠãã ãããããšãã°ã
+
æŒç®åã¯
valueOf
ãåŒã³åºãããšãã§ããããããã£ã«ã¢ã¯ã»ã¹ãããšãã®ã²ãã¿ãŒã¡ãœãããåŒã³åºãããŸãã ãããã£ãŠãæåã®æ®µéã§æäœãæå®ã§ããªãã£ãå Žåããªããã£ãã€ã¶ãŒã®åŸç¶ã®ãã¹ãŠã®ãã¹ã¯ãã®æäœã§ã€ãŸãããŸãã
åé·ãªåœä»€ã®æãäžè¬çãªã¿ã€ãã®1ã€ã¯ãåããªããžã§ã¯ããåã圢ç¶ã§ããããšãåžžã«ãã§ãã¯ããããšã§ãã ããã¯ãæåã®äžé衚çŸãäžèšã®äŸãã颿°
g
æ¢ãæ¹æ³ã§ãã
CheckMap v0, {x,y} ;; shape check v1 Load v0, @12 ;; load ox CheckMap v0, {x,y} v2 Load v0, @12 ;; load ox i3 Mul v1, v2 ;; ox * ox CheckMap v0, {x,y} v4 Load v0, @16 ;; load oy CheckMap v0, {x,y} v5 Load v0, @16 ;; load oy i6 Mul v4, v5 ;; oy * oy i7 Add i3, i6 ;; ox * ox + oy * oy
ããã§ã¯ã倿°
v0
ãªããžã§ã¯ãã®åœ¢ç¶ã4åãã§ãã¯ãããŸããããã§ãã¯ã®éã«å€æŽãåŒãèµ·ããå¯èœæ§ã®ããæäœã¯ãããŸããã æ°é
ãã®ããèªè
ã¯ã
v2
ãš
v5
ããŒããåé·ã§ããããšã«æ°ä»ãã§ããããã³ãŒããäžæžããããªãããã§ãã 幞ããªããšã«ããã®åŸã®
ã°ããŒãã«çªå·ä»ãã®ãã¹ã«ããããããã®æç€ºãåé€ãããŸãã
;; CheckMap v0, {x,y} v1 Load v0, @12 i3 Mul v1, v1 v4 Load v0, @16 i6 Mul v4, v4 i7 Add i3, i6
äžèšã®ããã«ããããã®åœä»€éã«å¯äœçšã®ããæäœããªãã£ãããã«ããããã®åœä»€ãåé€ããããšãå¯èœã«ãªããŸããã ããŠã³ããŒã
v1
ãš
v2
éã«åŒã³åºãããã£ãå Žåã
v0
ã®ãªããžã§ã¯ãã®åœ¢ç¶ã倿Žã§ãããšæ³å®ããå¿
èŠãããããã
v2
ã®åœ¢åŒã®ç¢ºèªã¯å¿
é ã§ãã
æäœãåçžã§ã¯ãªãå Žåãã³ã³ãã€ã©ã¯äžèšã®äŸãšåãããã©ãŒã ã®æ€èšŒãšå
·äœåãããæäœãã®æãåçŽã«ãšãããšã¯ã§ããŸããã ã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ã¯ãããã€ãã®ãã©ãŒã ã«é¢ããæ
å ±ãå«ãŸããŠããŸãã ãããã®ããããã䜿çšããŠãããã ããçµã³ä»ãããšãæ®ãã¯ãã¹ãŠæé©åè§£é€ã«ã€ãªãããŸãããããã¯æãŸãããããŸããã 代ããã«ãã³ã³ãã€ã©ã¯
æ±ºå®æšãæ§ç¯
ããŸã ã ããšãã°ã
ox
ããããã£ã«ã¢ã¯ã»ã¹ããã€ã³ã©ã€ã³ãã£ãã·ã¥ããã©ãŒã AãBãCã®ã¿ã«
ox
å Žåãå±éãããæ§é ã¯æ¬¡ã®ããã«ãªããŸãïŒããã¯æ¬äŒŒã³ãŒãã§ããå®éã
å¶åŸ¡ãããŒã°ã©ããæ§ç¯ãããŸãïŒã
var o_x if ($GetShape(o) === A) { o_x = $LoadByOffset(o, offset_A_x) } else if ($GetShape(o) === B) { o_x = $LoadByOffset(o, offset_B_x) } else if ($GetShape(o) === C) { o_x = $LoadByOffset(o, offset_C_x) } else { // ox A, B, C // , ** $Deoptimize() } // , o // - A, B C. , //
ã¢ãã¢ãŒãã£ãã¯ã³ãŒã«ã«ã¯ãããªã¢ãŒãã«ã¯ãªãéåžžã«äŸ¿å©ãªããããã£ã1ã€ãããŸããå¯äœçšãäŒŽãæ¬¡ã®æäœãŸã§ããªããžã§ã¯ãã®åœ¢ç¶ã倿Žãããªãããšãä¿èšŒãããŸãã ããªã¢ãŒãã£ãã¯åŠçã¯ãããªããžã§ã¯ããããã€ãã®åœ¢åŒã®1ã€ãæã£ãŠããããšãã匱ãä¿èšŒã®ã¿ãæäŸããæé©åã¯ã»ãšãã©ã§ããŸããïŒæé©ãªå ŽåãæåŸã®æ¯èŒãšæé©åè§£é€ã®ãããã¯ãåé€ããããšã¯å¯èœã§ãããV8ã¯ãããè¡ããŸããïŒã
äžæ¹ãV8ã¯ããã£ãŒã«ãããã¹ãŠã®ãã©ãŒã ã§åããªãã»ããã«ããå Žåã广çãªäžé衚çŸã圢æã§ããŸãã ãã®å Žåãããªã¢ãŒãã£ãã¯ãã©ãŒã æ€èšŒã䜿çšãããŸãã
// , A, B C - $TypeGuard(o, [A, B, C]) // , var o_x = $LoadByOffset(o, offset_x)
2ã€ã®ããªã¢ãŒãã£ãã¯ãã§ãã¯ã®éã«å¯äœçšã®ããæäœããªãå Žåãã¢ãã¢ãŒãã£ãã¯ãã§ãã¯ã®å Žåã®ããã«ã2çªç®ã®ããªã¢ãŒãã£ãã¯ãã§ãã¯ãäžèŠãšããŠåé€ã§ããŸãã
ã€ã³ã©ã€ã³ãã£ãã·ã¥ããªããžã§ã¯ãã®å¯èœãªåœ¢åŒã«ã€ããŠã³ã³ãã€ã©ã«æ
å ±ãæž¡ããšãã³ã³ãã€ã©ã¯ã°ã©ãå
ã§äžé©åã«åå²ããããšã«ãããåãªããžã§ã¯ãã«å¯ŸããŠäœããã¹ããã倿ã§ããŸãã ãã®å Žåããããã«ç°ãªãã°ã©ããçæãããæçµçã«ã¯æé©åè§£é€ã§ã¯ãªããäžè¬åãããæäœãè¡ãããŸãã
var o_x if ($GetShape(o) === A) { o_x = $LoadByOffset(o, offset_A_x) } else if ($GetShape(o) === B) { o_x = $LoadByOffset(o, offset_B_x) } else if ($GetShape(o) === C) { o_x = $LoadByOffset(o, offset_C_x) } else { // , ox . // // : o_x = $LoadPropertyGeneric(o, 'x') // ^^^^^^^^^^^^^^^^^^^^ } // "" // , //
å Žåã«ãã£ãŠã¯ãã³ã³ãã€ã©ã¯æäœãæå®ãããšããèããå®å
šã«æŸæ£ããå ŽåããããŸãã
- 广çã«å
·äœåããæ¹æ³ã¯ãããŸãã
- æäœã¯ããªã¢ãŒãã£ãã¯ã§ãããã³ã³ãã€ã©ã¯æ±ºå®ããªãŒã®æ§ç¯æ¹æ³ãç¥ããŸããïŒããã¯ä»¥åã«
arr[i]
ããªã¢ãŒãã£ãã¯åŒã³åºãã§çºçããŸãããããã§ã«ä¿®æ£ãããŠããŸãïŒ - æäœãã€ã³ã¹ã¿ã³ã¹åã§ããåã«é¢ããæ
å ±ã¯ãããŸããïŒã³ãŒããå®è¡ãããããšããªããã¬ããŒãžã³ã¬ã¯ã¿ãŒããã©ãŒã ã«é¢ããåéãããæ
å ±ãåé€ãããªã©ïŒ
ãããã®ïŒããªããŸããªïŒå Žåãã³ã³ãã€ã©ã¯äžé衚çŸã®äžè¬åããŒãžã§ã³ãçæããŸãã
ããã©ãŒãã³ã¹ãžã®åœ±é¿
ãã®çµæã次ã®ããšãã§ããŸãã
- åçžæäœã¯æãç°¡åã«æé©åããããªããã£ãã€ã¶ãŒã«ã¢ã¯ã·ã§ã³ã®äœå°ãäžããŸãã ãã«ã¯ãèšãããã«-ã éã«è¿ãã¿ã€ãïŒ ã
- ãã©ãŒã æ€èšŒãå¿
èŠãšããäœã¬ãã«ã®ããªã¢ãŒãã£ãºã ããŸãã¯åçžãããé
ãæ±ºå®ããªãŒã䜿çšããæäœïŒ
- æ±ºå®æšã¯å®è¡ã®æµããè€éã«ããŸãã ã³ã³ãã€ã©ãåæ
å ±ãé
åžããäžèŠãªåœä»€ãåé€ããããšã¯ããã«å°é£ã§ãã æ¡ä»¶ä»ãããªãŒã®é·ç§»ããããŒãããããµã€ã¯ã«ã«é¥ããšãããã©ãŒãã³ã¹ãæãªãå¯èœæ§ããããŸãã
- ããªã¢ãŒãã£ãã¯ãã©ãŒã ãã§ãã¯ã¯æé©åãããã»ã©åŠšãããããã€ãã®åé·ãªåœä»€ãåé€ã§ããŸãããã¢ãã¢ãŒãã£ãã¯ãªåœä»€ãããé
ããªããŸãã ããã©ãŒãã³ã¹ãžã®åœ±é¿ã¯ãããã»ããµãæ¡ä»¶åå²ãã©ã®çšåºŠåŠçãããã«ãã£ãŠç°ãªããŸãã
- ã¡ã¬ã¢ãŒãã£ãã¯ãŸãã¯é«åºŠãªããªã¢ãŒãã£ãã¯ãªæäœã¯ãŸã£ããæå®ãããŠããããäžé衚çŸã§ã¯åŒã³åºããè¡ãããCPUã®æé©åãšããã©ãŒãã³ã¹ã«å¯Ÿãããã¹ãŠã®çµæãçããŸãã
翻蚳è
ã®ã¡ã¢ïŒèè
ã¯ãã€ã¯ããã³ãããŒã¯ãžã®ãªã³ã¯ãæäŸããŸãããããµã€ãèªäœã¯æ©èœããªããªããŸãããéå
±æ
ãã®èšäºãããŸãã«ãåºç¯ã«ãªããªãããã«ãæå³çã«ããã€ãã®å®è£
ã®è©³çްã«ã¯è§ŠããŸããã§ããã
ãã©ãŒã
ãã©ãŒã ïŒãŸãã¯é衚瀺ã®ã¯ã©ã¹ïŒã®é
çœ®æ¹æ³ãèšç®æ¹æ³ããªããžã§ã¯ããžã®å²ãåœãŠæ¹æ³ã«ã€ããŠã¯èª¬æããŸããã§ããã äžè¬çãªã¢ã€ãã¢ã¯
ãAWP2014ã§ã® 以åã®èšäºãŸãã¯
ãã¬ãŒã³ããŒã·ã§ã³ããå
¥æã§ããŸãã
JSä»®æ³ãã·ã³ã®ããã©ãŒã ãã®æŠå¿µãã®ãã®ããã¥ãŒãªã¹ãã£ãã¯ãªè¿äŒŒã§ããããšãèŠããŠããå¿
èŠããããŸãã 人ã®èŠç¹ããèŠãå Žåã2ã€ã®ãªããžã§ã¯ãã®åœ¢ç¶ã¯åãã§ãã£ãŠããæ©æ¢°ã®èŠç¹ããèŠããšç°ãªãå ŽåããããŸãã
function A() { this.x = 1 } function B() { this.x = 1 } var a = new A, b = new B, c = { x: 1 }, d = { x: 1, y: 1 } delete dy
JSã®ãªããžã§ã¯ãã¯èŸæžãšããŠæ°æ¥œã«å®è£
ãããŠãããããã©ã³ãã ããªã¢ãŒãã£ãºã ãé©çšã§ããŸãã
function A() { this.x = 1; } var a = new A(), b = new A();
æå³çãªå€å
äœæããããªããžã§ã¯ãã®åœ¢ç¶ã倿Žã§ããªãå€ãã®èšèªïŒJavaãCïŒãDartãC ++ãªã©ïŒã§ã¯ãããªã¢ãŒãã£ãºã ããµããŒããããŠããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã«åºã¥ããŠç¹å®ã®å®è£
ã«å¿ããŠå®è¡ãããã³ãŒããèšè¿°ããæ©èœã¯ãéåžžã«éèŠãªæœè±¡åã¡ã«ããºã ã§ãã éçã«åä»ããããèšèªã§ã¯ãããªã¢ãŒãã£ãºã ã¯åæ§ã®æ¹æ³ã§ããã©ãŒãã³ã¹ã«åœ±é¿ããŸãã
åœç¶ã®ããšãªãããJVMã¯ã€ã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããŠ
invokeinterface
ããã³
invokevirtual
ãæé©åã
invokevirtual
ã
ãã¹ãŠã®ãã£ãã·ã¥ãåãããã«åœ¹ç«ã€ããã§ã¯ãããŸããã
äžéšã®ãã£ãã·ã¥ã¯ãªããžã§ã¯ãã®åœ¢åŒã«åºã¥ããŠããªããããã³/ãŸãã¯ä»ã®ãã£ãã·ã¥ããã容éãå°ãªãããšã«çæããŠãã ããã ããšãã°ã颿°åŒã³åºãã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ã¯ãåæåãããŠããªããåçžããŸãã¯å€§åœ¢ã®3ã€ã®ç¶æ
ãããããŸããã
颿°ãåŒã³åºãããã«ãªããžã§ã¯ãã®åœ¢ç¶ã¯éèŠã§ã¯ãããŸãããã颿°ãªããžã§ã¯ãèªäœã¯ãã£ãã·ã¥ããããããäžéã®ããªã¢ãŒãã£ãã¯ç¶æ
ã¯ãããŸããã function inv(cb) { return cb(0) } function F(v) { return v } function G(v) { return v + 1 } inv(F)
颿°ãinv
æé©åãããã€ã³ã©ã€ã³ãã£ãã·ã¥ãåçžç¶æ
ã«ããå Žåããªããã£ãã€ã¶ãŒã¯é¢æ°ã®æ¬äœãåŒã³åºãã®å Žæã«åã蟌ãããšãã§ããŸãïŒããã¯ãé »ç¹ã«åŒã³åºãããå Žæã®çã颿°ã«ãšã£ãŠç¹ã«éèŠã§ãïŒããã£ãã·ã¥ãã¡ã¬ã¢ãŒãã£ãã¯ç¶æ
ã«ããå Žåããªããã£ãã€ã¶ãŒã¯ã©ã®é¢æ°ã®ã©ã®ããã£ãåã蟌ãããšãã§ããããç¥ããªããããäžè¬åãããåŒã³åºãæŒç®åã¯äžé衚çŸã®ãŸãŸã«ãªããŸããäžæ¹ã次ã®åœ¢åŒã®ã¡ãœããã®åŒã³åºãom(...)
ããããã£åç
§ã®ããã«æ©èœããŸããã¡ãœããåŒã³åºãã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ãäžéã®ããªã¢ãŒãã£ãã¯ç¶æ
ãæã€ããšãã§ããŸãã V8ä»®æ³ãã·ã³ã¯ãããããã£ãšåãæ¹æ³ã§ããã®ãããªé¢æ°ãžã®åŒã³åºããåçžãå€çžãããã«ã¯ã¡ã¬ã¢ã«ãã£ãã¯åœ¢åŒã§åã蟌ãããšãã§ããŸããå¯äžã®å¶éããããŸãïŒã¡ãœããã¯ãªããžã§ã¯ãã®åœ¢åŒã§å«ãŸããå¿
èŠããããŸããå®éãom(...)
äžåºŠã«2ã€ã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ã䜿çšããŸãã1ã€ã¯ããããã£ãããŒããããã1ã€ã¯é¢æ°ãçŽæ¥åŒã³åºãããã«äœ¿çšããŸãã颿°ã®äžèšã®äŸã®ããã«ã2çªç®ã«ã¯2ã€ã®ç¶æ
ãããããŸããcb
ããããã£ãŠããã®ç¶æ
ã¯åŒã³åºãã®æé©åäžã«ç¡èŠãããããããã£ã«ã¢ã¯ã»ã¹ããã€ã³ã©ã€ã³ãã£ãã·ã¥ã®ç¶æ
ã®ã¿ã䜿çšãããŸãã function inv(o) { return o.cb(0) } var f = { cb: function F(v) { return v }, }; var g = { cb: function G(v) { return v + 1 }, }; inv(f) inv(f)
äžèšã®äŸf
ã§g
ã¯ã圢ç¶ãç°ãªãããšã¯äºæ³å€ã®ããã«æããããããããŸãããããã¯ã颿°ããªããžã§ã¯ãããããã£ã«å²ãåœãŠããšãV8ã¯ïŒå¯èœã§ããã°ïŒãªããžã§ã¯ãèªäœã§ã¯ãªããªããžã§ã¯ãã®ãã©ãŒã ã«ã¢ã¿ããããããšããããã§ããäžèšã®äŸã§f
ã¯formã{c: F}
ããããã©ãŒã èªäœã¯ã¯ããŒãžã£ãŒãåç
§ããŠããŸãããã®ãã©ãŒã ã®åã®ãã¹ãŠã®äŸã«ã¯ãç¹å®ã®ããããã£ã®ååšã®å
åã®ã¿ãå«ãŸããŠããŸããããã®å Žåããã®å€ã¯ä¿æããããã©ãŒã ã¯JavaãC ++ãªã©ã®èšèªã®ã¯ã©ã¹ã«äŒŒããã®ã«ãªããŸãããã¡ãããåŸã§ããããã£ãå¥ã®é¢æ°ã§äžæžããããšãV8ã¯ã¯ã©ã¹ãšã¡ãœããã®é¢ä¿ãšã¯èŠããªããªããšèŠãªãããã©ãŒã ã倿ŽãããŸãã var f = { cb: function F(v) { return v }, }; // f {cb: F} f.cb = function H(v) { return v - 1 } // f {cb: *}
V8ããªããžã§ã¯ãã®ãã©ãŒã ãã©ã®ããã«æ§ç¯ããã³ç¶æãããã«ã€ããŠã¯ãå¥ã®å€§ããªèšäºãæžã䟡å€ããããŸããããããã£ãžã®ãã¹ã®è¡šçŸ
ãã®æç¹ã§ãããããã£ã«ã¢ã¯ã»ã¹ããã€ã³ã©ã€ã³ãã£ãã·ã¥ã¯ox
ãã¯ã©ã¹å
ã®åœ¢ç¶ããªãã»ãããæ¯èŒããèŸæžã®ããDictionary<Shape, int>
ã§ããå®éããã®ãããªè¡šçŸã¯æ·±ããäŒããŸãããããããã£ã¯ããããã¿ã€ããã§ãŒã³å
ã®ãªããžã§ã¯ãã®1ã€ã«å±ããŠããå Žåããã¢ã¯ã»ã¹ã¡ãœãããæã€å ŽåããããŸããæããã«ãã²ãã¿ãŒã»ãã¿ãŒãæã€ããããã£ã¯ãããŒã¿ãæã€éåžžã®ããããã£ãããç¹å®æ§ãäœããšèŠãªãããŸããããšãã°ããªããžã§ã¯ão = {x: 1}
ã¯ãä»®æ³ãã·ã³ã®ã¡ãœããã䜿çšããŠãããããã£ãç¹å¥ãªé衚瀺ã¹ãããã«å€ãããŒãããã³ä¿åãããªããžã§ã¯ããšããŠè¡šãããšãã§ããŸãã // , o = { x: 1 } var o = { get x () { return $LoadByOffset(this, offset_of_x) }, set x (value) { $StoreByOffset(this, offset_of_x, value) } // / // JS- }; $StoreByOffset(o, offset_of_x, 1)
ãšããã§ãããããã£ã¯Dart VMã§ã»ãŒãã®ããã«å®è£
ãããŠããŸãããã®ããã«èŠãã°ãDictionary<Shape, Function>
ãã©ãŒã ãã¢ã¯ã»ãµãŒé¢æ°ãšæ¯èŒããããšã§ãã€ã³ã©ã€ã³ãã£ãã·ã¥ããã©ãŒã ã«è¡šç€ºãããå¯èœæ§ãé«ããªããŸãããªãã»ããã®ããçŽ æŽãªè¡šçŸãšã¯ç°ãªãããããã¿ã€ããã§ãŒã³ãã²ãã¿ãŒã»ãã¿ãŒãES6ã®ãããã·ãªããžã§ã¯ãã®ããããã£ãèšè¿°ããããšãã§ããŸããæºåçžæ¡ä»¶
V8ã®äžéšã®ã€ã³ã©ã€ã³ãã£ãã·ã¥ã«ã¯ãpremonomorphicãšåŒã°ããå¥ã®ç¶æ
ããããŸããäžåºŠã ãã¢ã¯ã»ã¹ããããã£ãã·ã¥ã®ã³ãŒããã³ã³ãã€ã«ããŸãããããŸãç¥ãããŠããªãå®è£
æ©èœã§ããããããã®æ¡ä»¶ã«ã€ããŠã¯èšåããŸããã§ãããæçµçãªããã©ãŒãã³ã¹ã®ãã³ã
æé«ã®ããã©ãŒãã³ã¹ã®ãã³ãã¯ããã€ã«ã«ãŒãã®ãŒã®æ¬ãHow to Stop Worrying and Start Livingãã®ã¿ã€ãã«ããåŒçšã§ããŸããå®éãå€åãå¿é
ããããšã¯éåžžç¡æå³ã§ãã代ããã«ãéåžžã®ããŒã¿ã䜿çšããŠã³ãŒããå®è¡ãããããã¡ã€ã©ãŒã§ããã«ããã¯ãæ¢ããŸããJSã«é¢é£ããå Žåã¯ãã³ã³ãã€ã©ãŒãçæããäžé衚çŸã確èªããå¿
èŠããããŸãããããŠãããŒãããããµã€ã¯ã«ã®éäžã§ãååã®äžã«åœä»€ã衚瀺ãããXYZGeneric
ããäœãã屿§ã§ããŒã¯ãããŠããå Žåchanges [*]
ïŒã€ãŸããããã¹ãŠã倿ŽãããïŒãããããïŒãããŠãã®åŸã®ã¿ïŒå¿é
ãå§ããããšãã§ããŸãã