ãã®èšäºã§ã¯ãJavaScript ã®èšç®ã WebAssembly ã«çœ®ãæããããšã«ãã£ãŠãã©ãŠã¶ ã¢ããªã±ãŒã·ã§ã³ãé«éåããã±ãŒã¹ã«ã€ããŠèª¬æããŸãã
WebAssembly - ããã¯äœã§ãã?
ã€ãŸããããã¯ã¹ã¿ãã¯ããŒã¹ã®ä»®æ³ãã·ã³çšã®ãã€ããªåœä»€ãã©ãŒãããã§ãã Wasm (ç¥ç§°) ã¯ããã°ã©ãã³ã°èšèªãšåŒã°ããããšãå€ãã§ãããããã§ã¯ãããŸããã åœä»€åœ¢åŒã¯ãã©ãŠã¶äžã§JavaScriptãšãšãã«å®è¡ãããŸãã
WebAssembly ã¯ãC/C++ãRustãGo ãªã©ã®èšèªã§ãœãŒã¹ãã³ã³ãã€ã«ããããšã§ååŸã§ããããšãéèŠã§ãã ããã§ã¯ãçµ±èšçã¿ã€ãã³ã°ãšãããããã©ãã ã¡ã¢ãª ã¢ãã«ã䜿çšãããŸãã åè¿°ããããã«ãã³ãŒãã¯ã³ã³ãã¯ããªãã€ããªåœ¢åŒã§ä¿åããããããã³ãã³ã ã©ã€ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãå®è¡ããã®ãšã»ãŒåãé床ã«ãªããŸãã ãããã®æ©èœã«ãããWebAssembly ã®äººæ°ãé«ãŸããŸããã
ãªãã€ã³ããŒïŒ ãHabrãã®ãã¹ãŠã®èªè ã察象 - ãHabrãããã¢ãŒã·ã§ã³ ã³ãŒãã䜿çšããŠã¹ãã«ããã¯ã¹ ã³ãŒã¹ã«ç»é²ãããš 10 ã«ãŒãã«ã®å²åŒã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã å®è·µã³ãŒã¹
ãã¢ãã€ã«ããããããŒPROã .
çŸåšãWasm ã¯ãDoom 3 ãªã©ã®ã²ãŒã ãã Autocad ã Figma ãªã©ã® Web 移æ€ã¢ããªã±ãŒã·ã§ã³ã«è³ããŸã§ãå€ãã®ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããŠããŸãã Wasm ã¯ãµãŒããŒã¬ã¹ ã³ã³ãã¥ãŒãã£ã³ã°ãªã©ã®åéã§ã䜿çšãããŸãã
ãã®èšäºã§ã¯ãWasm ã䜿çšããŠåæ Web ãµãŒãã¹ãé«éåããäŸã瀺ããŸãã ããããããããããã«ãC ã§æžãããåäœããã¢ããªã±ãŒã·ã§ã³ãåãäžããWebAssembly ã«ã³ã³ãã€ã«ããŸããã çµæã¯ãJS ã®ããã©ãŒãã³ã¹ã®äœãã»ã¯ã·ã§ã³ã眮ãæããããã«äœ¿çšãããŸãã
ã¢ããªã±ãŒã·ã§ã³ã®å€é©
ãã®äŸã§ã¯ãéºäŒåŠè ã察象ãšãã fastq.bio ãã©ãŠã¶ ãµãŒãã¹ã䜿çšããŸãã ãã®ããŒã«ã䜿çšãããšãDNA ã·ãŒã±ã³ã¹ (解èª) ã®å質ãè©äŸ¡ã§ããŸãã
以äžã«ãå®éã®ã¢ããªã±ãŒã·ã§ã³ã®äŸã瀺ããŸãã
ããã»ã¹ã®è©³çŽ°ã¯éå°é家ã«ãšã£ãŠã¯éåžžã«è€éã§ãããã説æãã䟡å€ã¯ãããŸããããèŠããã«ãç§åŠè
ã¯äžèšã®ã€ã³ãã©ã°ã©ãã£ãã¯ã䜿çšããŠãDNA é
å決å®ããã»ã¹ãã¹ã ãŒãºã«é²ãã ãã©ããããŸãã©ã®ãããªåé¡ãçºçããããç解ããããšãã§ããŸãã
ãã®ãµãŒãã¹ã«ã¯ã代æ¿ãšãªããã¹ã¯ããã ããã°ã©ã ããããŸãã ããããfastq.bio ã䜿çšãããšãããŒã¿ãèŠèŠåããããšã§äœæ¥ãã¹ããŒãã¢ããã§ããŸãã ä»ã®ã»ãšãã©ã®å Žåãã³ãã³ã ã©ã€ã³ã䜿çšã§ããå¿ èŠããããŸããããã¹ãŠã®éºäŒåŠè ãå¿ èŠãªçµéšãæã£ãŠããããã§ã¯ãããŸããã
ãã¹ãŠãã·ã³ãã«ã«æ©èœããŸãã å ¥åã¯ãããã¹ã ãã¡ã€ã«ã®åœ¢åŒã§è¡šç€ºãããããŒã¿ã§ãã ãã®ãã¡ã€ã«ã¯ãç¹æ®ãªã·ãŒã±ã³ã¹ ããŒã«ã«ãã£ãŠçæãããŸãã ãã®ãã¡ã€ã«ã«ã¯ãDNA é åã®ãªã¹ããšåãã¯ã¬ãªããã®å質ã¹ã³ã¢ãå«ãŸããŠããŸãã ãã¡ã€ã«åœ¢åŒã¯ .fastq ã§ãããããããã®ãµãŒãã¹ã®ååã®ç±æ¥ã§ãã
JavaScriptã§ã®å®è£
fastq.bio ã䜿çšããéã®ãŠãŒã¶ãŒã®æåã®ã¹ãããã¯ãé©åãªãã¡ã€ã«ãéžæããããšã§ãã File ãªããžã§ã¯ãã䜿çšããŠãã¢ããªã±ãŒã·ã§ã³ã¯ãã¡ã€ã«ããããŒã¿ã®ã©ã³ãã ãªãµã³ãã«ãèªã¿åãããã®ããããåŠçããŸãã ããã§ã® JavaScript ã®ä»äºã¯ãåçŽãªæååæäœãå®è¡ããã¡ããªã¯ã¹ãèšç®ããããšã§ãã ãããã® XNUMX ã€ã¯ãããŸããŸãª DNA æçäžã®ãã¯ã¬ãªãã AãCãGãããã³ T ã®æ°ã§ãã
å¿ èŠãªã€ã³ãžã±ãŒã¿ãŒãèšç®ããåŸãPlotly.js ã䜿çšããŠèŠèŠåããããµãŒãã¹ã¯æ°ããããŒã¿ ãµã³ãã«ã§åäœãéå§ããŸãã ãã£ã³ã¯åã¯ãUX ã®å質ãåäžãããããã«è¡ãããŸãã ãã¹ãŠã®ããŒã¿ãäžåºŠã«æäœãããšãã·ãŒã±ã³ã¹çµæãå«ããã¡ã€ã«ãæ°çŸã®ã¬ãã€ãã®ãã¡ã€ã«é åãå æãããããããã»ã¹ããã°ããããªãŒãºããŸãã ãã®ãµãŒãã¹ã¯ã0,5 ïœ 1 MB ã®ãµã€ãºã®ããŒã¿ââãåãåãããããã段éçã«åŠçããŠã°ã©ãã£ã㯠ããŒã¿ãæ§ç¯ããŸãã
ããã¯ã©ã®ããã«åäœããã®ã§ãïŒ
èµ€ãåè§åœ¢ã«ã¯ãèŠèŠåãååŸããããã®æååå€æã¢ã«ãŽãªãºã ãå«ãŸããŠããŸãã ããã¯ããµãŒãã¹ã®äžã§æãèšç®éãå€ãéšåã§ãã Wasm ã«çœ®ãæããŠã¿ã䟡å€ã¯ãããŸãã
WebAssembly ã®ãã¹ã
Wasm ã®äœ¿çšã®å¯èœæ§ãè©äŸ¡ããããã«ããããžã§ã¯ã ããŒã ã¯ãfastq ãã¡ã€ã«ã«åºã¥ã㊠QC ã¡ããªã¯ã¹ (QC - å質管ç) ãäœæããããã®æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ãæ¢ãå§ããŸããã æ€çŽ¢ã¯ CãC++ããŸã㯠Rust ã§æžãããããŒã«éã§å®è¡ããããããã³ãŒãã WebAssembly ã«ç§»æ€ããããšãã§ããŸããã ããã«ãããŒã«ã¯ãæªå å·¥ãã§ãã£ãŠã¯ãªãããç§åŠè ã«ãã£ãŠãã§ã«ãã¹ãããããµãŒãã¹ãå¿ èŠã§ããã
çµæãšããŠã次ã®ãããªéžæãè¡ãããŸããã
Wasm ã«å€æããåã«ããã¹ã¯ãããçšã® seqtk ã®ã³ã³ãã€ã«åçã確èªãã䟡å€ããããŸãã Makefile ã«ãããšãå¿ èŠãªãã®ã¯æ¬¡ã®ãšããã§ãã
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lz
ååãšããŠãEmscripten ã䜿çšã㊠seqtk ãã³ã³ãã€ã«ã§ããŸãã ããã«ãªãå Žåã¯ãç§ãã¡ã察å¿ããŸãã
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26
å¿
èŠã§ããã°ã
ã³ã³ããå ã§ã¯ãgcc ã®ä»£ããã« emcc ãç°¡åã«äœ¿çšã§ããŸãã
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1
æå°éã®å€æŽ:
Emscripten ã¯ããã€ã㪠ãã¡ã€ã«ã«åºåãã代ããã«ã.wasm ããã³ .js ã䜿çšããŠãã¡ã€ã«ãçæããŸãããã®ãã¡ã€ã«ã¯ãWebAssemby ã¢ãžã¥ãŒã«ã®å®è¡ã«äœ¿çšãããŸãã
USE_ZLIB ãã©ã°ã¯ãzlib ã©ã€ãã©ãªããµããŒãããããã«äœ¿çšãããŸãã ãã®ã©ã€ãã©ãªã¯é åžãããWebAssembly ã«ç§»æ€ãããŠãããEmscripten ã¯ããããããžã§ã¯ãã«çµã¿èŸŒã¿ãŸãã
Emscrippten ä»®æ³ãã¡ã€ã« ã·ã¹ãã ãã¢ã¯ãã£ãåãããŸãã ãã
ä»®æ³ãã¡ã€ã« ã·ã¹ãã ãå¿ èŠãªçç±ãç解ããã«ã¯ãã³ãã³ã ã©ã€ã³ãã seqtk ãå®è¡ããæ¹æ³ãšãã³ã³ãã€ã«ããã WebAssembly ã¢ãžã¥ãŒã«ãå®è¡ããæ¹æ³ãæ¯èŒãã䟡å€ããããŸãã
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])
ãã¡ã€ã«å ¥åã§ã¯ãªãæååã® seqtk ãæžãæããªãããã«ãä»®æ³ãã¡ã€ã« ã·ã¹ãã ãžã®ã¢ã¯ã»ã¹ãååŸããå¿ èŠããããŸãã ãã®å ŽåãããŒã¿ ãã©ã°ã¡ã³ãã¯ãmain() seqtk ã®åŒã³åºããæã€ä»®æ³ FS å ã® data.fastq ãã¡ã€ã«ãšããŠè¡šç€ºãããŸãã
æ°ããã¢ãŒããã¯ãã£ã¯æ¬¡ã®ãšããã§ãã
ãã®å³ã¯ããã©ãŠã¶ã®ã¡ã€ã³ ã¹ã¬ããã§ã®èšç®ã®ä»£ããã«ã
seqtk ã³ãã³ãã¯ãããŠã³ãããããã¡ã€ã«ã«å¯Ÿã㊠Worker ã䜿çšããŠå®è¡ãããŸãã å®è¡å®äºåŸãWorker 㯠Promise ã®åœ¢åŒã§çµæãçæããŸãã ã¡ã€ã³ã¹ã¬ãããã¡ãã»ãŒãžãåä¿¡ãããšããã®çµæã䜿çšããŠã°ã©ããæŽæ°ãããŸãã ãªã©ãæ°åç¹°ãè¿ããŸãã
WebAssembly ã®ããã©ãŒãã³ã¹ã«ã€ããŠã¯ã©ãã§ãã?
ããã©ãŒãã³ã¹ã®å€åãè©äŸ¡ããããã«ããããžã§ã¯ã ããŒã 㯠XNUMX ç§ãããã®èªã¿åãæäœæ°ã®ãã©ã¡ãŒã¿ãŒã䜿çšããŸããã ã©ã¡ãã®å®è£ ã JavaScript ã䜿çšãããããã€ã³ã¿ã©ã¯ãã£ããªã°ã©ãã®æ§ç¯ã«ãããæéã¯èæ ®ãããŸããã
ããã«äœ¿ãããœãªã¥ãŒã·ã§ã³ã䜿çšããå Žåãããã©ãŒãã³ã¹ã¯ XNUMX ååäžããŸããã
ããã¯çŽ æŽãããçµæã§ããããã¯ãæé©åã®äœå°ããããŸãã å®éã®ãšãããå€ãã® QC 解æçµæ㯠seqtk ã§äœ¿çšãããªããããåé€ããŠãåé¡ãããŸããã ãããããšãJS ã«æ¯ã¹ãŠçµæã 13 ååäžããŸãã
ããã¯ãprintf() ã³ãã³ããã³ã¡ã³ãã¢ãŠãããã ãã§å®çŸã§ããŸããã
ããããããã ãã§ã¯ãããŸããã å®éã®ãšããããã®æ®µéã§ã¯ãfastq.bio ã¯ããŸããŸãª C é¢æ°ãåŒã³åºããŠåæçµæãåãåããããããã®é¢æ°ãç¬èªã®ç¹æ§ã»ãããèšç®ããããããã¡ã€ã«ã®åãã©ã°ã¡ã³ãã XNUMX åèªã¿åãããŸãã
ãã®åé¡ãåé¿ããããã«ã20 ã€ã®æ©èœã XNUMX ã€ã«çµåããããšã決å®ãããŸããã ãã®çµæãçç£æ§ãXNUMXåã«åäžããŸããã
ãã®ãããªåªããçµæãåžžã«éæã§ããããã§ã¯ãªãããšã¯æ³šç®ã«å€ããŸãã å Žåã«ãã£ãŠã¯ããã©ãŒãã³ã¹ãäœäžãããããã±ãŒã¹ããšã«è©äŸ¡ãã䟡å€ããããŸãã
çµè«ãšããŠãWasm ã¯ã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãåäžãããæ©äŒãæäŸããŸãããè³¢æã«äœ¿çšããå¿ èŠããããšèšããŸãã
ã¹ãã«ããã¯ã¹ã¯æ¬¡ã®ããšãæšå¥šããŸãã
- XNUMX幎éã®å®è·µã³ãŒã¹
ãç§ã¯ããã®ãŠã§ãéçºè ã§ãã .- ãªã³ã©ã€ã³ã³ãŒã¹
ã0ããã®C#éçºè ã .- å®è·µäžå¹Žã³ãŒã¹
ã0ããPROãŸã§ã®PHPéçºè ã .
åºæïŒ habr.com