ãã€ãã£ãwasmãã¹ãã§ã®ã€ã³ããŒãåœä»€ã®æ§æãšè§£æ±ºã¡ã«ããºã ãææ¡ããããšæããŸãïŒãããã£ãŠãä»ã®ãšãããã»ãšãã©ã¯WASIã§ãããããããnode.jsã§ãïŒã
ç§ãç®æããŠããã¢ãã«ã¯ã @ lukewagnerãã·ã§ã¢ãŒãããã·ã³ã°ãªã³ã¯ãšåŒãã§ãããã®ã§ãã ãã®ææ¡ã§ã¯ããããä¿¡é Œã§ããªãæ§æãšåŒã³ãŸãã
ãã®ã¢ãã«ã§ã¯ãwasméçºè ã¯npmã®ãããªã¢ãžã¥ãŒã«ã®ãšã³ã·ã¹ãã ãããã«ã§ããŸãã åã¢ãžã¥ãŒã«ã¯ç¬èªã®äŸåé¢ä¿ãåããèªå·±å®çµåã§ãããéåžžãã°ããŒãã«ã«ã€ã³ã¹ããŒã«ãããããã±ãŒãžã«ã¯ãããŸããã ããã¯ãsnapcraftãšflatpackã«ãã£ãŠéžæãããã¢ãã«ã§ããããŸãã ãã®äž»ãªå©ç¹ã¯ããã®ã¢ãã«ã§ã®ããã°ã©ã ã®ãã¹ãŠã®ã€ã³ã¹ããŒã«ãåãã§ããããšãä¿èšŒãããŠããããšã§ããããã¯ããã°ã®å ±åãäŸåé¢ä¿å°çã®åé¡ã®åé¿ã«éåžžã«åœ¹ç«ã¡ãŸãã
ïŒçå£ã«ãäŸåé¢ä¿å°çã¯ã²ã©ãã§ã;ãããã®åé¡ã軜æžããããšãã§ããèŒžå ¥ã·ã¹ãã ã®äŸ¿å©ãã¯éå°è©äŸ¡ããããšã¯ã§ããŸããïŒ
ãã®ã¢ãã«ã®wasmããŒãžã§ã³ã¯ãæªæã®ããã³ãŒããååšããå Žåã§ãå®å
šã§ããå¿
èŠãããããããä¿¡é Œã§ããªãæ§æããšããååãä»ããããŠããŸãã ãã€ãã£ãã®ã€ã³ããŒã解決ã·ã¹ãã ã¯ããªããžã§ã¯ãæ©èœã®åºæ¬ååãå°éããå¿
èŠããããŸããä¿¡é Œã§ããªãã³ãŒãã¯ããã®ã³ãŒãã«æ瀺çã«æž¡ãããããŒã¿ã«ã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã ã€ãŸãããã¹ãããã®ãã¡ã€ã«ã«å¯Ÿãããã¡ã€ã«ã·ã¹ãã ã®ã¢ã¯ã»ã¹èš±å¯ãæã£ãŠããå Žåã§ãããµããµããµããµãäŸåé¢ä¿ã¯/usr/bin/someprogram.wasm
ãã€ã³ããŒãã§ããªãã¯ãã§ãã
çŸåšãå¥ã®wasmã¢ãžã¥ãŒã«ããçŽæ¥wasmã¢ãžã¥ãŒã«ãã€ã³ããŒãããããšã¯ãçŸåšã»ãšãã©äžå¯èœã§ãã wasmã¢ãžã¥ãŒã«ãäžç·ã«äœ¿çšããã«ã¯ãJSãšã³ããããŒã§ã°ã«ãŒã³ãŒããèšè¿°ããå¿ èŠããããŸãã ä»åŸã®esmçµ±åã®ææ¡ããããŸããã次ã®ãšããã§ãã
ãã®ææ¡ã¯JSåã蟌ã¿ãç®çãšããŠãããESç°å¢ã«åºã¥ããŠä»®å®ãè¡ã£ãŠããŸãã
ãã®ææ¡ã§ã¯ããã¹å解決ã¡ã«ããºã ã¯æå®ãããŠããŸããã æçµçãªã¡ã«ããºã ãå®è£ ã«äŸåããŠãããšä»®å®ãããšãnode.jsã®ãã¹å解決ã¯wasmã®ãä¿¡é Œã§ããªããèŠä»¶ãå®å šã«ã¯ééããŸããã
ã€ãŸããwasmã«ã¯ãä»ã®ã¢ãžã¥ãŒã«ããã¢ãžã¥ãŒã«ãã€ã³ããŒãããããã®ãæšæºçã§å®å šãªéJSã¡ã«ããºã ãå¿ èŠã§ãã ãã®æšæºã¯WASIã«ãã£ãŠæä»çã«äœ¿çšãããããã§ã¯ãããŸããããWASIã¯ã»ãšãã©ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠããŸãã
ã€ã³ã¹ã¿ã³ã¹åãã§ãŒãºïŒäŸïŒ WebAssembly.instantiate
ã wasm_instance_new
ã wasm::Instance::make
ïŒã®éã«ãWebAssemblyã³ã³ãã€ã©ã¯ãªãã·ã§ã³ã®ãã¡ã€ã«ã·ã¹ãã ã«ãŒããªããžã§ã¯ããšãªãã·ã§ã³ã®ã€ã³ããŒãããããªããžã§ã¯ããåãåããŸãã
ãã¡ã€ã«ã·ã¹ãã ã®ã«ãŒãã¯éåžžã .wasm
ãã¡ã€ã«ãååšãããã£ã¬ã¯ããªã«ãªããŸããã€ã³ããŒãããããªããžã§ã¯ãã¯ãã©ãããã©ãŒã ã«äŸåããŸãã
ã€ã³ããŒãæååã解æãããšããã³ã³ãã€ã©ã¯æ¬¡ã®ã¢ã«ãŽãªãºã ãé©çšããŸãã
.
ãŸãã¯..
ã»ã°ã¡ã³ããå«ãŸããŠããªãããšã確èªããŠãã ããã@
ãä»ããŠããå Žåã¯ããã¹ãã€ã³ããŒããããã§å®çŸ©ãããŠãããã¹ã«ãããããŸãã$
ãä»ããŠããå Žåã¯ãçŸåšã®ãã©ã«ããŒãšãã€ã³ããŒãã«ãŒããŸã§ã®ãã¹ãŠã®èŠªãã©ã«ããŒã§wasi_import_map.json
ãã¡ã€ã«ã確èªããŸãã ãããã«ã»ã°ã¡ã³ãã«äžèŽãããšã³ããªãåããŠãããšãã«æ»ããŸãã@
ïŒãã®æ§æã¯ã @wasi/fs
ã@stdjs/global/Array
ãªã©ã®ãã¹ãæ©èœãã€ã³ããŒãããããã«äœ¿çšãããŸãã
ããã«ã¯ãæ¢åã®JSã€ã³ããŒãèŠåãšè¡çªããªããšããå©ç¹ããããŸãïŒãwasiããšãstdjsããNPMçµç¹ãšããŠäºçŽãããŠããå ŽåïŒã
$
ïŒãã®æ§æã¯ãOCAPã»ãŒããªæ¹æ³ã§çŸåšã®ãã£ã¬ã¯ããªããããŒã¿ãã€ã³ããŒãããããã«äœ¿çšãããŸãã
åºæ¬çãªååã¯ãããã©ã«ãã§ã¯ã .wasm
ãã¡ã€ã«ã¯çŸåšã®ãã£ã¬ã¯ããªãšãµããã£ã¬ã¯ããªå
ã®ãã¡ã€ã«ã«ã®ã¿ã¢ã¯ã»ã¹ã§ãããšããããšã§ãã ãã ãããã£ã¬ã¯ããªã«ã¯wasi_import_map.json
ãã¡ã€ã«ãå«ããããšãã§ããŸããããã¯ããµããã£ã¬ã¯ããªå
ã®.wasm
ãã¡ã€ã«ãã¢ã¯ã»ã¹ã§ããããã¯ã宣èšããŸãã
äŸãã°ïŒ
myWasmModule/
index.wasm
foo/
wasi_import_map.json
foo.wasm
foobar/
foobar.wasm
bar/
bar.wasm
äžèšã®äŸã§ã¯ïŒ
index.wasm
ã¯ã foo.wasm
ã foobar.wasm
ãããã³bar.wasm
$ãã€ã³ããŒãã§ããŸããfoo.wasm
ãšbar.wasm
ã¯ãçžäºã«ã€ã³ããŒããããã index.wasm
ãã€ã³ããŒããããããããšã¯ã§ããŸãããfoobar.wasm
ã¯ã foo/wasi_import_map.json
ããã®ãã¹ãžã®ããŒãæã£ãŠããå Žåã$ foo.wasm
ãã€ã³ããŒãã§ããŸããfoo/wasi_import_map.json
ã¯ã foo.wasm
ãŸãã¯foobar.wasm
ã«index.wasm
ãŸãã¯bar.wasm
$ãžã®ã¢ã¯ã»ã¹ãèš±å¯ããããšã¯ã§ããŸãããã€ã³ããŒããããã³ã°ã«ã¯ããã€ãã®ãŠãŒã¹ã±ãŒã¹ããããŸãã
ããã±ãŒãžãããŒãžã£ãŒãäŸåé¢ä¿ã®éè€æé€ãé©çšããŠãã³ã³ãã€ã«æéãççž®ããã³ãŒããã£ãã·ã¥ãµã€ãºãæ¹åã§ããããã«ããŸãã
ã·ã ãšããªãã£ã«ãæäŸããŸãã
ãããã°ãã«ããšãªãªãŒã¹ãã«ãã«ç°ãªãã©ã€ãã©ãªã䜿çšããŸãã
WICGã®ã€ã³ããŒããããã®ææ¡ïŒä»åŸã¯WIMïŒãåå©çšããæ¹ãç°¡åã§ããã $
ãš@
ã®ç¹æ®ãªã±ãŒã¹ããããšãéåžžã«è€éã«ãªããšããè°è«ããããŸãã
ããã€ãã®å¯Ÿäœæ³ïŒ
WIMã¯ãWASIã€ã³ããŒãããããšã¯ç°ãªãåé¡ã解決ããŸãã WIMã¯ãéçã¢ãã¬ã¹ã§ãã§ããåŒã³åºããè¡ãããšã¯äžè¬çã«å®å šã§ãããããŒã¿ããªãŒã¯ã§ããªããšããååã«åºã¥ããŠããŸãã ãã®ææ¡ã¯ã代ããã«å®å šæ§ã®OCAPã¢ãã«ã«äŸåããŠããŸãã
éåžžã®ã€ã³ããŒãããã¹ãã®ã€ã³ããŒããããã³ããããããã€ã³ããŒãã«åå¥ã®æ§æã䜿çšãããšãéçºè ãšããŒã«ããã®æå³ãå ·äœçã«äŒããããšãã§ããŸãã ãŸããããèªã¿ããããšã©ãŒã¡ãã»ãŒãžã奚å±ããŸãã
ãã®ææ¡ã¯ããã€ãã£ãã®wasméèš³è ã察象ãšããŠããããšã«æ³šæããŠãã ããã ãã©ãŠã¶ãã€ã³ããŒãæé ã解決ããæ¹æ³ã¯ããã®ææ¡ããå®å šã«ç¬ç«ããŠããŸãã
ãã ããããã±ãŒãžãããŒãžã£ãŒã®ãšã³ã·ã¹ãã ããã®ã€ã³ããŒãæ§é ãäžå¿ã«éçºãããå ŽåãWebpackãRollupãªã©ã®ãã³ãã©ãŒã¯ãçŸåšnpmã§è¡ã£ãŠããããã«ããã®æ§é ã®ãã©ãŠã¶ãŒå¯Ÿå¿ããŒãžã§ã³ã®æäŸãéå§ã§ããŸãã
ãšã«ããããããç§ã®ææ¡ã§ãã ãã£ãŒãããã¯ãæè¿ããŸã:)
ç¹å®ã®æ§æã䜿çšãã代ããã«ãwasiå®è£
ãlibpreloadã¹ã¿ã€ã«ã®æ©èœã«ãŒã«ãã€ã³ããŒã解å床ã«é©çšããããšããå§ãããå Žåã¯ã©ããªããŸããïŒ a.wasm
ãšb.wasm
ãããå Žåã¯ãwasiãããã§ã¹ãã§.
ãŸãã¯./b.wasm
ã宣èšããŠã a.wasm
ããã€ã³ããŒãã§ããŸãã
ããã«ãããwasiã¯ããã©ãŠã¶ãŒãããŒããªã©ãçµåã§ããä»ã®ã©ã³ãã ã·ã¹ãã ãšã®äºææ§ãå€§å¹ ã«åäžããŸãã
ç§ã¯ãã®ææ¡ã®äžè¬çãªæ¹åæ§ã奜ãã§ãã libsãä»»æã«ã€ã³ããŒããååŸããã®ãé²ãããšãéèŠã®ããã§ãã ãŸãããã®ææ¡ãããªã軜éã§ããããšãæ°ã«å ¥ã£ãŠããŸãã ãã ããããã€ãã®èãããããŸãã
ã€ã³ããŒããããã®èª¬æã¯å°ãäžå®å
šã§ãã ããããšã³ããªa: b/c
$ã§ã $a
ãšããååã§b/c
ãã€ã³ããŒãã§ãããšããèãã¯ãããŸããïŒ ãããããªããã€ã³ããŒãã¢ãžã¥ãŒã«ã¯ååãïŒåïŒãããã³ã°ãããŠããããšãèªèããå¿
èŠãããããããããã©ã®ããã«ã©ã€ãã©ãªã®ã·ãã³ã°ãŸãã¯åãããã³ã°ãå¯èœã«ããã®ãããããŸããã $
ãã¬ãã£ãã¯ã¹ãå¿
èŠãªã®ã¯ãªãã§ããïŒ
ãã£ã¬ã¯ããªãããã¢ãžã¥ãŒã«ã®ããã«æ±ããšããã§ããããåãã£ã¬ã¯ããªã¯ãåšå²ã«ããšã¯ã¹ããŒãããããã¡ã€ã«ãå¶éããããšãã§ããŸãã ãã®ãããªããšã¯ã¹ããŒãããããã¯ãå åãã®ç°å¢ãå®çŸ©ããã€ã³ããŒããããã«è¿œå ãããŸãã ãšã¯ã¹ããŒãããããæå®ãããŠããå Žåãã¢ãžã¥ãŒã«ããã¢ã¯ã»ã¹ã§ããã®ã¯ãããã«ãªã¹ããããŠãããã¡ã€ã«/ãã¹ã®ã¿ããŸãã¯åšå²ã®ãã£ã¬ã¯ããªãŸãã¯å åŒãã£ã¬ã¯ããªã®ããããã€ã³ããŒã/ãšã¯ã¹ããŒãã§ããŸãã
åœåã¡ã«ããºã ãšããŠæšæºã®URIåç
§ã䜿çšããããšã«åŒ·ãåæããŸãã ãã ãã @
ãŸãã¯$
ãã¬ãã£ãã¯ã¹ã¯ãçžå¯Ÿåç
§ã®æŠå¿µãå°ãä¹±çšããŠããŸãïŒ @a/b
ã¯URIçšèªã§ã®çžå¯Ÿåç
§ã§ãããããã§å²ãåœãŠãããã»ãã³ãã£ã¯ã¹ã¯éåžžã«refã®çµ¶å¯Ÿçãªåœ¢åŒïŒã
BikesheddingïŒãããã®ã€ã³ããŒãã«JSONã䜿çšããããšã«ã¯å€ãã®ã¡ãªããããããŸããïŒ ããªãããããã説æãããšãããããã¯åã«ãã¹ãã¢ã®ãªã¹ãã§æ§æãããŠããã®ã§ãJSONã®ãããªè€éã§æ··ä¹±ãããã©ãŒãããã¯ããã«ã¯ããéããããããŸããã
ãããããªãããããã©ã®ããã«ã©ã€ãã©ãªã®ã·ãã³ã°ãŸãã¯åãããã³ã°ãå¯èœã«ããã®ãããããŸãã
ç§ã¯äŸåæ§æ³šå
¥ã«ã€ããŠèããŠããŸãããããšãã°ã2ã€ã®ã¢ãžã¥ãŒã«ãreactã®åãã€ã³ã¹ã¿ã³ã¹ã䜿çšããå¿
èŠãããã $react
ãã€ã³ããŒããããããžã§ã¯ãã«ãŒãã«äŸåããŠãããã³ã°ãæäŸã§ããŸãã
ããããä»èããŠã¿ããšã2ã€ã®ãã¡ã€ã«/ã¢ãžã¥ãŒã«ãåããã¡ã€ã«/ã¢ãžã¥ãŒã«ãã€ã³ããŒããããšãã«ã©ãããããšããåé¡ãçºçããŸãã 2ã€ã®å¥ã ã®ã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸããããããšã1ã€ã®å ±æã€ã³ã¹ã¿ã³ã¹ãäœæããå¿ èŠããããŸããïŒ ã©ã¡ãã®åçã«ããŠãŒã¹ã±ãŒã¹ããããŸãã
ãŸãããããã°ããªãªãŒã¹ãåäœãã¹ããªã©ã®ããã«è€æ°ã®wasm_import_mapãã¡ã€ã«ãäœæããã¡ã«ããºã ããããããããªããšèããŠããŸããããããã¯ææå°æ©ã®æ©èœã¯ãªãŒãã®ããã§ãã Wasmã¯å®éã«ã¯Cmakeã«ãªãå¿ èŠã¯ãããŸããã
$ãã¬ãã£ãã¯ã¹ãå¿ èŠãªã®ã¯ãªãã§ããïŒ
ããã«ããããšã©ãŒã¡ãã»ãŒãžã³ã°ãããæ確ã«ãªããåé¡ã®èšºæãããè¿ éã«ãªããŸãã
Cannot find host module "@foobar"
vs
Cannot find file "some/path/foobar.wasm"
vs
Key "$foobar" not found in imports maps:
- "some/path/wasm_import_map.json"
- "some/wasm_import_map.json"
ãã¬ãã£ãã¯ã¹ããªããšããããšã¯ããã¹ãŠã®å¯èœæ§ããªã¹ãããé·ããšã©ãŒã¡ãã»ãŒãžããããããfoobarã解決ã§ããŸããããšããCã³ã³ãã€ã©ãšåãæŒ ç¶ãšããã€ã³ããŒããšã©ãŒãçºçãããã®çç±ãæšæž¬ã§ããããšãæå³ããŸãã
ãã£ã¬ã¯ããªãããã¢ãžã¥ãŒã«ã®ããã«æ±ããšããã§ããããåãã£ã¬ã¯ããªã¯ãåšå²ã«ããšã¯ã¹ããŒãããããã¡ã€ã«ãå¶éããããšãã§ããŸãã
ãšã¯ã¹ããŒããããã¯ããã»ã©æçšã§ã¯ãªããšæããŸãã ããšãã°ãããã€ã³ãã£ã³ã°ããµãã¢ãžã¥ãŒã«ãšããããã¯ãŒã¯ããµãã¢ãžã¥ãŒã«ããšã¯ã¹ããŒãããã¢ãžã¥ãŒã«ã¯ãã«ãŒãã«bindings.wasm
ïŒ$ãã¡ã€ã«ãšnetwork.wasm
ãã¡ã€ã«ãå«ããããšãã§ããŸãã
ãã¡ã€ã«ã·ã¹ãã ã®å®å šæ§ã®ããã«èŠªãã£ã¬ã¯ããªããã®ã€ã³ããŒããå¶éããã¡ã«ããºã ãå¿ èŠã§ãããåãã£ã¬ã¯ããªããã®ã€ã³ããŒããå¶éããå¿ èŠã¯ãããŸããïŒã»ãšãã©å¶éã§ããŸããïŒã
ãããã®ã€ã³ããŒãã«JSONã䜿çšããããšã«ã¯å€ãã®å©ç¹ããããŸããïŒ
ããŸãã ç§ããããããã«ã€ããŠèããŠããŸããããå®éã«ã¯ãã©ã®ãã©ãŒãããã§ãå¯èœã§ãã 1ã€ãŸãã¯2ã€ã®ããã©ã«ã圢åŒãå¿ èŠã§ãã
ç§ã¯äŸåæ§æ³šå ¥ã«ã€ããŠèããŠããŸãããããšãã°ã2ã€ã®ã¢ãžã¥ãŒã«ãreactã®åãã€ã³ã¹ã¿ã³ã¹ã䜿çšããå¿ èŠãããã$ reactãã€ã³ããŒããããããžã§ã¯ãã«ãŒãã«äŸåããŠãããã³ã°ãæäŸã§ããŸãã
åœåèŠåãä»ããŠ$
ãä»ããŠãã©ã¡ãŒã¿ãŒãæå®ã§ããŸããããã¯ãæ§æäžã®èŠä»¶ãšããŠãããçŒãä»ããå¿
èŠãããããšãæå³ãããã®ã§ã¯ãããŸããã æããã«ããã¹ãŠã®çšéããã©ã¡ãŒã¿åã§ãããšã¯éããŸããïŒäžéšã®æ··ä¹±ããéãååãå€æŽããããããäŸåæ§æ³šå
¥ããšãåŒã°ããŸã:)ïŒã ã·ãã³ã°ã®å Žåãã·ã¹ãã ã¢ãžã¥ãŒã«ïŒã€ãŸãã説æã§@
ã§å§ãŸãååïŒãå«ãä»»æã®ã¢ãžã¥ãŒã«ãåãããã§ããå¿
èŠããããšæããŸãã
ãšã©ãŒã¡ãã»ãŒãžã¯è§£æ±ºå¯èœãªåé¡ã®ããã§ãã ç¹ã«ã説æããã·ã¹ãã ã¯ååã«åçŽã§ãããããã€ãŸããååã¯èŠªdirãŸãã¯ãã®äžã®ãããã®ããããã§ã®ã¿èŠã€ããããšãã§ããŸãã
ãšã¯ã¹ããŒããããã¯ããã»ã©æçšã§ã¯ãªããšæããŸãã ããšãã°ããbindingsããµãã¢ãžã¥ãŒã«ãšãnetworkããµãã¢ãžã¥ãŒã«ããšã¯ã¹ããŒãããã¢ãžã¥ãŒã«ã¯ãã«ãŒãã«bindings.wasmãã¡ã€ã«ãšnetwork.wasmãã¡ã€ã«ãå«ããããšãã§ããŸãã
ããã¯ããã¹ããããdirã®ã€ã³ããŒããããã³ã°ã¢ãžã¥ãŒã«ã«ãã£ãŠèª°ããæå³ããªãŒããŒã©ã€ãããã®ãé²ãã§ããããïŒ
ãšã©ãŒã¡ãã»ãŒãžã¯è§£æ±ºå¯èœãªåé¡ã®ããã§ãã
ããããããã#include
ã§ããŸããã倱æããã©ã€ãã©ãªã€ã³ã¯ã«ãŒãã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ã¯é©ãã»ã©é£ããå ŽåããããŸãã
ãããã«ããããŠãŒã¶ãŒã«æå³ãæå®ãããããšã«ã¯åºæã®äŸ¡å€ããããšæããŸãã ããã¯ããŠãŒã¶ãŒãäœãæãã§ããããæ確ã«ç解ããŠããããŒã«èšèšè ã«ãšã£ãŠæåã®èœãšãç©ŽãšãªããŸãã ãŸãããŠãŒã¶ãŒã¯ããŒã«ãã§ãŒã³ã®ä»çµã¿ãããç°¡åã«ç解ã§ããŸãã
ã·ãã³ã°ã®å Žåãã·ã¹ãã ã¢ãžã¥ãŒã«ïŒã€ãŸãã説æã®äžã§@ã§å§ãŸãååïŒãå«ãä»»æã®ã¢ãžã¥ãŒã«ãåãããã§ããå¿ èŠããããšæããŸãã
ä»»æã®ã¢ãžã¥ãŒã«ã«é¢ããŠãç§ã¯ãããé¿ããããã«å ·äœçã«ææ¡ãæžããŸããã WICGã€ã³ããŒããããã§å¯èœãªæ¹æ³ã§ã€ã³ããŒããã·ã ã§ããããã«ãããšãåºã«ãªããã¶ã€ã³ã®å ç¢æ§ãäœäžããKISSãæžå°ããå€ãã®ååã·ã£ããŠã€ã³ã°ãšã©ãŒ/ãšã¯ã¹ããã€ããçºçããå¯èœæ§ããããŸãã
ïŒããã¯WICGã€ã³ããŒããããã«å¯Ÿããæ¹å€ã§ã¯ãããŸãããç§ãèšã£ãããã«ããããã¯ããŸããŸãªãŠãŒã¹ã±ãŒã¹ã«å¯Ÿå¿ããŠããŸãïŒ
ã»ãšãã©ã®ã·ãã³ã°ã®ãŠãŒã¹ã±ãŒã¹ã§ã¯ãäŸåæ§æ³šå
¥ã®ãã©ã¡ãŒã¿ãŒåã§ååã ãšæããŸããããç
©ãããã·ãã³ã°ã®å Žåã¯ãããŒã«ã䜿çšããŠãäžéšã®ãã¡ã€ã«ãä»ã®ãã¡ã€ã«ã«ãæåã§ã眮ãæããããšãã§ããŸãã
ReïŒã·ã¹ãã ã¢ãžã¥ãŒã«ãæãäžè¬çãªãŠãŒã¹ã±ãŒã¹ã¯åäœãã¹ãã§ããããããããã®ã·ãã³ã°ã¯WebAssembly.instantiate
APIã¬ãã«ã§è¡ããããšèããŠããŸããã
æ§æã¯åžžã«$
ãšããŒãžã§ããŸãããããã§ããæå³ãè¡šçŸããããšã«äŸ¡å€ããããŸãã
ïŒãŸããææªã®ã·ããªãªã§ã¯ã@ãš$ãå»æ¢ãããªãã·ã§ã³ã®åœåèŠåã«ããŸããéã®é²è¡ã¯äºææ§ãæãªããŸãïŒ
ããã¯ããã¹ããããdirã®ã€ã³ããŒããããã³ã°ã¢ãžã¥ãŒã«ã«ãã£ãŠèª°ããæå³ããªãŒããŒã©ã€ãããã®ãé²ãã§ããããïŒ
ããããã§ããããåé¡ãã©ããã¯ããããŸããã
ã¢ãžã¥ãŒã«äœæè ã®æå³ãç¡å¹ã«ããéããããã¯ã¢ãžã¥ãŒã«ãŠãŒã¶ãŒã®ç¹æš©ã§ãã ã¢ãžã¥ãŒã«ã®å éšããããããå Žåã¯ãèªå·±è²¬ä»»ã§è¡ã£ãŠãã ããããšã«ããã¢ãžã¥ãŒã«ããã©ãŒã¯ããããšã§ãããè¡ãããšãã§ããŸãã
ãµã³ãããã¯ã¹ã®å®å
šæ§ã«é¢ããéããæªæã®ããã¢ãžã¥ãŒã«ãä»ã®ããã°ã©ã ãšå
±æãããŠããå€éšã¢ãžã¥ãŒã«ãã€ã³ããŒãããŠãäžå€æ¡ä»¶ãç Žãå ŽåïŒããšãã°ã /usr/bin/game_engine/save_progress
ãã€ã³ããŒããã代ããã«ãæªæã®ããã³ãŒãã/usr/bin/game_engine/save_progress/unsafe_filesystem_functions
ãã€ã³ããŒãããå ŽåïŒã¯åé¡ã«ãªãå¯èœæ§ããããŸãã
ãã ãããããããã®åé¿çã¯ãããŸããããšã«ããæ»æãã¯ãã«ã®å¯èœæ§ã¯ããŸããªããšæããŸãã
ããããç§ããæåã®èœãšãç©Žããšãå®å šãªãµã³ãããã¯ã¹åãã¢ãããŒããç®æããŠããã®ãªããããã¯ocapãšWASIã®ãã€ã³ãã®äžçš®ã§ãããããããèæ ®ããå¿ èŠããããŸãã
ååã¯ã芪dirsãŸãã¯ãã®äžã®ãããã®ããããã§ã®ã¿èŠã€ããããšãã§ããŸãã
ãã®äžã®å°å³ãã¯ãã芪ã®dirsããããã
芪ãã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããšããµã³ãããã¯ã¹ãæ©èœããªããªããèš±å¯ãããŸããã
.wasm
ãã¡ã€ã«ã¯ä»¥äžã«ã®ã¿ã¢ã¯ã»ã¹ã§ããŸãïŒ
.wasm
ãã¡ã€ã«.wasm
ãã¡ã€ã«wasm_import_map.json
ãã¡ã€ã«ã€ã³ããŒããããèªäœã¯åãã«ãŒã«ã«åŸãããµããã£ã¬ã¯ããªã®wasmãã¡ã€ã«ãšèŠªã®ã€ã³ããŒããããã«ã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã
ãŠãŒã¶ãŒã«æå³ãæå®ãããããšã«ã¯åºæã®äŸ¡å€ããããšæããŸãã
ç§ã¯éåžžã«åæããŸããããã®å Žåãå¥ã®æå³ã«é¢é£ããæå¹ãªãŠãŒã¹ã±ãŒã¹ãææå°æ©ã«çŠæ¢ããŠããããã§ãã
ã¢ãžã¥ãŒã«äœæè ã®æå³ãç¡å¹ã«ããéããããã¯ã¢ãžã¥ãŒã«ãŠãŒã¶ãŒã®ç¹æš©ã§ãã ã¢ãžã¥ãŒã«ã®å éšããããããå Žåã¯ãèªå·±è²¬ä»»ã§è¡ã£ãŠãã ããã
ãã...ç§ã¯åã«ãã®è°è«ãèããããšããããŸã;ïŒã æ®å¿µãªãããããã¯ã²ãŒã çè«ãå®éã«å®è¡ãããæ¹æ³ã§ã¯ãããŸããã ãã®ãããªæå³ãæ瀺çã«è¡šçŸããïŒããçšåºŠïŒåŒ·å¶ããæ¹æ³ããªãå Žåãäœãããããæ¢ããŠããªãã®ã§ã誰ããããããªãŒããŒã©ã€ãããŸãã ãããŠã人æ°ã®ãã1人ã®ã¯ã©ã€ã¢ã³ãã ããããããå¿ èŠããããçªç¶ãã¢ãžã¥ãŒã«ã©ã€ã¿ãŒã¯ãéå ¬åŒã®APIãä¿æããããã³ãŒããå£ãæŽæ°ã®ããã«æšç§»çãªé¡§å®¢ãããã¹ãŠã®ç«ãåŸãã®ã¯åœŒãã®ãã¹ãŠã®è² æ ã§ããããšã«æ°ä»ããŸãã ããã«è¡ã£ãŠããããããŸããã é©åã«èšèšãããã·ã¹ãã ãåé¿ã«åœ¹ç«ã€ã¯ãã®ç¶æ³ã§ãã
ã²ãŒãã£ã³ã°ã€ã³ããŒãã®2ã€ã¯ãã²ãŒãã£ã³ã°ãšã¯ã¹ããŒãã§ãã Wasmã¢ãžã¥ãŒã«ã¯ãäž¡æ¹ãä»ããé©åãªã«ãã»ã«åãæå³çã«ãµããŒãããŠããŸããåãããšã1ã¬ãã«äžã§ãåœãŠã¯ãŸãã¯ãã§ãã
芪ãã£ã¬ã¯ããªå ã®ãã¡ã€ã«ã«ã¢ã¯ã»ã¹ãããšããµã³ãããã¯ã¹ãæ©èœããªããªããèš±å¯ãããŸããã
ããã§ããç§ã¯èŠªãã£ã¬ã¯ããªã®ã€ã³ããŒããããã®ã¿ãæå³ããŸãããããŸãã¯ãã¯ããããªèšãåãã§ããã
ããã«è¡ã£ãŠããããããŸããã é©åã«èšèšãããã·ã¹ãã ãåé¿ã«åœ¹ç«ã€ã¯ãã®ç¶æ³ã§ãã
ãã£ããã ã
ç§ã¯éåžžã«åæããŸããããã®å Žåãå¥ã®æå³ã«é¢é£ããæå¹ãªãŠãŒã¹ã±ãŒã¹ãææå°æ©ã«çŠæ¢ããŠããããã§ãã
æ確ã«ããããã«ãå ¥åããããã¬ãã£ãã¯ã¹ã«é¢ããäž»ãªäºçŽã¯æ¬¡ã®ãšããã§ãã
åŸè ã ãšã¯æããŸããããããã ãšããã°ãç§ãææ¡ããŠããèšèšã¯æ£æçã§ã¯ãªããäºæããªãå°æ¥ã®ãŠãŒã¹ã±ãŒã¹ãšåãããã«å¯ŸåŠããå¿ èŠã®ããåé¡ãã«ããŒããŠãããããå察ããå¿ èŠããããŸãã
åè ã®å Žåãææ¡ã調æŽã§ããããã«å ·äœçãªäŸãèããŠããŸããïŒ æããã«ãèšèšãããwasmããã±ãŒãžãšã³ã·ã¹ãã ã¯ãŸã ååšããŠããŸããããæŒ ç¶ãšããããã£ã¬ã¯ããªYå ã«XããããZãã·ã ãããããšãããŠãŒã¹ã±ãŒã¹ã§ã圹ã«ç«ã¡ãŸãã
æ確ã«ããããã«ããã¬ãã£ãã¯ã¹ãå«ããçç±ã¯æ¬¡ã®ãšããã§ãã
streams.wasm
ãšããååã®ãã¡ã€ã«ãã€ã³ããŒããã stream
ãšããååã®ããã±ãŒãžãã«ãŒããããžã§ã¯ãã«è¿œå ãããããã«ããã±ãŒãžãç Žæãããªã©ãã·ã£ããŠã€ã³ã°ã®åé¡ãåé¿ããŸããWASM / WASIãã¢ãžã¥ãŒã«ã®åäœãã«ããŒããå¿ èŠããããã©ããèå³ããããŸãã ç§ã®æåã®èãã¯ãã¢ãžã¥ãŒã«ã·ã¹ãã ã«é¢ä¿ãªãå€ãã®å Žæã§äœ¿çšã§ããããã«ã䜿çšãã¹ãã§ã¯ãªããšããããšã§ãã wasmtimeãWASMã¢ãžã¥ãŒã«ãããŒãããŠãªã³ã¯ããæ¹æ³ã¯ãããŒããWASMã¢ãžã¥ãŒã«ãããŒãããŠãªã³ã¯ããæ¹æ³ãšã¯å€§ããç°ãªããŸãããçæ³çã«ã¯äž¡æ¹ãšããæ£ããæ©èœãããå¿ èŠããããŸãã
ãããã®è©³çŽ°ã®ããã€ãã«ã€ããŠãWebç°å¢ãšéWebç°å¢ã調æŽããããšã¯å¯èœãã©ããçåã«æããŸãã
ããšãã°ãè¡šé¢çãªè©³çŽ°ã«ã€ããŠã¯ã次ã®ããã«ãªããŸã@namespace/modulename
ãæå±ããŸããããWebã¯çµã¿èŸŒã¿ã¢ãžã¥ãŒã«ã®namespace:modulename
ã«åãã£ãŠããããã§ããããã¯ç§ã«ã¯åé¡ãªãããã§ãéWebç°å¢ãåæ§ã§ãã
ããåºçŸ©ã«ã¯ãWasm / ESMçµ±åææ¡ã¯JSé 管ã䜿çšããŸãããããã¯ãJSã®å€éšã§ãåæ§ã«æå³ã®ããããã€ãã®ãã®ããšã³ã³ãŒãããããã«è¡ãããŸããããšãã°ãçžäºã®é¢æ°ãšã¯ã¹ããŒãã埪ç°çã«ã€ã³ããŒãããè€æ°ã®Wasmã¢ãžã¥ãŒã«ã䜿çšããããšã¯ã§ããŸããïŒã€ã³ã¹ã¿ã³ã¹åäžã«ãšã©ãŒãçºçããŸããïŒã ãããã®ç°å¢éã®ã»ãã³ãã£ã¯ã¹ãããæ確ã«ããããã«ãESMçµ±åä»æ§ãè¡šçŸããããã«äœæ¥ã§ãããã©ããçåã«æããŸãã
wasmtimeãWASMã¢ãžã¥ãŒã«ãããŒãããŠãªã³ã¯ããæ¹æ³
çŸåšãwasmtimeã¯WASMã¢ãžã¥ãŒã«ããŸã£ãããªã³ã¯ããŠããªããšç¢ºä¿¡ããŠããŸãã ããã¯ææžåãããæ©èœã§ã¯ãªããç§ã®ãã¹ãã§ã¯çµéšçã«æ©èœããŸããããœãŒã¹ãèŠããšã Resolver
ã€ã³ã¿ãŒãã§ã€ã¹ã¯Namespace
ïŒ wasi_unstable
ãšäžèŽããïŒã§ã®ã¿å®è£
ãããŠããŸããä»ã®ããŒãã³ãŒããããååïŒããã³NullResolver
ã
ç§ã®æåã®èãã¯ãã¢ãžã¥ãŒã«ã·ã¹ãã ã«é¢ä¿ãªãå€ãã®å Žæã§äœ¿çšã§ããããã«ã䜿çšãã¹ãã§ã¯ãªããšããããšã§ãã
ããããããã¯å®éã«ã¯å®éã«ã¯ã©ã®ããã«æ©èœãããã§ã¯ãããŸããã ã誰ããèªåã®ããŒãºã«æãé©ãããã®ãå®è¡ã§ããããã«ãéåžžã«äžè¬çãªæšæºãçšæããå¿ èŠããããŸãããšèšããšãã競åããèŠåãéå ¬åŒã®æšæºã12ãããã©ããåé¡ã®é åã«æ£ãã察åŠããŠããããã»ãšãã©ã®ããŒã«ã¯2ã€ãŸãã¯3ã€ããç解ã§ããŸããããã®ãã¡ã®"ã
ç§ã¯@namespace / modulenameãæå±ããŸããããWebã¯çµã¿èŸŒã¿ã¢ãžã¥ãŒã«ã®namespaceïŒmodulenameã«åãã£ãŠããããã§ãã
ãã¡ããã æ§æã¯ããŠããããã¡ã€ã«ã·ã¹ãã ã®ã€ã³ããŒããšãã©ã¡ãŒã¿ãŒåãããã€ã³ããŒããšãã¹ãã®ã€ã³ããŒããåºå¥ãããšããã¢ã€ãã¢ã«ãã£ãšèå³ããããŸãã
ããåºçŸ©ã«ã¯ãWasm / ESMçµ±åææ¡ã¯JSé 管ã䜿çšããŸãããããã¯ãJSã®å€éšã§ãåæ§ã«æå³ã®ããããã€ãã®ãã®ããšã³ã³ãŒãããããã«è¡ãããŸããããšãã°ãçžäºã®é¢æ°ãšã¯ã¹ããŒãã埪ç°çã«ã€ã³ããŒãããè€æ°ã®Wasmã¢ãžã¥ãŒã«ã䜿çšããããšã¯ã§ããŸããïŒã€ã³ã¹ã¿ã³ã¹åäžã«ãšã©ãŒãçºçããŸããïŒã
ãããããããã®ææ¡ãæãæ¬ ããŠããåéã ãšæããŸãã ãªã³ã¯ã»ãã³ãã£ã¯ã¹ãããé©åã«å®çŸ©ããesm-integrationãªããžããªã§åé¡ãäœæããŠãªãŒããŒã©ããã«ã€ããŠèª¬æããå¿ èŠããããŸãã
ç§ãèšãããã£ãã®ã¯ãã€ã³ããŒãæ§æã解決çãªã©ã®ç¹å®ã®ãã®ãæå®ããããšã¯é¿ããã¹ãã§ãïŒãã ããocapã«ãŒã«ãªã©ã¯ãã£ãããã§ãïŒã wasmãçµ±åãããã·ã¹ãã ã¯ãç§ãã¡ãšè¡çªããå¯èœæ§ã®ããç¹å®ã®æ§æããã³è§£æ±ºã·ã¹ãã ããã§ã«äœ¿çšããŠããå¯èœæ§ããããŸãã ãã¹ããã¡ã€ã«ã®æŠå¿µããæã£ãŠããªããããããŸããã
ç°¡åãªãŠãŒã¹ã±ãŒã¹ã¯ãããŸããã ãã ããæŠå¿µçã«ã¯ãã¢ãžã¥ãŒã«åç §ã«ã¯2çš®é¡ãããããŸãããéåžžã¯åãã³ã³ããŒãã³ãã®äžéšã§ããåºå®ã®æ¢ç¥ã®ã¢ãžã¥ãŒã«ãåç §ãã確å®çãªãã®ãšãäºå®äžãã©ã¡ãŒã¿ãŒã§ãããã¢ãžã¥ãŒã«ã®ã¯ã©ã€ã¢ã³ãã«ãã£ãŠè§£æ±ºãããäžç¢ºå®ãªãã®ã§ãã ïŒèå³æ·±ãããšã«ãWasmèªäœã«ã¯åŸè ãããããŸãããïŒ
ãã®èŠ³ç¹ããã第3ã®çš®é¡ãäœãè¿œå ãããã¯ç§ã«ã¯å®å
šã«ã¯æããã§ã¯ãããŸããã ä»ã®äž¡æ¹ã®çš®é¡ããšãã¥ã¬ãŒãã§ããã«ã¹ã¿ãã€ãºå¯èœãªãªãŒããŒã¬ã€ã¡ã«ããºã ããããšãã©ã®ããã«åœ¹ç«ã€ããããããŸãã ããããããã¯äž¡æ¹ã®æ§æ圢åŒããšãããšãã§ããå Žåã«ã®ã¿æå³ããããŸãã OTOHãä»ã®ãã®ããªãŒããŒã¬ã€ã§ããªãå Žåãããã±ãŒãžã®ã€ã³ããŒããšã¯æå³çã«ã©ã®ããã«ç°ãªããŸããïŒã€ãŸãã @
ãš$
ã®ããæ·±ãéãã¯äœã§ããïŒéãïŒ
ããããããªãã®çãã¯ãéãã¯æå³ããã解決çã®èªçšè«ã«ãããšããããšã§ãããåœåèŠåã¯ããããååã§ãããã
ããŠãç§ã¯ããªãã®è³ªåãä»ããç解ããŠãããšæããŸãã
@ãš$ã®ããæ·±ãéãã¯äœã§ããããããŠãªããã®éããé ç·ããããšãæçãªã®ã§ããïŒ
ç§ã¯ãã£ââãšé·ãçããèšç»ããŠããŸãããããããæžããŠãããšãã«ãç§ã¯ãã®éãã®æçšæ§ãèªåèªèº«ã§çåèŠãå§ããŠããŸãã
ç§ã®æšè«ã¯ããµã³ãããã¯ã¹ã®å®å šæ§ã®ããã«åãã£ã¬ã¯ããªã®ã¿ãæã確å®åç §ãå¿ èŠã§ãããšããããšã§ããã芪ãã£ã¬ã¯ããªãžã®ç¢ºå®åç §ãäœæããããã®ã¡ã«ããºã ãå¿ èŠã§ã...å®éã«ãããããã©ããã¯ããããŸãããïŒ
ç§ãèããŠãããŠãŒã¹ã±ãŒã¹ã¯ãäž»ã«ã·ãã³ã°ãšä»£æ¿ãã«ãïŒåäœãã¹ãããããã°ããªãªãŒã¹ïŒã§ããããããããããã±ãŒãžã·ã¹ãã ã§ãã€ã¯ããå¿ èŠã¯ãããŸããã
æšæºã®ã€ã³ããŒãããããè¿œå ããå Žåã¯ã誀ã£ãŠã·ã£ããŠã€ã³ã°ã®åé¡ãçºçããªãããã«è¿œå ããå¿ èŠããããšæããŸãããã€ã³ããŒããããããªãã©ã€ã³ã®ã€ã³ããŒã解決ã«åœ¹ç«ã€ãã©ããã¯ããããŸããã
ãšã«ããã $
æ§æãåé€ããŠããããã€ã³ããŒããããšä»®å®ãããšãææ¡ã®æ®ãã®éšåã¯æšæºåãã䟡å€ããããšæããŸããïŒ
ä¿®æ£ãããææ¡ã¯æ¬¡ã®ããã«ãªããŸãã
ãªãã·ã§ã³ã®ãã¡ã€ã«ã·ã¹ãã ã«ãŒããªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åAPIã«è¿œå ããŸãïŒ WebAssembly.instantiate
ã wasm_instance_new
ã wasm::Instance::make
ïŒ
ããŒã«ã®èŠåã§ãäžèšã®ãµã³ãããã¯ã¹ã«ãŒã«ã䜿çšããŠãã€ã³ããŒãæååãURIãšããŠè§£æããããã®ä»æ§ãè¿œå ããŸãã
@foo/bar
ãŸãã¯foo:bar
ãŸãã¯W3Cã決å®ãããã®ïŒãäœæããŸããæœåšçãªã€ã³ããŒãããã/ãšã¯ã¹ããŒãããã/ã·ãã³ã°ã¡ã«ããºã ã¯åŸã§è¿œå ã§ããŸãã
ç§ããã®ãããªãã®ã®å¿ èŠæ§ãæããŠããŸããã ãã ãããpackageãïŒnpmãªã©ã®ããã±ãŒãžãããŒãžã£ãŒã®ã³ãŒãã®åäœïŒããcontainerããªã©ãæ ¹æ¬çã«æ°ãããããããžçã«ããã倧ããªãæŠå¿µïŒè€æ°ã®ã¢ãžã¥ãŒã«ãå«ãïŒãå°å ¥ããã«ããŸã äœãæå®ã§ããªãããã«æããŸãã "ïŒã³ã³ããã©ã³ã¿ã€ã ã§å®è¡ã§ããã³ãŒãã®åäœïŒãããã¯ãäžèšã§ææããããã«ããã¹ã«ã€ããŠè©±ãåãããšãã§ããã¢ã³ããšã³ããã¡ã€ã«ã·ã¹ãã ãååšãããšã¯æ³å®ã§ããªãããã§ãã ãããã±ãŒãžããŸãã¯ãã³ã³ãããŒãã®æŠå¿µïŒã©ã¡ããå±éã®ããŸããŸãªãã§ãŒãºã§æå³ããããšæããŸãïŒãã§ãããã解決ãã©ã®ããã«æ©èœããããå ·äœçã«èª¬æããæ¹ãã¯ããã«ç°¡åã§ãã
ãŸãã @ littledanã®ç®æšãå ±æããŸããå®çŸ©ããããã®ã¯ãã¹ãŠãJS / ESMç°å¢ã®å å€ã§åã解éãæã€å¿ èŠããããŸãã ããããã°ãããŒãå ã§ãå€éšã§ã䜿çšã§ããwasmã¢ãžã¥ãŒã«ã®åäžããã±ãŒãžãäœæã§ããŸãã
ç§ã¯ãããã±ãŒãžãŸãã¯ã³ã³ããã®å
šäœçãªæŠå¿µã®å¿
èŠæ§ãäºæž¬ããŠããããã®ææ¡ã調æŽããã³èª¿æŽãå§ããå¿
èŠããããšãã匷ãæ°æã¡ãå
±æããŠããŸãã Webãé€å€ããã¹ãã§ã¯ãããŸãããã module sandbox
ããã®ãŸãŸã«ããŠããå¿
èŠããããŸãã ãã®ææ¡ã¯ã@ lukewagnerãš@ jgravelle-googleã«ããWebIDLææ¡ã@ littledanãš@linclarkã«ããESMçµ±åææ¡ãããã³WASIæšæºã®@ sunfishcode @ tschneidereitã«é¢é£ä»ããããŠããŸãã
Webã¢ã»ã³ããªã¢ãžã¥ãŒã«éã®ãªã³ã¯ãšã€ã³ã¿ãŒãã§ãŒã¹ã®éèŠãªå¯èœæ§ã¯ã次ã®æ©èœã«ãããšæããŸãã
ã¢ãžã¥ãŒã«å
ã®ä¿¡é Œã§ããªãã³ãŒããå€éšããåé¢ããWebassemblyã®module sandbox
ã¯éåžžã«ãŠããŒã¯ãªãã®ã§ããããããã¡ãªãŒããŒãããŒãæªæã®ããã¢ãžã¥ãŒã«ãªã©ã®ã»ãã¥ãªãã£ã®è匱æ§ãæã€ãµãŒãããŒãã£ã®ã³ãŒãã䜿çšãããšãã«ã»ãã¥ãªãã£ã²ãŒããå°å
¥ããå¯èœæ§ããããšæããŸããã³ãã¥ããã£å
ã§ããåºãèŠéããããã³ãã¥ããã£ã®ãããã¡ã€ãªã³ã°ãããå°é家ããå®éã«ã¯å察ã®åŒ·ã䞻匵ããããŸããã
ç§ã®æžå¿µã¯ããã®ã¢ãžã¥ãŒã«ãµã³ãããã¯ã¹æ©èœã®èªç¥åºŠãé«ãããããã®ã¢ãžã¥ãŒã«éææ¡ã調æŽããŠç¶æããªããšãæ¥ã®ç®ãèŠãåã«ãã®æ©èœã倱ããæ¬è³ªçã«ããã»ã¹ã«æ»ãå¯èœæ§ãããããšã§ãããµã³ãããã¯ã¹ã ã¢ãžã¥ãŒã«ãµã³ãããã¯ã¹ããã¡ã¢ãªãèªã¿åãããšãå¯èœã«ãããµã€ããã£ãã«ã¿ã€ãã³ã°æ»æãããããšã¯ç¥ã£ãŠããŸãããå°ãªããšãèªã¿åãå°çšã§ãããããšãã°ãæ°åã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããjpgãã³ãŒãã¢ãžã¥ãŒã«ã䟵害ãããå ŽåãããŒã ãšã¯åŒã¹ãªãå Žåã§ãã被害ãå¶éã§ããŸããã€ã³ã¿ãŒãã§ã€ã¹ãç»åãããã¡ã«ã®ã¿ã¢ã¯ã»ã¹ã§ãããããã¯ãŒã¯APIã«ã¢ã¯ã»ã¹ã§ããªãå Žåã¯ãããã«ãã¹ã¯ãŒããéä¿¡ããŸãã
æ£ããè¡ãããå ŽåãWebassemblyã¯ãäºææ§ãã»ãã¥ãªãã£ã管çãªã©ãçŸåšã®ãœãããŠã§ã¢ã·ã¹ãã ã«ãããããã€ãã®æµè¡ãšæ·±å»ãªåé¡ã解決ããã®ã«åœ¹ç«ã€ããå°ãªããšãå°ã蟌ããã®ã«åœ¹ç«ã€ãæ°ãããã£ã€ã«ãã»ãŒãïŒrïŒãã©ã°ã¢ã³ããã¬ã€ã¢ãžã¥ã©ãŒãšã³ã·ã¹ãã ã®å§ãŸãã«ãªãå¯èœæ§ããããŸãåŽåïŒã³ã³ããïŒãšã³ãŒãã®çã寿åœã
ESã¢ãžã¥ãŒã«ã®ããã«äžå€®ã®index.jsãæã€ãã©ã«ããŒã¯ãåäžã®ãã¡ã€ã«ã®äžã«ããã¢ãžã¥ãŒã«ã®æ¬¡ã«å€§ããªãŠããããšããŠåœ¹ç«ã€ããšã蚌æãããŠããããããã®ãã¡ã€ã«ã·ã¹ãã ããŒã¹ã®ã¢ãããŒãã¯å®çšçã§ãããšèããŠããŸããããã§ãããã¡ã€ã«ãçžäºã«äŸåããããŸãŸãå¹ççãªãã¡ã€ã«ãã£ãã·ã³ã°ãå¯èœã«ãªããŸãã ãã ããã¢ãžã¥ãŒã«ãèªèº«ã®ãã£ã¬ã¯ããªã®å€ã«ã¢ãžã¥ãŒã«ãçŽæ¥ã€ã³ããŒãã§ããªãããã«ããå¿ èŠããããšæããŸããnpmããã±ãŒãžåã®ãããªã°ããŒãã«ãªäžæã®åç §ã解決ããããã¹ãã«ããã»ãã¥ãªãã£ãã§ãã¯ãå¿ èŠã«ãªããŸãã
ããã«ã€ããŠäœãèãã¯ãããŸããïŒ
ã¢ãžã¥ãŒã«å
šäœã®ãµã³ãããã¯ã¹ãç¶æããã®ã¯è¯ãããšã§ãã ãã ããã¢ãžã¥ãŒã«ã®åºæïŒå®è£
ã«äŸåïŒãªã©ãã¢ãžã¥ãŒã«éã®é¢ä¿ã«çŠç¹ãåœãŠãããšã¯é¿ããããšæããŸãã ããšãã°ããã¡ã€ã«ã·ã¹ãã å
ã§ããïŒãããŠå€ãã®ãã¡ã€ã«ã·ã¹ãã ãããããããã®ãã¹ãŠããã¡ã€ã«ããªãŒã®æŠå¿µãæã£ãŠããããã§ã¯ãããŸããïŒããããã®æ©èœã·ã¹ãã ã®ã«ãŒã«ïŒäžåããã©ããŒãµã«ãäžåããã©ããŒãµã«ãå
åŒãã¡ã€ã«ãã·ã³ããªãã¯ãªã³ã¯ãçïŒã JSã®WebAssembly
APIã«ã¯ãwasmã®ä¿åå Žæã®æŠå¿µãããããŸããããããã¯ãVMã®åšãã«æµ®ãã¶ããŒã¿ã®å¡ã«ãããŸããã
@devsnekãã¡ã€ã«ã·ã¹ãã ããã¡ã€ã«ã·ã¹ãã ã®å®è£ ã«äŸåããã®ã§ã¯ãªããããã±ãŒãžã®éå±€çå å«ã®ããäžè¬çã§å®å šãªæŠå¿µã«äŸåããæœè±¡åã§ããã¹ãã§ããããšã«å®å šã«åæããŸãã
éå±€çå°ã蟌ã
äºãã«çŽ ãªããŒãã®ããªãŒãšããæå³ã§ãæ¬åœã«éå±€çã§ããå¿ èŠããããŸããïŒ ãããšããæåã°ã©ãïŒã€ãŸããã«ãŒãã®ããããªãŒãïŒãæå³ããŸãããïŒ ã埪ç°äŸåãè£ ã£ãé埪ç°äŸåããå¿ èŠãªç¶æ³ããããŸãïŒå®éã«ã¯ããã»ã©çããããšã§ã¯ãããŸããïŒ-ã¢ãžã¥ãŒã«M1ã®Aã®ã¢ãžã¥ãŒã«M2ã®Bãžã®äŸåãšåæã«ã M2ã®Cã®äŸåM1ã®Dã§ãã¢ãžã¥ãŒã«ãšãã®ããŒã¿ã«è©³çŽ°ãªã¯ãšãªãå®è¡ããŠããããå®éã«ãµã€ã¯ã«ã§ãããã©ããã確èªããïŒç°¡å/ãµããŒã/çµã¿èŸŒã¿/å¯èœïŒæ¹æ³ã¯ãããŸããã ã¢ãžã¥ãŒã«ã¬ãã«ïŒããŒããäºãã«çŽ ãªããªãŒïŒã§ã®ã¿ãã®ãããªäŸåé¢ä¿ã解決ãããšããã®ãããªãã®ã¯äžå¯èœã«ãªããéçºãªã©ãäžå¿ èŠã«è€éã«ãªããŸãã
@dumblobãµãããªãŒå€ã®ã€ã³ããŒãã®å ŽåïŒ
ãã ããã¢ãžã¥ãŒã«ãèªèº«ã®ãã£ã¬ã¯ããªã®å€ã«ã¢ãžã¥ãŒã«ãçŽæ¥ã€ã³ããŒãã§ããªãããã«ããå¿ èŠããããšæããŸããnpmããã±ãŒãžåã®ãããªã°ããŒãã«ãªäžæã®åç §ã解決ããããã¹ãã«ããã»ãã¥ãªãã£ãã§ãã¯ãå¿ èŠã«ãªããŸãã
ååž°çãªèŠªåé¢ä¿ã¯ããã¹ãã ãã§ãªã芪ãåã«èš±å¯ãäžããå Žåã«åœ¹ç«ã€å¯èœæ§ããããšæããŸãã 芪ã¯ãèªåã®èŠªããåãç¶ãããæš©éã®ã¿ãä»äžã§ããŸãã ããã«ã¯ããµãããªãŒã§å®çŸ©ãããŠããªãã芪ãã¢ã¯ã»ã¹ã§ããã¢ãžã¥ãŒã«ãã€ã³ããŒãããæš©éãå«ãŸããå ŽåããããŸãã ãŸãããã®äžã®ã¢ãžã¥ãŒã«ãèªèº«ã®èŠªã«ãšã¯ã¹ããŒãããããšãã§ããŸãã
äžããããäŸã§ã¯ã jpg-decoder
Wasmã¢ãžã¥ãŒã«ã¯simd-math
Wasmã¢ãžã¥ãŒã«ã«äŸåããŠããŸãã jpg-decoder
ã¯ã [email protected]/simd-math@^1.3.4
ãªã©ã®ã°ããŒãã«ãªäžæã®ããã±ãŒãžèå¥åã䜿çšããŠäŸåé¢ä¿ã宣èšãããã®èŠªããã®ã¢ã¯ã»ã¹ãèŠæ±ããŸãã 芪ã¢ãžã¥ãŒã«ããã®ã¢ãžã¥ãŒã«ã«ã¢ã¯ã»ã¹ã§ãã芪ã«ãã£ãŠãåã«å®å
šãã§ãããšèŠãªãããå Žåãã¢ã¯ã»ã¹ãèš±å¯ãããã€ã³ããŒããããsimd-math
ã¢ãžã¥ãŒã«ãjpg-decoder
ã«æž¡ãããŸãã
ReïŒãã¡ã€ã«ã·ã¹ãã
ãŸãããã¯ãããžãŒã¹ã¿ãã¯ãšã¯äœãã説æããŸãããã
ããªããæã£ãŠããïŒ
ãããã£ãŠãå³å¯ã«èšãã°ãwasmãã€ããªãšã€ã³ã¹ã¿ã³ã¹åAPIã¯ãã¡ã€ã«ã·ã¹ãã ã«å¯Ÿå¿ããŠããå¿ èŠã¯ãããŸããã ãã€ããªã«ã¯æšæºã®ã€ã³ããŒãæ§æã®ã¿ãå¿ èŠã§ãããAPIã«ã¯ã解æãããã€ã³ããŒãURIãæž¡ãããšãã§ããã³ãŒã«ããã¯ã®ã¿ãå¿ èŠã§ãã äŸãã°ïŒ
WebAssembly.instantiateStreaming(
fetch('someFile.wasm'),
{
// ...
resolveImport: (parsedURI) => { ... }
}
);
äžèšã®äŸãšåæ§ã®APIã䜿çšãããšä»®å®ãããšããã¹ãã¯çè«äžãå¿ èŠã«å¿ããŠã¢ãžã¥ãŒã«ãä¿åã§ããŸãã ããšãã°ãURIãSQLããŒã¿ããŒã¹ãžã®èŠæ±ãšããŠè§£éããããšã«ããããã¡ã€ã«ã·ã¹ãã 以å€ã®ã¹ãã¬ãŒãžãããã«ããããšãã§ããŸãã
å®éã«ã¯ãã³ãã¥ããã£ã§äœæãããã³ãŒããåå©çšãããéçºè ã¯ããã®ããŒã¿ããŒã¹ã«ã³ãã¥ããã£ã§äœæãããã¢ãžã¥ãŒã«ãè¿œå ããå¿ èŠããããŸãããã®ã¢ãžã¥ãŒã«ã¯ãäºå®äžåžžã«ãã¡ã€ã«ã·ã¹ãã ç°å¢ã§æ§ç¯ãããŸãã
ãããã£ãŠãäžèšã®ã¹ã¿ãã¯ã®ãã¹ãéšåã¯ãã¡ã€ã«ã·ã¹ãã ã«äŸåããªãå¯èœæ§ããããŸããããã¡ã€ã«ã·ã¹ãã ã®ãããªããã±ãŒãžåœ¢åŒãããã³æ¬è³ªçã«ããªãŒã®ãããªäŸåé¢ä¿ã·ã¹ãã ïŒç¬èªã®ãµãäŸåé¢ä¿ãæã€äŸåé¢ä¿ïŒãšçžäºäœçšããå¿ èŠããããŸããç¬èªã®ãµããµãäŸåé¢ä¿ãç°ãªãã¬ãã«éã§ããã±ãŒãžåã競åããããšã¯ãããŸããïŒã
å šäœãšããŠãããã¯ãã¹ãŠã @ lukewagnerãš@ttraenklerãèšã£ãããšã«æ»ããŸããã€ã³ããŒãã¹ããŒã ã決å®ããåã«ãããã±ãŒãžãäœã§ãããïŒäœ¿çšãããã¡ã€ã«ã·ã¹ãã 圢åŒã§ã¯ãªãå ŽåïŒã®å šäœçãªå®çŸ©ãå¿ èŠã§ãã
äºãã«çŽ ãªããŒãã®ããªãŒãšããæå³ã§ãæ¬åœã«éå±€çã§ããå¿ èŠããããŸããïŒ ãããšããæåã°ã©ãïŒã€ãŸããã«ãŒãã®ããããªãŒãïŒãæå³ããŸãããïŒ ã埪ç°äŸåãè£ ã£ãé埪ç°äŸåããå¿ èŠãªç¶æ³ããããŸãïŒå®éã«ã¯ããã»ã©çããããšã§ã¯ãããŸããïŒ-ã¢ãžã¥ãŒã«M1ã®Aã®ã¢ãžã¥ãŒã«M2ã®Bãžã®äŸåãšåæã«ãM2ã®Cã®äŸåM1ã®Dã§ãã¢ãžã¥ãŒã«ãšãã®ããŒã¿ã«è©³çŽ°ãªã¯ãšãªãå®è¡ããŠããããå®éã«ãµã€ã¯ã«ã§ãããã©ããã確èªããïŒç°¡å/ãµããŒã/çµã¿èŸŒã¿/å¯èœïŒæ¹æ³ã¯ãããŸããã ã¢ãžã¥ãŒã«ã¬ãã«ïŒããŒããäºãã«çŽ ãªããªãŒïŒã§ã®ã¿ãã®ãããªäŸåé¢ä¿ã解決ãããšããã®ãããªãã®ã¯äžå¯èœã«ãªããéçºãªã©ãäžå¿ èŠã«è€éã«ãªããŸãã
ã¢ãžã¥ãŒã«å ãµãã°ã©ããå¥çŽãããšããããã®å埪ç°äŸåé¢ä¿ã¯æ¬åœã«äžè¬çã§ããïŒ
åã¢ãžã¥ãŒã«ãåäžã®ããŒããšããŠæ±ãå ŽåããŠãŒã¹ã±ãŒã¹ã®99.9ïŒ ã§ãã€ã³ããŒãDAGãŸãã¯ã€ã³ããŒãããªãŒãäœæããããšæããŸãã
äŸåé¢ä¿ãåäžã®ããã±ãŒãžå ã§åŸªç°çã§ããå¯èœæ§ããããšæ³å®ããã€ã³ããŒã解決ã¹ããŒã ãããããšã¯çã«ããªã£ãŠãããšæããŸããããã以å€ã®å ŽåïŒnpmã¢ãã«ïŒã¯é埪ç°çäŸå€ïŒWASIããã¹ãã©ã€ãã©ãªããã¢äŸåé¢ä¿ãçïŒã
ããŠããã®ææ¡ãè¡ã£ããæ¥ããããåŸãç§ã¯ããã®æ¹åæ§ã奜ãã§ãã ãã ããç¹å®ã®ãã¬ãã£ãã¯ã¹ããã®ä»ã®çš®é¡ã®ãå®å šãã¡ã«ããºã ãèŠæ±ããå¿ èŠã¯ãªããšæããŸãã ãããã¯ãã€ã³ã¿ãŒããªã¿ãŒã§ã¯ãªããbuild-system / pkg-managerã«ãã£ãŠåŠçãããå¿ èŠããããŸãã å®å šãªpkg-managerã¯ãå®å šãªäŸåé¢ä¿éå±€ãé©åã«æå®ãããããwasiã€ã³ã¿ãŒããªã¿ãŒã«æž¡ããwasiã€ã³ã¿ãŒããªã¿ãŒãæ瀺ã©ããã«è§£éã§ããå¿ èŠããããŸãã ãã®é¢ä¿ã¯æ¬¡ã®ããã«ãªããŸãïŒåæå¹ãªjsonïŒïŒ
[
{
"path": "./hash2k3jc/mod/foo.wasi",
"dependencies": [
{
"import": ["mod", "bar"], # (import "mod" "bar" ...)
"path": "./hash2k3jc/bar.wasi",
}
]
},
{
"path": "./hash2k3jc/mod/bar.wasi",
"dependencies": [],
},
]
ããã§ããmod fooãã«ã¯1ã€ã®äŸåé¢ä¿ïŒãmodbarãïŒããããããèªäœã«ã¯äŸåé¢ä¿ããããŸããã
ããã¯wasiãã¡ã€ã«ã®ãã©ãããªã¹ãïŒ path
ïŒã§ãããã€ã³ããŒãã¹ããŒãã¡ã³ããç¹å®ã®wasiãã¡ã€ã«ã«ãããããæ¹æ³ãæå®ããŸãïŒ dependencies
ãšimport
ããã³path
ïŒ ã
ãã®ãã«ãã·ã¹ãã ã¯ãããã·ã¥ã䜿çšããŠ100ïŒ æ瀺çãã€å®å šã«ããããšãéžæããŠããããšã«æ³šæããŠãã ããã ä»ã®ãã«ãã·ã¹ãã ïŒã€ãŸããã¯ããŒãºããå éšïŒã¯ãã€ã³ãã¬ãŒã¹æŽæ°ãå¯èœã«ããããã«ãããç·©æ ¢ã«ããããšãéžæã§ããŸãã éèŠãªã®ã¯ããã®è¡šçŸã¯ã©ã¡ãã®ã¢ãããŒãããµããŒãã§ãããšããããšã§ãã
IMOã¯ã httpsïŒ //webassembly.org/docs/dynamic-linking/ãæãå³å¯ã«åæ ããŠããŸããwasiãã¡ã€ã«ãã€ã³ã¿ãŒããªã¿ãŒã«èŠä»¶ããŸã£ãã課ããã代ããã«æ倧éã®æè»æ§ãšã·ã³ãã«ããæäŸããããšãéžæããŸãã
泚ïŒwasiã€ã³ã¿ãŒããªã¿ãŒã®ãã¡ã€ã«ã·ã¹ãã ãæ³å®ããã®ãé©åã ãšæããŸãã
泚ïŒç§ã¯ãWebçšã®ãã«ãã·ã¹ãã ããŠã§ã€ã¯ã«åãçµãã§ãããïŒæçµçã«ã¯ïŒwasiããã©ã€ããªã¿ãŒã²ããããã³ãã«ãç°å¢ã«ãããã§ãã ã©ã€ãã©ãªã®å ±æãäžçã®ããã±ãŒãžã³ã°ããã軜éã«ãªãããã«ã眲åãããäŸåé¢ä¿ãåºè·ã§ããããã«ããããšæããŸãã
泚ïŒwasiã€ã³ã¿ãŒããªã¿ãŒã®ãã¡ã€ã«ã·ã¹ãã ãæ³å®ããã®ãé©åã ãšæããŸãã
ç§ã¯å®éã«ã¯ãŸã£ããå察ã®æèŠãæã£ãŠããŸãïŒãŠã£ã³ã¯ïŒã ãã§ã«ä»æ¥ã§ã¯ããã¡ã€ã«ã·ã¹ãã ããŸã£ãããªãã決ããŠååšããªããšããæ·±å»ãªWASMã®äœ¿çšäŸããããŸãïŒããšãã°ããã¡ã€ã«ã·ã¹ãã ãæããªãæ°ãããŸãã¯å®éšçãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ãããæãåºæ¬çãªæ°žç¶ã¹ãã¬ãŒãžã¢ãã¬ã¹æå®ãæäŸããDBã®ãããªããã°ã©ã ã€ã³ã¿ãŒãã§ã€ã¹ã ãã§ã-æãåçŽãªãã®ã§ããã©ãŒã ã¯ããã¡ã€ã«ã·ã¹ãã ã®ãããªããªãŒã®ãããªæ§é ãå¿ èŠãšããªãäžæ®çºæ§RAMããŒããŠã§ã¢ã§ããå¯èœæ§ããããŸãïŒã ãããã£ãŠããã¡ã€ã«ã·ã¹ãã ã¯WASIã€ã³ã¿ãŒããªã¿ãŒã®åææ¡ä»¶ã§ãã£ãŠã¯ãªããŸããïŒIMHOã¯ãŠãããŒãµã«WASIããã±ãŒãžãããŒãžã£ãŒã§ãããã¡ã€ã«ã·ã¹ãã ã®ãããªã¹ãã¬ãŒãžãå¿ èŠãšãããããªãŒã®ãããªã¹ãã¬ãŒãžããããã¯ã¹ãã¬ãŒãžãŸãã¯ããŒå€ãããç·åœ¢æ°žç¶ã¹ãã¬ãŒãžã§åäœããå¿ èŠããããŸãã¹ãã¬ãŒãžãŸãã¯ãã®ä»ïŒã
å¯èœæ§ã¯ãããŸããããã¹ãŠã®äŸåé¢ä¿ãã¹ãã¬ãŒãžã®åäžã®é£ç¶ãããã¯ã«ããããšãèŠæ±ããããããŸããïŒsmileïŒïŒ path
position
ãšsize
ã䜿çšãããªã©ïŒ path
ïŒã path
ã¯ãDBã®ãããªããã°ã©ãã³ã°ã€ã³ã¿ãŒãã§ã€ã¹ã®ããŒãšããŠäœ¿çšã§ããŸããã å€åãããpath
以å€ã®äœããšåŒã¶ã¹ãã§ã... key
å€åïŒ
ããã±ãŒãžãããŒãžã£ãŒã®éåžžã«éèŠãªæ©èœãšããŠãããŒã«ãã£ãŠãã€ããªããããæ€çŽ¢ããã¡ã«ããºã ããããšæããŸãïŒsmileïŒ
jsä»æ§ã§ã¯ãå®éã«ã¯ã¢ãžã¥ãŒã«ã«ãããªãçš®é¡ã®æå®åãäžããŠããŸããã (referringModuleInstance, importString)
ã§è§£æ±ºãå®è¡ããŸãããã¹ãã¯ããã®ã€ã³ããŒããèš±å¯ãããã©ãããã©ãã§è§£æ±ºããããªã©ã«ã€ããŠç¬èªã®æå³ãç解ããå¿
èŠããããŸããWasmã¯çŸåšããã«ææ§ã§ãããWASIã¯æ¬¡ã®ãããªè¿œå ã®å¶çŽã課ãããšãã§ããŸãã ã解決ã®çµæïŒreferringModuleInstanceãimportStringïŒãã€ã³ããŒãããã¢ãžã¥ãŒã«ã«æšç§»çã«ã¢ã¯ã»ã¹ã§ããªãå Žåã¯ãxyzã³ãŒãã§çµäºããŸããã ç¡é§ã«ããæšç§»çã«ã¢ã¯ã»ã¹å¯èœãã«ã¯ãããããUNIXã©ã€ã¯ãªãã¡ã€ã«ããŒããã·ã§ã³ãå«ãŸããŸãã fastly / cloudflareã®ãããªãã®ã«ãšã£ãŠãããã¯ãããããåããŠãŒã¶ãŒãã¢ããããŒãããã¢ãŒã«ã€ãã®äžéšããæå³ããŸãã
æãåèã«ãªãã³ã¡ã³ã
ç§ããã®ãããªãã®ã®å¿ èŠæ§ãæããŠããŸããã ãã ãããpackageãïŒnpmãªã©ã®ããã±ãŒãžãããŒãžã£ãŒã®ã³ãŒãã®åäœïŒããcontainerããªã©ãæ ¹æ¬çã«æ°ãããããããžçã«ããã倧ããªãæŠå¿µïŒè€æ°ã®ã¢ãžã¥ãŒã«ãå«ãïŒãå°å ¥ããã«ããŸã äœãæå®ã§ããªãããã«æããŸãã "ïŒã³ã³ããã©ã³ã¿ã€ã ã§å®è¡ã§ããã³ãŒãã®åäœïŒãããã¯ãäžèšã§ææããããã«ããã¹ã«ã€ããŠè©±ãåãããšãã§ããã¢ã³ããšã³ããã¡ã€ã«ã·ã¹ãã ãååšãããšã¯æ³å®ã§ããªãããã§ãã ãããã±ãŒãžããŸãã¯ãã³ã³ãããŒãã®æŠå¿µïŒã©ã¡ããå±éã®ããŸããŸãªãã§ãŒãºã§æå³ããããšæããŸãïŒãã§ãããã解決ãã©ã®ããã«æ©èœããããå ·äœçã«èª¬æããæ¹ãã¯ããã«ç°¡åã§ãã
ãŸãã @ littledanã®ç®æšãå ±æããŸããå®çŸ©ããããã®ã¯ãã¹ãŠãJS / ESMç°å¢ã®å å€ã§åã解éãæã€å¿ èŠããããŸãã ããããã°ãããŒãå ã§ãå€éšã§ã䜿çšã§ããwasmã¢ãžã¥ãŒã«ã®åäžããã±ãŒãžãäœæã§ããŸãã