layout | status | published | title | author | author_login | author_email | author_url | excerpt | wordpress_id | wordpress_url | date | date_gmt | categories | comments | permalink | |||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
post |
publish |
true |
embona - ãã©ãŠã¶ã§åãBonanzaãäœã£ãŠã¿ã(ãã®4) |
Takuo Kihira |
tax |
tax@nmi.jp |
http:// |
åã®èšäºã§ã¯ããã©ãŠã¶äžã§Bonanzaã®èµ·åã«æåããŸããããã®èšäºã§ã¯ãå®éã«BonanzaãJavaScriptåŽããæäœããããšã§ãããEmscriptenã®æ·±ã䜿ãæ¹ãåŠãã§ã¿ãããšæããŸããã<br /><br />åã®èšäºã¯ãã¡ãâ <a href="http://nmi.jp/archives/780" target="_blank">embona - ãã©ãŠã¶ã§åãBonanzaãäœã£ãŠã¿ã(ãã®3)</a><br />ãšããããéãã§ã¿ããããšããæ¹ã¯<a href="http://nmi.jp/archives/763" target="_blank">ãã®1</a>ã®èšäºã®æåã«ãªã³ã¯ãçšæããŠãããŸããããã¡ãããåç
§ãã ããã<br /> |
792 |
2015-01-19 13:41:08 +0900 |
2015-01-19 04:41:08 +0900 |
|
archives/792 |
åã®èšäºã§ã¯ããã©ãŠã¶äžã§Bonanzaã®èµ·åã«æåããŸããããã®èšäºã§ã¯ãå®éã«BonanzaãJavaScriptåŽããæäœããããšã§ãããEmscriptenã®æ·±ã䜿ãæ¹ãåŠãã§ã¿ãããšæããŸããã
åã®èšäºã¯ãã¡ãâ embona - ãã©ãŠã¶ã§åãBonanzaãäœã£ãŠã¿ã(ãã®3)
ãšããããéãã§ã¿ããããšããæ¹ã¯ãã®1ã®èšäºã®æåã«ãªã³ã¯ãçšæããŠãããŸããããã¡ãããåç
§ãã ããã
åã®èšäºã§äœãå«ã ã£ãŠãæ¯åæšæºå ¥åã®ããã³ãããåºãŠããããšã§ããããã°ã©ã åŽã§ã¯å ¥åããããã©ãã確èªããŠããã ããªã®ã«ãæšæºå ¥åã«åãåããããããšåŸåã«ãã€ã¢ãã°ãåºãã®ã§ãçµæçã«äœåºŠãäœåºŠããã€ã¢ãã°ãåºãŠããããšã«ãªããŸãã
ãããŠããã€ã¢ãã°ããã£ã³ã»ã«ãããšå éšã§ã¯æãã-1ïŒEOFïŒãéãããŠããŸããBonanzaã¯åéãããŠçµäºããããšããŸãããã®1ã§ãã«ãããCã®Bonanzaã¯1æã«10ç§ãããŠããã®ã«ãä»åã®ãã©ãŠã¶Bonanzaã¯1æãããªç§ã§åŠçããé§ã足ã§çµäºããããšããŠããã®ã«ãæ°ã¥ãã«ãªã£ãã§ããããïŒããã¯ããã®å ¥åã®ãããªã®ã§ãã
ãšããããã§ãæšæºå
¥åºåãEmscriptenã§ã¯ãªãããã°ã©ã åŽã§åŠçããå¿
èŠããããŸããEmscriptenã§ã¯ããã°ã©ã èµ·ååã«åŒã°ããããã°ã©ã ãã¡ã€ã«ãæå®ããããšãã§ããã®ã§ãããããåŠçããããã«ãpre.js ãšãããã¡ã€ã«ãäœããããã®ããã°ã©ã ã§å¯Ÿå¿ããŠã¿ãŸãã
if(typeof Module !== "undefined") { } else { var Module = {}; Module["preRun"] = []; } Module["preRun"].push(function() { FS.init(input_callback, output_callback, error_callback) });
<p>Emscriptenã§ã¯ãModuleãšããã°ããŒãã«å€æ°ãéããŠãEmscriptenã®ã·ã¹ãã ã«é¢ããæ§ã
ãªèšå®ãããããšãåºæ¥ãŸããä»åã¯Moduleã®preRunãå©çšããŠãããã°ã©ã èµ·ååã®åŠçãæžããŸããããããšã¯åçŽã§ãæšæºå
¥åºåã®ã³ãŒã«ããã¯é¢æ°ïŒinput_callbackãoutput_callbackãerror_callbackïŒãèšå®ããã ãã§ãã</p>
<p>ãªããäžã®äžã®Emscriptenã®ãµã³ãã«ã¯èªåã§Moduleãåå®çŸ©ããŠããäŸãå€ãã§ããã<span style="color:red">æ¢ã«Emscriptenã«ããModuleãæºåãããŠããå Žåã¯ã決ããŠäžæžãããªãããã«ããŸããã</span>ãç¥ããã«äžæžããããšããã«ããªãã·ã§ã³ãå€ããŠãå
šç¶åæ ãããªããªãéæ¹ã«ãããããšã«ãªããŸãã泚æããŠãã ããããããã®ãµã³ãã«ã§ã¯preRunã«é¢æ°ã代å
¥ããŠããäŸããããŸãããpreRunã¯é
åãªã®ã§é¢æ°ãpushããã®ãæ£ãã䜿ãæ¹ã§ãã</p>
<p>input_callbackã§ã¯ããããããèšå®ããæååãäžæ¹çã«éãããããå°œããããã£ãšæ¹è¡ãéãããã«ããŠããŸããæ®å¿µãªããçŸç¶ã®Emscriptenã§ã¯æšæºå
¥åã®Peekã«æ¥ãåãåããã«å¯Ÿããå
¥åå
容ãªãããšçããããšãåºæ¥ãªãã®ã§ãæ
ããªã話ã§ããæ¯èŒç害ã®ãªãæ¹è¡æŒãã£ã±ãªãç¶æ
ã«ããŠãããŸãã</p>
<p>output_callbackãšerror_callbackã¯åçŽãªå®è£
ã§ãããBonanzaã¯åºåã«carriage returnãå€çšããŠããã®ã§ãæ±ãã³ãŒãã§ããããã«å¯Ÿå¿ããããã«ããŠããŸãã ããã§èªåã®å®è£
ã§console.logã«åºååºæ¥ãããã«ãªããŸãããã€ãã§ã«embona.htmlãèªåã§çšæãã¡ãããŸãã<br />
</p>
<!doctype html>
<title>embona</title> <script src="bonanza.js"></script> ```è¶ ã·ã³ãã«ãåºåã¯ã³ã³ãœãŒã«ã§ç¢ºèªããŸãããããšããå²ãåã£ãææ³ã§ããçµæã¯ãã¡ãã§ãã
ããŠãä»ã®ãšãããã©ãŠã¶ã§åããŠã¯ãããŸãããJavaScriptãã¡ã€ã³ã«ãŒãããã£ãšå æããŠããããã©ãŠã¶ã®ã¿ããéããããšãåºæ¥ãªãã»ã©ã®éãã§ãããããªç¶æ³ã§ã¯ãµãŒãã¹ã§ã¯äœ¿ãç©ã«ãªããŸãããããã§ãWebWorkersã䜿ããBonanzaãããã¯ã°ã©ãŠã³ãã§èµ·åããããšã«ããŸãããã
Workerã§èµ·åããããã«ã¯ãEmscriptenã®åºåãhtmlã§ã¯ãªããŠjsã«ãããšåºæ¥ããã§ããããããããããšãä»ãŸã§ --preload-file ã§ããŒãããŠããfv.bin ãèªåã§Emscriptenã®ãã¡ã€ã«ã·ã¹ãã ã«ããŒãããªããã°ãããŸãããã¡ãã£ãšé¢åããã§ãããå®éãããŸã§é¢åã§ã¯ãããŸããã
ãã¡ã€ã«ã·ã¹ãã 絡ã¿ã¯æ¬äœããã°ã©ã ãèµ·åããåã«å®äºããããã®ã§ãpre.jsã®äžèº«ã«èšè¿°ããããšã«ããŸããäžèšã®ãã¡ã€ã«ã®ç¶ãã«ä»¥äžãè¿œèšããŸãã
var xhr = new XMLHttpRequest(); xhr.open("GET", "fv.bin"); xhr.responseType = "arraybuffer"; xhr.send(null); xhr.onreadystatechange = function() { if(xhr.readyState == 4) { if(xhr.status == 200) { if(xhr.response != undefined) { FS.writeFile("fv.bin", new Uint8Array(xhr.response), {encoding: "binary"}); Module"_main"; } } } };
<p>noInitialRunãtrueã«ããããšã§ããã¡ã€ã«ãæºåãããåã«èªåçã«mainé¢æ°ãå®è¡ãããã®ãé²ããŸãããããŠXHRã§ãã¡ã€ã«ãããŠã³ããŒãããå®äºããã<a href="http://kripken.github.io/emscripten-site/docs/api_reference/Filesystem-API.html" target="_blank">FS.writeFile</a>ã§æ¢åã®FSäžã«åºåãæºåå®äºã§ããå
šãŠã®æºåãå®äºããã®ã§ãããã§Bonanzaã®ããã°ã©ã ïŒ_mainïŒãå®è¡ããŸãã</p>
<p>Workerã®åŠçã®éšåãè¿œå ããŸããããembona.htmlã次ã®ããã«å€æŽããŸãã<br />
</p>
```html
<!doctype html>
<html><head><title>embona</title>
<script>
onload = function() {
var worker = new Worker("bonanza.js");
};
</script>
</head><body></body></html>
Makefileãå¿ããã«æŽæ°ããŸãã
å¿ èŠã®ç¡ããªã£ããã©ã°ãæ¶å»ããŸããããã§ãªãã«ãããã°å®æã§ãã
èŠãç®ã¯äžã®ç»åãšåãã§ããããShow all messagesããšãããªãã·ã§ã³ãåºãŠãããšããã§ããããWorkerã§èµ·åããŠããããšã確èªåºæ¥ãŸãããªããŒãããŠããµã¯ãµã¯ãªããŒãåºæ¥ãŠããŠãŒã¶ãŒäœæã¯æ¯èŒã«ãªããªãã»ã©è¯ããªããŸããã
ããŠãWorkerã«ç§»ããã®ã§ã¡ã€ã³ã«ãŒããç¡éã«ãŒãããããšããã§ãã©ãŠã¶ãæ¢ãŸã£ããããããšã¯ãªããªããŸããããããããã®ç¶æ ã ãšæ¬äœããWorkerã«éä¿¡ããããšãåºæ¥ãŸãããæ¬äœããpostMessageãããŠããWorkeråŽã§ãããåãåãããã«ã¯ã«ãŒãããå€ããªããã°ãããªãããã§ãã
Emscriptenã®ãã®åé¡ã«å¯Ÿããäžè¬çãªè§£æ±ºæ¹æ³ã¯ãä»ã®ãšãããããŸãããå°æ¥çã«SharedArrayBufferãå®è£ ãããããåæçãã€Workerå éšã§æ±ããStorageãå®è£ ãããã°åé¡è§£æ±ºã®å¯èœæ§ãåºãŠããã®ã§ãããæ®å¿µãªããä»ã¯äž¡æ¹ãšã察å¿ããŠããªãããã§ãã
ä»åã¯ãèªåã§Emscriptenã®åºåãã¡ã€ã«ã® Bonanza.js ãçŽæ¥ç·šéããŠãã¡ã€ã³ã«ãŒããsetTimeoutã§æžããªãããŸããã
```javascript (function __main_loop() { HEAP32[34181088>>2] = 0; $3 = (_ponder(220526688)|0); $4 = ($3|0)<(0); if ($4) { $$0$i = $3; } else { $5 = HEAP32[34180920>>2]|0; $6 = $5 & 16; $7 = ($6|0)==(0); if (!($7)) { return; //break; } $8 = ($3|0)==(2); if ($8) { setTimeout(__main_loop,0);return; //continue; } $9 = HEAP32[34181088>>2]|0; $10 = ($9|0)==(-33554432); if (!($10)) { _show_prompt(); } $11 = (_next_cmdline(1)|0); $12 = ($11|0)<(0); if ($12) { $$0$i = $11; } else { $13 = HEAP32[34180920>>2]|0; $14 = $13 & 16; $15 = ($14|0)==(0); if (!($15)) { return; //break; } $16 = (_procedure(220526688)|0); $17 = ($16|0)<(0); if ($17) { $$0$i = $16; } else { $18 = HEAP32[34180920>>2]|0; $19 = $18 >>> 2; $20 = $19 & 4; $21 = $20 ^ 4; $22 = (($21) + -3)|0; $$0$i = $22; } } } if ((($$0$i|0) == -1)) { label = 13; return; //break; } else if ((($$0$i|0) == -3)) { return; //break; } else if (!((($$0$i|0) == -2))) { setTimeout(__main_loop,0);return; //continue; } $24 = HEAP32[220526664>>2]|0; HEAP32[$vararg_buffer4>>2] = $24; _out_warning(221111352,$vararg_buffer4); _shutdown_all(); setTimeout(__main_loop,0); })(); ```while(1) ã«ãªã£ãŠããå éšã ååä»ãé¢æ°åŒ __main_loopã§å²ããbreakãããå Žåã¯returnããcontinueãããå Žåãã«ãŒãã®æåŸã«å°éããå Žåã¯å床__main_loopãsetTimeoutã§åŒãã§ããŸããããã§ææªã¡ã€ã³ã«ãŒã1åããšã«postMessageãåŠçåºæ¥ãããã«ãªããŸãã
å®éã®æãããã®éšåã¯ããå°ãåªåããããšãåºæ¥ããšæããŸããäŸãã°ã§ãããBonanzaã®æèã«ãŒãã³ã®ã³ãŒãã®äžã«sleepãå ¥ããEmscripten Asyncifyãå©çšããŠEmscriptenåŽã§éåæåŠçãå®çŸããã®ãè¯ã解決çã«ãªãããã ãšæã£ãŠããŸãããããä»åãæ¢ããŠBonanzaæ¬äœã®ã³ãŒãã«ã¯æãå ¥ããªããšããçžãã®ããšã§ãã£ãŠããã®ã§ãäžèšã®ãããªè§£æ±ºçã«ãªããŸããã
äžèšã®ããã«ãEmscriptenã®åºåãç·šéããã®ã¯äžçã§ããEmscriptenã§ãã«ããããã³ã«ããããåœãŠãªããã°ãããŸããããå°æ¥Emscriptenã®åºåãå€ããå¯èœæ§ã¯å€§ãã«ãããŸãããªã«ããããã ãšClosure Compilerãéãããšãåºæ¥ãŸãããåºåã³ãŒããç解ããããç·šéåºæ¥ãäºã¯å€§åã§ãããå®éã®ãããã¯ãçã§ã¯åãã¥ããéžæè¢ã«ãªãã§ãããããããã£ãæå³ã§ãAsyncifyã¯äŸ¿å©ãªã®ã§ãèå³ã®ããæ¹ã¯æ¯é調ã¹ãŠã¿ãŠãã ããã
以äžã§Emscriptenã«é¢ãã話ã¯ãããŸãã§ãæ®ãã¯çŽç²ãªJavaScriptã®è©±ã«ãªããŸããembona.htmlãšpre.jsã«messageãåãåããªã¹ããä»ããŠéä¿¡ãã€ã€ãBonanzaã®stdinã«é©å®æååãæŸã蟌ãã§åŠçããåºåãstdoutããããŒã¹ããŠãããèŠãç®ããåºåããã°ããã©ãŠã¶çBonanzaã®å®æã§ããç°¡åã§ããïŒç§ã¯å°æ£ã®UIãèããŠããŠãé©åœã«äœãã¯ããããæãã®å€èŠæŠããä»ã§ãçžåœã®ãã°ãæ®ãç¶æ ã«ãªããŸããããæ¥ããããã
ãã®1ã§ãèŠããããã©ãŠã¶çBonanzaã¯ãäžåºŠfv.binãèªã¿èŸŒãã ããã®ãŸãŸä¿åãç¶ããããã«ããããå°ãã§ãããŠã³ããŒãæéãæžããããã«gzipå§çž®ããããŠã¯ã©ã€ã¢ã³ãåŽã§è§£åãããããšãããããªä¿®æ£ãå ¥ããŠãããŸãã
Bonanzaããããã£ã移æ€ã念é ã«çœ®ãããŠãããããã§ããã«ãåšãã§ã¯ã»ãšãã©ãã©ãã«ãç¡ãã£ãã®ã幞ãã§ãããäžæ¹ãå°æ£ãšã³ãžã³ã®äžè¬çãªç¹æ§ã§ã¯ãããŸãããããã°ã©ã ãã¡ã¢ãªã倧éã«æ¶è²»ããããèµ·åã«180Mbyteãã®ãã¡ã€ã«ãå¿ èŠãšãããããã¯ãã©ãŠã¶åãã§ã¯ãªãã£ããšæããŸãããããããã®ãããªããã°ã©ã ã§ããã©ãŠã¶ã«ç°¡åã«ç§»æ€åºæ¥ãã®ã¯çŽ æŽãããããšã§ã倢ãåºãããŸãã
æ¥æ¬èªã®Emscriptenã®è³æãå°ãªãã£ãã®ã§ãä»åã®èšäºã¯è©³çŽ°ã«æžããã€ããã§ããã¡ãã£ãšãã€ãããããã ã£ããããããŸããããããã¿ãªããã®åèã«ãªãã°å¹žãã§ããäœãäžæç¹ãã³ã¡ã³ãçããã°ããæ°è»œã«Twitter @tkihira ãŸã§ãé£çµ¡ãã ããã