JavaScriptã«ããã䞊è¡ããŒã¿æ§é ãæ¢ããä¿¡é Œæ§ãé«ãå¹ççãªäžŠåããã°ã©ãã³ã°ã®ããã®ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ãå®çŸããæ¹æ³ã解説ããŸãã
JavaScriptã®äžŠè¡ããŒã¿æ§é ã®åæïŒã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³
åŸæ¥ã·ã³ã°ã«ã¹ã¬ããèšèªãšããŠç¥ãããŠããJavaScriptã¯ãäžŠè¡æ§ãéèŠãšãªãã·ããªãªã§ãŸããŸã䜿çšãããããã«ãªã£ãŠããŸããWeb WorkersãšAtomics APIã®ç»å Žã«ãããéçºè ã¯äžŠååŠçãæŽ»çšããŠããã©ãŒãã³ã¹ãšå¿çæ§ãåäžãããããšãã§ããããã«ãªããŸããããããããã®åã«ã¯ãå ±æã¡ã¢ãªã管çããé©åãªåæã«ãã£ãŠããŒã¿ã®äžè²«æ§ã確ä¿ãããšãã責任ã䌎ããŸãããã®èšäºã§ã¯ãJavaScriptã«ããã䞊è¡ããŒã¿æ§é ã®äžçãæãäžããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ãäœæããããã®ãã¯ããã¯ãæ¢ããŸãã
JavaScriptã«ãããäžŠè¡æ§ã®çè§£
JavaScriptã®æèã«ãããäžŠè¡æ§ãšã¯ãè€æ°ã®ã¿ã¹ã¯ãèŠããäžåæã«åŠçããèœåãæããŸããJavaScriptã®ã€ãã³ãã«ãŒãã¯éåææäœããã³ããããã³ã°æ¹åŒã§åŠçããŸãããçã®äžŠååŠçã«ã¯è€æ°ã®ã¹ã¬ãããå©çšããå¿ èŠããããŸããWeb Workersã¯ãã®æ©èœãæäŸããèšç®éã®å€ãã¿ã¹ã¯ãå¥ã®ã¹ã¬ããã«ãªãããŒãããããšã§ãã¡ã€ã³ã¹ã¬ããããããã¯ãããã®ãé²ããã¹ã ãŒãºãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãç¶æããŸããWebã¢ããªã±ãŒã·ã§ã³ã§å€§èŠæš¡ãªããŒã¿ã»ãããåŠçããã·ããªãªãèããŠã¿ãŸããããäžŠè¡æ§ããªããã°ãåŠçäžã«UIãããªãŒãºããŠããŸããŸããWeb Workersã䜿ãã°ãåŠçã¯ããã¯ã°ã©ãŠã³ãã§è¡ãããUIã¯å¿çæ§ãä¿ã¡ãŸãã
Web WorkersïŒäžŠååŠçã®åºç€
Web Workersã¯ãã¡ã€ã³ã®JavaScriptå®è¡ã¹ã¬ãããšã¯ç¬ç«ããŠå®è¡ãããããã¯ã°ã©ãŠã³ãã¹ã¯ãªããã§ããDOMãžã®ã¢ã¯ã»ã¹ã¯å¶éãããŠããŸãããã¡ãã»ãŒãžããã·ã³ã°ã䜿çšããŠã¡ã€ã³ã¹ã¬ãããšéä¿¡ã§ããŸããããã«ãããè€éãªèšç®ãããŒã¿æäœããããã¯ãŒã¯ãªã¯ãšã¹ããªã©ã®ã¿ã¹ã¯ãã¯ãŒã«ãŒã¹ã¬ããã«ãªãããŒãããã¡ã€ã³ã¹ã¬ãããUIã®æŽæ°ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ã®ããã«è§£æŸããããšãã§ããŸãããã©ãŠã¶ã§å®è¡ãããåç»ç·šéã¢ããªã±ãŒã·ã§ã³ãæ³åããŠã¿ãŠãã ãããè€éãªåç»åŠçã¿ã¹ã¯ã¯Web Workersã«ãã£ãŠå®è¡ã§ããã¹ã ãŒãºãªåçãšç·šéäœéšãä¿èšŒããŸãã
SharedArrayBufferãšAtomics APIïŒå ±æã¡ã¢ãªã®å®çŸ
SharedArrayBufferãªããžã§ã¯ãã䜿çšãããšãè€æ°ã®ã¯ãŒã«ãŒãšã¡ã€ã³ã¹ã¬ãããåãã¡ã¢ãªãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ã§ããŸããããã«ãããã¹ã¬ããéã®å¹ççãªããŒã¿å
±æãšéä¿¡ãå¯èœã«ãªããŸããããããå
±æã¡ã¢ãªãžã®ã¢ã¯ã»ã¹ã¯ãç«¶åç¶æ
ãããŒã¿ç Žæã®å¯èœæ§ããããããŸããAtomics APIã¯ãããŒã¿ã®äžè²«æ§ãä¿èšŒãããããã®åé¡ã鲿¢ããã¢ãããã¯æäœãæäŸããŸããã¢ãããã¯æäœã¯äžå¯åã§ãããäžæãããããšãªãå®äºãããããæäœãåäžã®äžå¯åãªåäœãšããŠå®è¡ãããããšãä¿èšŒãããŸããäŸãã°ãã¢ãããã¯æäœã䜿çšããŠå
±æã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ããããšãè€æ°ã®ã¹ã¬ãããäºãã«å¹²æžããã®ãé²ããæ£ç¢ºãªçµæãä¿èšŒããŸãã
ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã®å¿ èŠæ§
è€æ°ã®ã¹ã¬ãããé©åãªåæã¡ã«ããºã ãªãã«åãããŒã¿æ§é ã«åæã«ã¢ã¯ã»ã¹ããŠå€æŽãããšãç«¶åç¶æ ãçºçããå¯èœæ§ããããŸããç«¶åç¶æ ã¯ãèšç®ã®æçµçµæããè€æ°ã®ã¹ã¬ãããå ±æãªãœãŒã¹ã«ã¢ã¯ã»ã¹ããäºæž¬äžå¯èœãªé åºã«äŸåããå Žåã«çºçããŸããããã¯ãããŒã¿ç Žæãç¶æ ã®äžæŽåãäºæãã¬ã¢ããªã±ãŒã·ã§ã³ã®åäœã«ã€ãªããå¯èœæ§ããããŸããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ããããã®åé¡ãåŒãèµ·ããããšãªããè€æ°ã®ã¹ã¬ããããã®åæã¢ã¯ã»ã¹ãåŠçããããã«èšèšãããããŒã¿æ§é ã§ããé«ã䞊è¡è² è·ã®äžã§ããããŒã¿ã®å®å šæ§ãšäžè²«æ§ãä¿èšŒããŸããè€æ°ã®ã¹ã¬ãããå£åº§æ®é«ãæŽæ°ããŠããéèã¢ããªã±ãŒã·ã§ã³ãèããŠã¿ãŠãã ãããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ããªããã°ããã©ã³ã¶ã¯ã·ã§ã³ã倱ããããéè€ãããããŠãæ·±å»ãªéèãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸãã
ç«¶åç¶æ ãšããŒã¿ç«¶åã®çè§£
ç«¶åç¶æ ã¯ããã«ãã¹ã¬ããããã°ã©ã ã®çµæããã¹ã¬ãããå®è¡ãããäºæž¬äžå¯èœãªé åºã«äŸåããå Žåã«çºçããŸããããŒã¿ç«¶åã¯ç«¶åç¶æ ã®ç¹å®ã®ã¿ã€ãã§ãããè€æ°ã®ã¹ã¬ãããåæã«åãã¡ã¢ãªãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããå°ãªããšã1ã€ã®ã¹ã¬ãããããŒã¿ã倿ŽããŠããå Žåã«çºçããŸããããŒã¿ç«¶åã¯ãããŒã¿ã®ç Žæãäºæž¬äžå¯èœãªåäœã«ã€ãªããå¯èœæ§ããããŸããäŸãã°ã2ã€ã®ã¹ã¬ãããåæã«å ±æå€æ°ãã€ã³ã¯ãªã¡ã³ãããããšãããšãæäœã亀äºã«è¡ããããããæçµçãªçµæãäžæ£ç¢ºã«ãªãå¯èœæ§ããããŸãã
æšæºã®JavaScripté åãã¹ã¬ããã»ãŒãã§ãªãçç±
æšæºã®JavaScripté
åã¯æ¬è³ªçã«ã¹ã¬ããã»ãŒãã§ã¯ãããŸãããpushãpopãspliceãçŽæ¥çãªã€ã³ããã¯ã¹ä»£å
¥ãªã©ã®æäœã¯ã¢ãããã¯ã§ã¯ãããŸãããè€æ°ã®ã¹ã¬ãããåæã«é
åã«ã¢ã¯ã»ã¹ããŠå€æŽãããšãããŒã¿ç«¶åãç«¶åç¶æ
ã容æã«çºçããå¯èœæ§ããããŸããããã«ãããäºæãã¬çµæãããŒã¿ç Žæã«ã€ãªããå¯èœæ§ããããŸããJavaScripté
åã¯ã·ã³ã°ã«ã¹ã¬ããç°å¢ã«ã¯é©ããŠããŸãããé©åãªåæã¡ã«ããºã ãªãã§ã®äžŠè¡ããã°ã©ãã³ã°ã«ã¯æšå¥šãããŸããã
JavaScriptã§ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ãäœæãããã¯ããã¯
JavaScriptã§ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ãäœæããããã«ãããã€ãã®ãã¯ããã¯ãå©çšã§ããŸãããããã®ãã¯ããã¯ã«ã¯ãããã¯ãã¢ãããã¯æäœãåæã¢ã¯ã»ã¹çšã«èšèšãããç¹æ®ãªããŒã¿æ§é ãªã©ã®åæããªããã£ãã®äœ¿çšãå«ãŸããŸãã
ããã¯ïŒãã¥ãŒããã¯ã¹ïŒ
ãã¥ãŒããã¯ã¹ïŒçžäºæä»ïŒã¯ãå
±æãªãœãŒã¹ãžã®æä»çã¢ã¯ã»ã¹ãæäŸããåæããªããã£ãã§ããäžåºŠã«1ã€ã®ã¹ã¬ããããããã¯ãä¿æã§ããŸãããããã¹ã¬ããããå¥ã®ã¹ã¬ããã«ãã£ãŠæ¢ã«ä¿æãããŠããããã¯ãååŸããããšãããšãããã¯ãå©çšå¯èœã«ãªããŸã§ãããã¯ãããŸãããã¥ãŒããã¯ã¹ã¯ãè€æ°ã®ã¹ã¬ãããåæã«åãããŒã¿ã«ã¢ã¯ã»ã¹ããã®ãé²ããããŒã¿ã®å®å
šæ§ãä¿èšŒããŸããJavaScriptã«ã¯çµã¿èŸŒã¿ã®ãã¥ãŒããã¯ã¹ã¯ãããŸããããAtomics.waitãšAtomics.wakeã䜿çšããŠå®è£
ã§ããŸããå
±æã®éè¡å£åº§ãæ³åããŠã¿ãŠãã ããããã¥ãŒããã¯ã¹ã¯ãäžåºŠã«1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ïŒé éãŸãã¯åŒãåºãïŒããè¡ãããªãããã«ããåœåº§è²žè¶ãäžæ£ç¢ºãªæ®é«ãé²ããŸãã
JavaScriptã§ã®ãã¥ãŒããã¯ã¹ã®å®è£
以äžã¯ãSharedArrayBufferãšAtomicsã䜿çšããŠãã¥ãŒããã¯ã¹ãå®è£
ããåºæ¬çãªäŸã§ãã
class Mutex {
constructor(sharedArrayBuffer, index = 0) {
this.lock = new Int32Array(sharedArrayBuffer, index * Int32Array.BYTES_PER_ELEMENT, 1);
}
acquire() {
while (Atomics.compareExchange(this.lock, 0, 1, 0) !== 0) {
Atomics.wait(this.lock, 0, 1);
}
}
release() {
Atomics.store(this.lock, 0, 0);
Atomics.notify(this.lock, 0, 1);
}
}
ãã®ã³ãŒãã¯ãããã¯ã®ç¶æ
ãä¿åããããã«SharedArrayBufferã䜿çšããMutexã¯ã©ã¹ãå®çŸ©ããŠããŸããacquireã¡ãœããã¯Atomics.compareExchangeã䜿çšããŠããã¯ã®ååŸã詊ã¿ãŸããããã¯ãæ¢ã«ä¿æãããŠããå Žåãã¹ã¬ããã¯Atomics.waitã䜿çšããŠåŸ
æ©ããŸããreleaseã¡ãœããã¯ããã¯ãè§£æŸããAtomics.notifyã䜿çšããŠåŸ
æ©äžã®ã¹ã¬ããã«éç¥ããŸãã
å ±æé åã§ãã¥ãŒããã¯ã¹ã䜿çšãã
const sab = new SharedArrayBuffer(1024);
const mutex = new Mutex(sab);
const sharedArray = new Int32Array(sab, Int32Array.BYTES_PER_ELEMENT);
// Worker thread
mutex.acquire();
try {
sharedArray[0] += 1; // Access and modify the shared array
} finally {
mutex.release();
}
ã¢ãããã¯æäœ
ã¢ãããã¯æäœã¯ãåäžã®åäœãšããŠå®è¡ãããäžå¯åãªæäœã§ããAtomics APIã¯ãå
±æã¡ã¢ãªãã±ãŒã·ã§ã³ã®èªã¿åããæžã蟌ã¿ãããã³å€æŽã®ããã®äžé£ã®ã¢ãããã¯æäœãæäŸããŸãããããã®æäœã¯ãããŒã¿ãã¢ãããã¯ã«ã¢ã¯ã»ã¹ããã³å€æŽãããããšãä¿èšŒããç«¶åç¶æ
ãé²ããŸããäžè¬çãªã¢ãããã¯æäœã«ã¯ãAtomics.addãAtomics.subãAtomics.andãAtomics.orãAtomics.xorãAtomics.compareExchangeãããã³Atomics.storeããããŸããäŸãã°ãã¢ãããã¯ã§ã¯ãªãsharedArray[0]++ã䜿çšãã代ããã«ãAtomics.add(sharedArray, 0, 1)ã䜿çšããŠã€ã³ããã¯ã¹0ã®å€ãã¢ãããã¯ã«ã€ã³ã¯ãªã¡ã³ãã§ããŸãã
äŸïŒã¢ãããã¯ã«ãŠã³ã¿ãŒ
const sab = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT);
const counter = new Int32Array(sab);
// Worker thread
Atomics.add(counter, 0, 1); // Atomically increment the counter
ã»ããã©
ã»ããã©ã¯ãã«ãŠã³ã¿ãŒãç¶æããããšã«ãã£ãŠå
±æãªãœãŒã¹ãžã®ã¢ã¯ã»ã¹ãå¶åŸ¡ããåæããªããã£ãã§ããã¹ã¬ããã¯ã«ãŠã³ã¿ãŒããã¯ãªã¡ã³ãããŠã»ããã©ãååŸã§ããŸããã«ãŠã³ã¿ãŒããŒãã®å Žåãã¹ã¬ããã¯å¥ã®ã¹ã¬ãããã«ãŠã³ã¿ãŒãã€ã³ã¯ãªã¡ã³ãããŠã»ããã©ãè§£æŸãããŸã§ãããã¯ãããŸããã»ããã©ã¯ãå
±æãªãœãŒã¹ã«åæã«ã¢ã¯ã»ã¹ã§ããã¹ã¬ããã®æ°ãå¶éããããã«äœ¿çšã§ããŸããäŸãã°ãã»ããã©ã䜿çšããŠåæããŒã¿ããŒã¹æ¥ç¶ã®æ°ãå¶éã§ããŸãããã¥ãŒããã¯ã¹ãšåæ§ã«ãã»ããã©ã¯çµã¿èŸŒãŸããŠããŸããããAtomics.waitãšAtomics.wakeã䜿çšããŠå®è£
ã§ããŸãã
ã»ããã©ã®å®è£
class Semaphore {
constructor(sharedArrayBuffer, initialCount = 0, index = 0) {
this.count = new Int32Array(sharedArrayBuffer, index * Int32Array.BYTES_PER_ELEMENT, 1);
Atomics.store(this.count, 0, initialCount);
}
acquire() {
while (true) {
const current = Atomics.load(this.count, 0);
if (current > 0 && Atomics.compareExchange(this.count, current, current - 1, current) === current) {
return;
}
Atomics.wait(this.count, 0, current);
}
}
release() {
Atomics.add(this.count, 0, 1);
Atomics.notify(this.count, 0, 1);
}
}
䞊è¡ããŒã¿æ§é ïŒã€ãã¥ãŒã¿ãã«ããŒã¿æ§é ïŒ
ããã¯ãã¢ãããã¯æäœã®è€éããåé¿ããäžã€ã®ã¢ãããŒãã¯ãã€ãã¥ãŒã¿ãã«ïŒäžå€ïŒããŒã¿æ§é ã䜿çšããããšã§ããã€ãã¥ãŒã¿ãã«ããŒã¿æ§é ã¯ãäœæåŸã«å€æŽããããšã¯ã§ããŸããã代ããã«ã Ø£Ùã®å€æŽãæ°ããããŒã¿æ§é ã®äœæã«ã€ãªãããå ã®ããŒã¿æ§é ã¯å€æŽãããªããŸãŸã«ãªããŸããããã«ãããè€æ°ã®ã¹ã¬ãããåãã€ãã¥ãŒã¿ãã«ããŒã¿æ§é ã«ç Žæã®ãªã¹ã¯ãªãå®å šã«ã¢ã¯ã»ã¹ã§ãããããããŒã¿ç«¶åã®å¯èœæ§ãæé€ãããŸããImmutable.jsã®ãããªã©ã€ãã©ãªã¯ãJavaScriptçšã®ã€ãã¥ãŒã¿ãã«ããŒã¿æ§é ãæäŸããŠããã䞊è¡ããã°ã©ãã³ã°ã®ã·ããªãªã§éåžžã«åœ¹ç«ã¡ãŸãã
äŸïŒImmutable.jsã®äœ¿çš
import { List } from 'immutable';
let myList = List([1, 2, 3]);
// Worker thread
const newList = myList.push(4); // Creates a new list with the added element
ãã®äŸã§ã¯ãmyListã¯å€æŽããããnewListãæŽæ°ãããããŒã¿ãå«ãã§ããŸããå
±æãããå¯å€ç¶æ
ããªããããããã¯ãã¢ãããã¯æäœã®å¿
èŠããªããªããŸãã
ã³ããŒãªã³ã©ã€ãïŒCOWïŒ
ã³ããŒãªã³ã©ã€ãïŒCOWïŒã¯ãã¹ã¬ããã®1ã€ãããŒã¿ã倿ŽããããšãããŸã§ãè€æ°ã®ã¹ã¬ããéã§ããŒã¿ãå ±æããããã¯ããã¯ã§ãã倿Žãå¿ èŠã«ãªããšãããŒã¿ã®ã³ããŒãäœæããããã®ã³ããŒã«å¯ŸããŠå€æŽãå®è¡ãããŸããããã«ãããä»ã®ã¹ã¬ããã¯å ã®ããŒã¿ã«åŒãç¶ãã¢ã¯ã»ã¹ã§ããŸããCOWã¯ãããŒã¿ãé »ç¹ã«èªã¿åããããããã£ãã«å€æŽãããªãã·ããªãªã§ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸããããã¯ãã¢ãããã¯æäœã®ãªãŒããŒããããåé¿ãã€ã€ãããŒã¿ã®äžè²«æ§ã確ä¿ããŸãããã ããããŒã¿æ§é ã倧ããå ŽåãããŒã¿ãã³ããŒããã³ã¹ãã倧ãããªãå¯èœæ§ããããŸãã
ã¹ã¬ããã»ãŒããªãã¥ãŒã®æ§ç¯
äžèšã§èª¬æããæŠå¿µã説æããããã«ãSharedArrayBufferãAtomicsãããã³ãã¥ãŒããã¯ã¹ã䜿çšããŠã¹ã¬ããã»ãŒããªãã¥ãŒãæ§ç¯ããŠã¿ãŸãããã
class ThreadSafeQueue {
constructor(capacity) {
this.capacity = capacity;
this.buffer = new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT * (capacity + 2)); // +2 for head, tail
this.queue = new Int32Array(this.buffer, 2 * Int32Array.BYTES_PER_ELEMENT);
this.head = new Int32Array(this.buffer, 0, 1);
this.tail = new Int32Array(this.buffer, Int32Array.BYTES_PER_ELEMENT, 1);
this.mutex = new Mutex(this.buffer, 2 + capacity);
Atomics.store(this.head, 0, 0);
Atomics.store(this.tail, 0, 0);
}
enqueue(value) {
this.mutex.acquire();
try {
const tail = Atomics.load(this.tail, 0);
const head = Atomics.load(this.head, 0);
if ((tail + 1) % this.capacity === head) {
throw new Error("Queue is full");
}
this.queue[tail] = value;
Atomics.store(this.tail, 0, (tail + 1) % this.capacity);
} finally {
this.mutex.release();
}
}
dequeue() {
this.mutex.acquire();
try {
const head = Atomics.load(this.head, 0);
const tail = Atomics.load(this.tail, 0);
if (head === tail) {
throw new Error("Queue is empty");
}
const value = this.queue[head];
Atomics.store(this.head, 0, (head + 1) % this.capacity);
return value;
} finally {
this.mutex.release();
}
}
}
ãã®ã³ãŒãã¯ãåºå®å®¹éã®ã¹ã¬ããã»ãŒããªãã¥ãŒãå®è£
ããŠããŸãããã¥ãŒããŒã¿ãããããã€ã³ã¿ãããŒã«ãã€ã³ã¿ãæ ŒçŽããããã«SharedArrayBufferã䜿çšããŸãããã¥ãŒããã¯ã¹ã¯ãã¥ãŒãžã®ã¢ã¯ã»ã¹ãä¿è·ããäžåºŠã«1ã€ã®ã¹ã¬ãããããã¥ãŒã倿Žã§ããªãããã«ããããã«äœ¿çšãããŸããenqueueããã³dequeueã¡ãœããã¯ããã¥ãŒã«ã¢ã¯ã»ã¹ããåã«ãã¥ãŒããã¯ã¹ãååŸããæäœãå®äºããåŸã«è§£æŸããŸãã
ããã©ãŒãã³ã¹ã«é¢ããèæ ®äºé
ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ããŒã¿ã®å®å šæ§ãæäŸããŸãããåæã¡ã«ããºã ã«ããããã©ãŒãã³ã¹ã®ãªãŒããŒããããåŒãèµ·ããå¯èœæ§ããããŸããããã¯ãã¢ãããã¯æäœã¯ãç¹ã«ç«¶åãé«ãå Žåã«ã¯æ¯èŒçã«é ããªãå¯èœæ§ããããŸããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã䜿çšããéã®ããã©ãŒãã³ã¹ãžã®åœ±é¿ãæ éã«èæ ®ããç«¶åãæå°éã«æããããã«ã³ãŒããæé©åããããšãéèŠã§ããããã¯ã®ç¯å²ãçãããããã¯ããªãŒã®ããŒã¿æ§é ã䜿çšãããããŒã¿ãåå²ãããªã©ã®ãã¯ããã¯ãããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
ããã¯ç«¶å
ããã¯ç«¶åã¯ãè€æ°ã®ã¹ã¬ãããåæã«åãããã¯ãååŸããããšãããšãã«çºçããŸããããã«ãããã¹ã¬ãããããã¯ãå©çšå¯èœã«ãªãã®ãåŸ ã€æéãå¢ããå€§å¹ ãªããã©ãŒãã³ã¹äœäžã«ã€ãªããå¯èœæ§ããããŸããããã¯ç«¶åãæžããããšã¯ã䞊è¡ããã°ã©ã ã§è¯å¥œãªããã©ãŒãã³ã¹ãéæããããã«äžå¯æ¬ ã§ããããã¯ç«¶åãæžããããã®ãã¯ããã¯ã«ã¯ã现ç²åºŠã®ããã¯ã®äœ¿çšãããŒã¿ã®åå²ãããã¯ããªãŒã®ããŒã¿æ§é ã®äœ¿çšãªã©ããããŸãã
ã¢ãããã¯æäœã®ãªãŒããŒããã
ã¢ãããã¯æäœã¯äžè¬çã«éã¢ãããã¯æäœãããé ãã§ãããããã䞊è¡ããã°ã©ã ã§ããŒã¿ã®å®å šæ§ãä¿èšŒããããã«ã¯å¿ èŠã§ããã¢ãããã¯æäœã䜿çšããå Žåãå®è¡ãããã¢ãããã¯æäœã®æ°ãæå°éã«æããå¿ èŠãªå Žåã«ã®ã¿äœ¿çšããããšãéèŠã§ããæŽæ°ããããåŠçãããããŒã«ã«ãã£ãã·ã¥ã䜿çšãããªã©ã®ãã¯ããã¯ããã¢ãããã¯æäœã®ãªãŒããŒããããåæžã§ããŸãã
å ±æã¡ã¢ãªäžŠè¡æ§ã®ä»£æ¿æ¡
Web WorkersãSharedArrayBufferãããã³Atomicsã䜿çšããå
±æã¡ã¢ãªäžŠè¡æ§ã¯ãJavaScriptã§äžŠååŠçãå®çŸãã匷åãªæ¹æ³ãæäŸããŸãããåæã«å€§ããªè€éãããããããŸããå
±æã¡ã¢ãªãšåæããªããã£ãã®ç®¡çã¯ãå°é£ã§ãšã©ãŒãçºçããããå¯èœæ§ããããŸããå
±æã¡ã¢ãªäžŠè¡æ§ã®ä»£æ¿æ¡ã«ã¯ãã¡ãã»ãŒãžããã·ã³ã°ãã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§ããããŸãã
ã¡ãã»ãŒãžããã·ã³ã°
ã¡ãã»ãŒãžããã·ã³ã°ã¯ãã¹ã¬ãããã¡ãã»ãŒãžãéä¿¡ããããšã§ãäºãã«éä¿¡ããäžŠè¡æ§ã¢ãã«ã§ããåã¹ã¬ããã¯ç¬èªã®ãã©ã€ããŒãã¡ã¢ãªç©ºéãæã¡ãããŒã¿ã¯ã¡ãã»ãŒãžå ã§ã³ããŒãããŠã¹ã¬ããéã§è»¢éãããŸããã¹ã¬ãããã¡ã¢ãªãçŽæ¥å ±æããªããããã¡ãã»ãŒãžããã·ã³ã°ã¯ããŒã¿ç«¶åã®å¯èœæ§ãæé€ããŸããWeb Workersã¯äž»ã«ã¡ã€ã³ã¹ã¬ãããšã®éä¿¡ã«ã¡ãã»ãŒãžããã·ã³ã°ã䜿çšããŸãã
ã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§
ã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§ã¯ã䞊è¡ã¿ã¹ã¯ãã¢ã¯ã¿ãŒã«ã«ãã»ã«åãããã¢ãã«ã§ããã¢ã¯ã¿ãŒã¯ãç¬èªã®ã¹ããŒããæã¡ãã¡ãã»ãŒãžãéä¿¡ããããšã§ä»ã®ã¢ã¯ã¿ãŒãšéä¿¡ã§ããç¬ç«ãããšã³ãã£ãã£ã§ããã¢ã¯ã¿ãŒã¯ã¡ãã»ãŒãžãé æ¬¡åŠçãããããããã¯ãã¢ãããã¯æäœã®å¿ èŠããªããªããŸããã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§ã¯ãããé«ãã¬ãã«ã®æœè±¡åãæäŸããããšã§ã䞊è¡ããã°ã©ãã³ã°ãç°¡çŽ åã§ããŸããAkka.jsã®ãããªã©ã€ãã©ãªã¯ãJavaScriptçšã®ã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§ãã¬ãŒã ã¯ãŒã¯ãæäŸããŸãã
ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã®ãŠãŒã¹ã±ãŒã¹
ã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ãå ±æããŒã¿ãžã®åæã¢ã¯ã»ã¹ãå¿ èŠãªæ§ã ãªã·ããªãªã§äŸ¡å€ããããŸããäžè¬çãªãŠãŒã¹ã±ãŒã¹ã«ã¯ä»¥äžã®ãããªãã®ããããŸãã
- ãªã¢ã«ã¿ã€ã ããŒã¿åŠçïŒ è€æ°ã®ãœãŒã¹ããã®ãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã ãåŠçããã«ã¯ãå ±æããŒã¿æ§é ãžã®åæã¢ã¯ã»ã¹ãå¿ èŠã§ããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ãããŒã¿ã®äžè²«æ§ãä¿èšŒããããŒã¿æå€±ãé²ãããšãã§ããŸããäŸãã°ãã°ããŒãã«ã«åæ£ããããããã¯ãŒã¯ãä»ããŠIoTããã€ã¹ããã®ã»ã³ãµãŒããŒã¿ãåŠçããå Žåãªã©ã§ãã
- ã²ãŒã éçºïŒ ã²ãŒã ãšã³ãžã³ã¯ãç©çã·ãã¥ã¬ãŒã·ã§ã³ãAIåŠçãã¬ã³ããªã³ã°ãªã©ã®ã¿ã¹ã¯ãå®è¡ããããã«è€æ°ã®ã¹ã¬ããããã䜿çšããŸããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ããããã®ã¹ã¬ãããç«¶åç¶æ ãåŒãèµ·ããããšãªããã²ãŒã ããŒã¿ã«åæã«ã¢ã¯ã»ã¹ããŠå€æŽã§ããããã«ããŸããäœå人ãã®ãã¬ã€ã€ãŒãåæã«çžäºäœçšããå€§èŠæš¡ãã«ããã¬ã€ã€ãŒãªã³ã©ã€ã³ã²ãŒã ïŒMMOïŒãæ³åããŠã¿ãŠãã ããã
- éèã¢ããªã±ãŒã·ã§ã³ïŒ éèã¢ããªã±ãŒã·ã§ã³ã¯ãå£åº§æ®é«ãååŒå±¥æŽããã®ä»ã®éèããŒã¿ãžã®åæã¢ã¯ã»ã¹ãé »ç¹ã«å¿ èŠãšããŸããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ããã©ã³ã¶ã¯ã·ã§ã³ãæ£ããåŠçãããå£åº§æ®é«ãåžžã«æ£ç¢ºã§ããããšãä¿èšŒã§ããŸããäžçäžã®ç°ãªãåžå Žããæ¯ç§æ°çŸäžã®ãã©ã³ã¶ã¯ã·ã§ã³ãåŠçããé«é »åºŠååŒãã©ãããã©ãŒã ãèããŠã¿ãŠãã ããã
- ããŒã¿åæïŒ ããŒã¿åæã¢ããªã±ãŒã·ã§ã³ã¯ãè€æ°ã®ã¹ã¬ããã䜿çšããŠå€§èŠæš¡ãªããŒã¿ã»ããã䞊è¡ããŠåŠçããããšããããããŸããã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ãããŒã¿ãæ£ããåŠçãããçµæãäžè²«ããŠããããšãä¿èšŒã§ããŸããç°ãªãå°ççå°åããã®ãœãŒã·ã£ã«ã¡ãã£ã¢ã®ãã¬ã³ããåæããããšãèããŠã¿ãŠãã ããã
- ãŠã§ããµãŒããŒïŒ ãã©ãã£ãã¯ã®å€ããŠã§ãã¢ããªã±ãŒã·ã§ã³ã§ã®åæãªã¯ãšã¹ãã®åŠçãã¹ã¬ããã»ãŒããªãã£ãã·ã¥ãšã»ãã·ã§ã³ç®¡çæ§é ã¯ãããã©ãŒãã³ã¹ãšã¹ã±ãŒã©ããªãã£ãåäžãããããšãã§ããŸãã
çµè«
䞊è¡ããŒã¿æ§é ãšã¹ã¬ããã»ãŒããªã³ã¬ã¯ã·ã§ã³ã¯ãJavaScriptã§å ç¢ã§å¹ççãªäžŠè¡ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããå ±æã¡ã¢ãªäžŠè¡æ§ã®èª²é¡ãçè§£ããé©åãªåæã¡ã«ããºã ã䜿çšããããšã§ãéçºè ã¯Web WorkersãšAtomics APIã®åãæŽ»çšããŠããã©ãŒãã³ã¹ãšå¿çæ§ãåäžãããããšãã§ããŸããå ±æã¡ã¢ãªäžŠè¡æ§ã¯è€éãããããããŸãããèšç®éã®å€ãåé¡ã解決ããããã®åŒ·åãªããŒã«ãæäŸããŸããå ±æã¡ã¢ãªäžŠè¡æ§ãã¡ãã»ãŒãžããã·ã³ã°ãã¢ã¯ã¿ãŒããŒã¹ã®äžŠè¡æ§ã®éã§éžæããéã«ã¯ãããã©ãŒãã³ã¹ãšè€éãã®ãã¬ãŒããªããæ éã«æ€èšããŠãã ãããJavaScriptãé²åãç¶ããã«ã€ããŠã䞊è¡ããã°ã©ãã³ã°ã®åéã§ãããªãæ¹åãšæœè±¡åãæåŸ ãããã¹ã±ãŒã©ãã«ã§ããã©ãŒãã³ã¹ã®é«ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã容æã«ãªãã§ãããã
䞊è¡ã·ã¹ãã ãèšèšããéã«ã¯ãããŒã¿ã®å®å šæ§ãšäžè²«æ§ãåªå ããããšãå¿ããªãã§ãã ããã䞊è¡ã³ãŒãã®ãã¹ããšãããã°ã¯å°é£ãªå Žåãããããã培åºçãªãã¹ããšæ éãªèšèšãäžå¯æ¬ ã§ãã