åå ã
ArrayBufferãš
SharedArrayBufferã«ã€ããŠã®è°è«ã®æºåãšããŠãã¡ã¢ãªç®¡çãžã®ããŸããŸãªã¢ãããŒããæ€èšããŸããã èŠããŠããå¿
èŠããããŸãããJSãšã³ãžã³ã¯ã¡ã¢ãªãæäœããéã«ä»²ä»åœ¹ã®åœ¹å²ãæãããŸãããæ°ãããªããžã§ã¯ãã¯ããã°ã©ããŒã«ããã€ãã®æåããŒã«ãæäŸããŸãã ãªããããå¿
èŠãªã®ã§ããããïŒ
JavaScriptãšã¡ã¢ãªç®¡ç
èªåã¡ã¢ãªç®¡çã¯ãéçºã®å®¹æããšè¿œå ã®ã·ã¹ãã è² è·ãšã®éã®åŠ¥åã§ãã å Žåã«ãã£ãŠã¯ããã®è¿œå ã®è² è·ãããã©ãŒãã³ã¹ã®åé¡ã«ã€ãªãããŸãã
èªåã¡ã¢ãªç®¡çã¯éçºãç°¡çŽ åããŸãããããã°ã©ã ã®ããã©ãŒãã³ã¹ã«åœ±é¿ããŸãããšãã°ãJSã§å€æ°ãäœæããå Žåããšã³ãžã³ã¯ãã®å€æ°ãã©ã®ãããªåã«ãªãããã¡ã¢ãªã§ã©ã®ããã«è¡šçŸããå¿
èŠãããããæšæž¬ããå¿
èŠããããŸãã ãã®ãããªæšæž¬ã¯ããšã³ãžã³ãå®éã«å€æ°ãä¿åããã®ã«å¿
èŠãªéãããå€ãã®ã¡ã¢ãªãäºçŽãããšããäºå®ã«ã€ãªãããŸãã ããŒã¿ã®ã¿ã€ãã«ãã£ãŠã¯ãå²ãåœãŠãããã¡ã¢ãªãå¿
èŠãªãµã€ãºã®2ã8åã«ãªãå ŽåããããŸãã ããã¯ãã¡ã¢ãªã®éå¹ççãªäœ¿çšã«ã€ãªããå¯èœæ§ããããŸãã
ããã«å ããŠãJSãªããžã§ã¯ããäœæããã³äœ¿çšããããã®ãã³ãã¬ãŒãã«ãã£ãŠã¯ãã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãè€éã«ãªãå ŽåããããŸãã ããã°ã©ããã¡ã¢ãªãæåã§ç®¡çããå Žåãç¹å®ã®ãããžã§ã¯ãã®ããŒãºãæºããã¡ã¢ãªã®å²ãåœãŠãšè§£æŸã®æŠç¥ãéžæããããšã«ããããã®ãããªåé¡ãåé¿ã§ããŸãã
ãã ããå€ãã®å Žåãèªåã¡ã¢ãªç®¡çã¯ç¹å®ã®åé¡ãåŒãèµ·ãããŸããã ã»ãšãã©ã®JSã¢ããªã±ãŒã·ã§ã³ã¯ãããã°ã©ããŒãæåã®ã¡ã¢ãªç®¡çã«ã€ããŠçå£ã«èããããã«ãããã©ãŒãã³ã¹ãããã»ã©èŠæ±ããŸããã ãŸããå€ãã®å Žåãæåã®ã¡ã¢ãªç®¡çã¯çç£æ§ãå°ãªããšãããã°ã©ãã®çç£æ§ã«æªåœ±é¿ãåãŒãå¯èœæ§ãããããŸãã
ãã ããåªå
é äœãããã°ã©ã ã®é床ã§ããå Žåã¯ãArrayBufferãšSharedArrayBufferã«ç®ãåããããšãçã«ããªã£ãŠããŸãã
æåã¡ã¢ãªç®¡çãšã¯ãã³ãŒãã§çºçããŠããããšãããå®å
šã«å¶åŸ¡ããé«æ§èœãœãªã¥ãŒã·ã§ã³ãå®çŸããããšãæå³ããŸãããããå€ãã®ã¡ã³ã¿ã«ã¯ãŒã¯ãšããã°ã©ã èšèšãžã®æ³šæãå¿
èŠã§ããArrayBufferã®ä»çµã¿
äžè¬ã«ãArrayBufferãšã®ããåãã¯ãä»ã®JSé
åã®æäœã«äŒŒãŠããŸãã ãã ããéèŠãªæ©èœã1ã€ãããŸãã ããã¯ãArrayBufferã䜿çšãããšããããã°ã©ããŒããªããžã§ã¯ããæååã®ãããªãã®ããã®äžã«å
¥ããããšãã§ããªããšããäºå®ã«ãããŸãã ãã®é
åã«æžã蟌ãããšãã§ããã®ã¯ãã€ãã®ã¿ã§ãããã¯æ°åãšããŠè¡šãããšãã§ããŸãã
å·ŠåŽã®éåžžã®é
åã«ã¯ãæ°åããªããžã§ã¯ããæååãªã©ãå«ããããšãã§ããŸãã ArrayBufferã«ã¯ãã€ãã®ã¿ãå«ããããšãã§ããŸãå®éãArrayBufferã«çŽæ¥ãã€ããè¿œå ããªãããšã«æ³šæããŠãã ããã ãã®ãªããžã§ã¯ãã¯ããã€ãã®ãµã€ãºããããŸããŸãªæ°å€ããã€ãã«å€æããæ¹æ³ãç¥ããŸããã
ArrayBufferã¯ãåãè¡ã«æžã蟌ãŸãããŒããš1ã®ã·ãŒã±ã³ã¹ãšããŠè¡šãããšãã§ããŸãã ãã®ãªããžã§ã¯ãã¯ãèŠçŽ ã®å¢çãã©ãã«ããããèªèããŠããŸããã
ãŒããš1ã®ã·ãŒã±ã³ã¹ãšããŠã®ArrayBufferArrayBufferããã®çããŒã¿ãæå³ã®ãããã®ãšããŠèªèãããŒããš1ã®ã¹ããªãŒã ããããã¯ã«åå²ããã«ã¯ã
DataViewãªããžã§ã¯ããŸãã¯
åä»ãé
åã«ã©ããããå¿
èŠããããŸãã
ããšãã°ã
Int8Arrayåã®é
åã
ã©ãããŒãšããŠäœ¿çšãããšãArrayBufferã«æ ŒçŽãããŠãããã®ã8ãããã®ãã©ã°ã¡ã³ãã«åå²ããããšããäºå®ã«ã€ãªãããŸãã
ãŒããš1ã®ã·ãŒã±ã³ã¹ã¯ã8ãããã®ãããã¯ã«åå²ãããŸããã®ãããªç¶æ³ã§åä»ã
Uint16Arrayé
åã䜿çšãããšãArrayBufferã®å
容ã16ãããã®ãã©ã°ã¡ã³ãã«åå²ããããã®ããŒã¿ã笊å·ãªãæŽæ°ãšããŠè§£éãããããã«ãªããŸãã
ãŒããš1ã®ã·ãŒã±ã³ã¹ã¯16ãããã®ãããã¯ã«åå²ãããŸãåãArrayBufferã¯ãè€æ°ã®ã©ãããŒã®ããŒã¹ãšããŠæ©èœã§ããŸãã ãã®ã¢ãããŒãã§ã¯ãåãæäœã§ç°ãªãçµæãåŸãããŸãã
ããšãã°ãInt8Arrayåã®é
åãä»ããŠã¢ã¯ã»ã¹ãããArrayBufferã®æåãš2çªç®ã®èŠçŽ ã¯ãUint16Arrayãä»ããŠArrayBufferãæäœãããšãã«ååŸãããæåãš2çªç®ã®èŠçŽ ãšã¯ç°ãªãããšã以äžã«ç€ºããŸãã åããããã·ãŒã±ã³ã¹ã¯ãç°ãªãã¿ã€ãã®ããŒã¿æ§é ãä»ããŠäœæ¥ããå Žåãç°ãªã£ãŠèŠããŸãã
ç°ãªãã©ãããŒã䜿çšããŠåãArrayBufferã«ã¢ã¯ã»ã¹ãããã®ç¶æ³ã§ã¯ãArrayBufferã¯éåžžã®RAMãšéåžžã«ãã䌌ãŠããŸãã Cã®ãããªèšèªã§å©çšå¯èœãªãã€ã¬ã¯ãã¡ã¢ãªã¢ã¯ã»ã¹ã®ãããªãã®ããšãã¥ã¬ãŒãããŸãã
JSããã°ã©ããŒã«ã¡ã¢ãªãžã®çŽæ¥ã¢ã¯ã»ã¹ãäžããæ¹ãè¯ããã©ãããArrayBufferãè¶
ããè¿œå ã®æœè±¡åã¬ãã«ãå¿
èŠãªçç±ãçåã«æããããããŸããã ããã¯ãçŽæ¥ã¡ã¢ãªã¢ã¯ã»ã¹ãã»ãã¥ãªãã£äžã®åé¡ã®åå ã«ãªãå¯èœæ§ãããããã§ãã
SharedArrayBufferãšã¯äœã§ããïŒ
SharedArrayBufferãšã¯äœãã«ã€ããŠè©±ãã«ã¯ããŸãJavaScriptãã³ãŒããšäžŠè¡ããŠå®è¡ãããæ¹æ³ãç解ããå¿
èŠããããŸãã
䞊è¡æ§ã¯ããã°ã©ã ãé«éåããŸãã ããã¯ãããšãã°ãããŒã¿åŠçãããé«éã«å®è¡ãããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«é¢é£ããã€ãã³ãã«å°ãªãé
延ã§å¿çãããããã®ã«åœ¹ç«ã¡ãŸãã 䞊ååããäºå®ã®ã¿ã¹ã¯ã¯ãæåã«ãµãã¿ã¹ã¯ã«åå²ããå¿
èŠããããŸãã
å
žåçãªJSã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¡ã€ã³ã¹ã¬ããããã¹ãŠã®äœæ¥ãè¡ããŸãã 圌ã¯ãJavaScriptã³ãŒããDOMãããã³WebããŒãžã®ã¬ã€ã¢ãŠããæ
åœãããã«ãµã€ã¯ã«éçºè
ãé£æ³ãããŸãã
ã¡ã€ã³ã¹ã¬ããã®è² è·ã軜æžãããã®ã¯ãã¹ãŠãã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æçãªå¹æããããããŸãã ç¹å®ã®ç¶æ³ã§ã¯ãArrayBufferã䜿çšãããšãã¡ã€ã³ã¹ã¬ããã«å²ãåœãŠãããäœæ¥éãæžããããšãã§ããŸãã
ã¡ã€ã³ã¹ã¬ããããããŒãã«ã®äžã«æšªãããæžé¡ã®å±±ã§è¡šãããéåžžã®äœæ¥ã®äžéšãã解æŸãããšãããã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ã«æçãªåœ±é¿ãäžããŸãããã ããã¡ã€ã³ã¹ã¬ããã®äœæ¥éãæžããã ãã§ã¯äžååãªå ŽåããããŸãã ã¡ã€ã³ã¹ã¬ããã«ã¢ã·ã¹ã¿ã³ããå¿
èŠã«ãªãããšããããŸãã
ã»ãšãã©ã®ããã°ã©ãã³ã°èšèªã§ã¯ãããã€ãã®ã¿ã¹ã¯ã¯éåžžãã¹ã¬ãããŸãã¯ããã»ã¹ãšåŒã°ããæ§é ã䜿çšããŠäžŠè¡ããŠå®è¡ãããŸãã 圌ãã®å
±åäœæ¥ã¯ãè€æ°ã®äººã
ããããžã§ã¯ãã«åãçµãã§ããæ§åãæãèµ·ããããŸãã ãããžã§ã¯ãã®ãã¬ãŒã ã¯ãŒã¯å
ã§è§£æ±ºãããã¿ã¹ã¯ãäºãã«ååã«ç¬ç«ããŠããå Žåãè€æ°ã®ã¹ããªãŒã ã§äžŠè¡ããŠè§£æ±ºã§ããŸãã
JavaScriptã§ã¯ãããã¯
Web Workers APIã䜿çšããŠå®è£
ãã
ãŸã ã ç¹ã«ãããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ãæäœããããã®ããŒã«ã§ããã¿ã€ã
workerã®ãªããžã§ã¯ãã«ã€ããŠè©±ããŸãã JSã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã¯ãä»ã®èšèªã®ã¹ã¬ãããããã»ã¹ãšã¯å°ãç°ãªããŸãã ç¹ã«ãããã©ã«ãã§ã¯ãå
±æã¡ã¢ãªã¯ãããŸããã
çŸåšã2ã€ã®ã¹ã¬ãããäœæ¥ãè¡ã£ãŠããŸãã ããããã®ããŒãã«ã®çŽã®å±±ã¯ãåã®å³ã®ååã§ãã åã¹ã¬ããã¯ãå¥ã®ã¹ã¬ããã«é¢é£ä»ããããŠããªãç¬èªã®ã¡ã¢ãªé åã§åäœããŸããã€ãŸããããã¹ããªãŒã ããå¥ã®ã¹ããªãŒã ã«ç¹å®ã®ããŒã¿ã転éããã«ã¯ããã®ããŒã¿ãã¡ã¢ãªé åã«ã³ããŒããå¿
èŠããããŸãã ããã¯ã
postMessageé¢æ°ã䜿çšããŠè¡ãããŸãã
postMessageé¢æ°ã¯ãæž¡ããããªããžã§ã¯ããã·ãªã¢ã«åããç®çã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«æž¡ããŸããããã§ããããã¯éã·ãªã¢ã«åãããã¡ã¢ãªã«æžã蟌ãŸããŸãã
postMessageé¢æ°ã䜿çšãããšãã¹ã¬ããéã®ããŒã¿äº€æãæŽçã§ããŸãããã®æ¹æ³ã§ã¹ã¬ããéã§ããŒã¿ã転éããã®ã¯ãããªãé
ãããã»ã¹ã§ãã
ArrayBufferã«èšé²ãããŠããããŒã¿ãªã©ãäžéšã®ã¿ã€ãã®ããŒã¿ã䜿çšããŠãããããã¡ã¢ãªè»¢éãå®è£
ã§ããŸãã 2ã¹ã¬ããã®äŸã§ã¯ãããã¯æåã®ã¹ã¬ããã«å±ããç¹å®ã®ã¡ã¢ãªãããã¯ã2çªç®ã®ã¹ã¬ããã«è»¢éããããšãæå³ããŸãã ãã®åŸã2çªç®ã®ã¹ã¬ããã¯ãã®ã¡ã¢ãªãããã¯ãæäœã§ããããã«ãªããæåã®ã¹ã¬ããã¯ã¢ã¯ã»ã¹ã§ããªããªããŸãã
以åã«æåã®ã¹ã¬ããã«å±ããŠããã¡ã¢ãªãããã¯ã2çªç®ã®ã¹ã¬ããã«è»¢éããããšã«ããã2ã€ã®ã¹ã¬ããéã®ã¡ã¢ãªã®åé¢ã æåã®ã¹ã¬ããã¯ãã®ã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ã倱ãã2çªç®ã®ã¹ã¬ããã¯ãã®ã¡ã¢ãªã䜿çšã§ããŸããåæ§ã®ã¢ãããŒãã¯å Žåã«ãã£ãŠã¯é©çšå¯èœã§ãããè€æ°ã®ã¹ã¬ããã䜿çšããç®çãé«æ§èœããŒã¿åŠçã§ããå€ãã®ç¶æ³ã§ã¯ãè€æ°ã®ããã»ã¹ãåæã«åäœã§ããå
±æã¡ã¢ãªãå¿
èŠã§ãã
SharedArrayBufferã¯ãJSéçºè
ã«ãŸãã«ãã®æ©äŒãäžããŸãã
2ã€ã®ã¹ã¬ããã«ã¯ããããããæäœã§ããå
±éã®ã¡ã¢ãªé åããããŸããSharedArrayBufferã®ãããã§ãã¯ãŒã«ãŒãªããžã§ã¯ãã«ãã£ãŠè¡šãããäž¡æ¹ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã§ããäž¡æ¹ã®ã¹ã¬ããã¯ãåãã¡ã¢ãªé åã«å¯ŸããŠããŒã¿ãèªã¿æžãã§ããŸãã
ã€ãŸãããã®ãããªç¶æ³ã§ã¯ãã¹ã¬ããéã®ããŒã¿äº€æãpostMessageé¢æ°ã®äœ¿çšæã«é¿ããããªãé
延ã®ããã®ã·ã¹ãã ãªãœãŒã¹ã®è¿œå ã³ã¹ãã¯ãããŸããã äž¡æ¹ã®ããã¯ã°ã©ãŠã³ãã¿ã¹ã¯ã«ã¯ãã§ããã ãæ©ãã¡ã¢ãªãæäœããæ©èœããããŸãã
ãã ããç°ãªãã¹ã¬ããããã¡ã¢ãªãžã®å³æã¢ã¯ã»ã¹ã«ã¯ãããã€ãã®å±éºã䌎ããŸãã ç¹ã«ãããã¯ç«¶åç¶æ
ã«ã€ãªããå¯èœæ§ããããŸãã
åãã¡ã¢ãªãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããã¬ãŒã·ã³ã°ã¹ã¬ãããã®äžé£ã®è³æã®ç¬¬3éšã§ã¯ãæµãã®ã¬ãŒã¹ã®ç¶æ
ã«ã€ããŠè©³ãã説æããŸãã
SharedArrayBufferã®ãµããŒã
è¿ãå°æ¥ãæã人æ°ã®ãããã©ãŠã¶ã«SharedArrayBufferã®ãµããŒããæèŒãããããšãç¥ãããŠããŸãã
ãã©ãŠã¶ã¯SharedArrayBufferãæè¿ããŸãSharedArrayBufferã®ãµããŒãã¯ãSafariïŒ10.1ïŒã§ãã§ã«å©çšå¯èœã§ãã 次ã®è¡ã¯FirefoxãšChromeã§ãã 圌ãã¯å€ã®çµãããŸã§ã«ãã®æ°ããæœèšã®ãµããŒããååŸããäºå®ã§ãã Edgeã§ã¯ãããããç§ã«SharedArrayBufferã衚瀺ãããŸãã
SharedArrayBufferã¯ãŸããªããã¹ãŠã®äž»èŠãªãã©ãŠã¶ããµããŒãããŸãããéåžžã®ã¢ããªã±ãŒã·ã§ã³éçºè
ãçŽæ¥äœ¿çšããããšã¯æåŸ
ãããŠããŸããã ããã«ãããã¯æšå¥šãããŸããã SharedArrayBufferã«åºã¥ããŠæ§ç¯ãããç¹å¥ãªããŒã«ã䜿çšããããšããå§ãããŸãã
SharedArrayBufferã®æ°æ©èœããéåžžã®éçºè
ãããââãžã§ã¯ãã§SharedArrayBufferã䜿çšã§ããã·ã³ãã«ã§å®å
šãªããŒã«ãäœæããJSã©ã€ãã©ãªéçºè
ã®é¢å¿ãåŒãããšãé¡ã£ãŠããŸãã
ããã«ãSharedArrayBufferãªããžã§ã¯ãã¯ãã©ãããã©ãŒã ã®äžéšã§ãããããWebAssemblyã§äœ¿çšããŠã¹ã¬ãããµããŒããå®è£
ã§ããŸãã ãããçºçãããšãJSããã°ã©ããŒã¯ãä¿¡é Œæ§ãé«ã䟿å©ãªãã«ãã¹ã¬ããåçµç¹ã§ç¥ãããRustãªã©ãä»ã®èšèªã®ãã®ãšé¡äŒŒãã䞊ååŠçæœè±¡åã䜿çšã§ããããã«ãªããŸãã
ãŸãšã
ã芧ã®ãšãããSharedArrayBufferã¯JSã®äžŠåããã»ã¹ã®çžäºäœçšãæ°ããã¬ãã«ã«åŒãäžããããšãã§ããArrayBufferãšãšãã«ãéçºè
ã«æåã¡ã¢ãªç®¡çã®æ©äŒãæäŸããŸãã
次åã¯ãã©ã€ãã©ãªéçºè
ãSharedArrayBufferã«åºã¥ããããŒã¿ã䜿çšããŠãã«ãã¹ã¬ããäœæ¥çšã®ããŒã«ãäœæãããšãã«äœ¿çšã§ããããŒã«ã«ã€ããŠèª¬æããŸãã ç¹ã«ãJS
Atomicsãªããžã§ã¯ãã«ã€ããŠèª¬æããŸãã
芪æãªãèªè
ïŒ ArrayBufferããã³SharedArrayBufferãããžã§ã¯ãã«ã¯ã©ã®ãããªã¢ããªã±ãŒã·ã§ã³ããããŸããïŒ