ืืืืจ ืื ืื ืืืงืจื ืืืืฆืช ืืืฉืื ืืคืืคื ืขื ืืื ืืืืคืช ืืืฉืืื JavaScript ื-WebAssembly.
WebAssembly - ืื ืื?
ืืงืืฆืืจ, ืืื ืคืืจืื ืืืจืืืช ืืื ืืจืืืช ืืืืื ื ืืืจืืืืืืช ืืืืกืกืช ืืืกื ืืช. Wasm (ืฉื ืงืฆืจ) ื ืงืจืืช ืืขืชืื ืงืจืืืืช ืฉืคืช ืชืื ืืช, ืืื ืืื ืื. ืคืืจืื ืืืืจืืืช ืืืืฆืข ืืืคืืคื ืืื ืขื JavaScript.
ืืฉืื ืฉื ืืชื ืืืื ืืืฉืื WebAssembly ืขื ืืื ืงืืืคืืืฆืื ืฉื ืืงืืจืืช ืืฉืคืืช ืืื C/C++, Rust, Go. ืืื ื ืขืฉื ืฉืืืืฉ ืืืงืืื ืกืืืืกืืืช ืืืืืื ืืืืืจืื ืืฉืืื ืฉื ืงืจื. ืืงืื, ืืืืืจ ืืขืื, ืืืืืกื ืืคืืจืื ืืื ืืจื ืงืืืคืงืื, ืื ืฉืืืคื ืืืชื ืืืืืจ ืืืขื ืืื ืืคืขืืช ืืืืฉืื ืืืืฆืขืืช ืฉืืจืช ืืคืงืืื. ืืืืืืช ืืื ืืืืืื ืืฆืืืืช ืืคืืคืืืจืืืช ืฉื WebAssembly.
ืื ื ืืืืืจืื: ืืื ืงืืจืื Habr - ืื ืื ืฉื 10 ืจืืื ืืขืช ืืจืฉืื ืืื ืงืืจืก Skillbox ืืืืฆืขืืช ืงืื ืืืืื ืฉื Habr.
Skillbox ืืืืืฆื: ืงืืจืก ืืขืฉื
"Mobile Developer PRO" .
ื ืืื ืืขืืฉืื, ื ืขืฉื ืฉืืืืฉ ื- Wasm ืืืืฉืืืื ืจืืื, ืืืฉืืงืื ืืื Doom 3 ืืขื ืืืืฉืืืื ืื ืืขื ืืื ืืจื ื ืืื Autocad ื- Figma. Wasm ืืฉืืฉ ืื ืืชืืืืื ืืื ืืืฉืื ืืื ืฉืจืช.
ืืืืจ ืื ืืกืคืง ืืืืื ืืฉืืืืฉ ื- Wasm ืืื ืืืืืฅ ืฉืืจืืช ืืื ืืจื ื ื ืืชืืื. ืืืขื ืืืืืจืืช, ืืงืื ื ืืคืืืงืฆืื ืขืืืืช ืืชืืื ื-C, ืืฉืจ ืืืจืืืช ืืชืื WebAssembly. ืืชืืฆืื ืชืฉืืฉ ืืืืืคืช ืืืงืื ืขื ืืืฆืืขืื ื ืืืืื ืฉื JS.
ืืจื ืกืคืืจืืฆืื ืฉื ืืืฉืืืื
ืืืืืื ืชืฉืชืืฉ ืืฉืืจืืช ืืืคืืคื fastq.bio, ืืืืืขื ืืื ืืืงืืื. ืืืื ืืืคืฉืจ ืื ืืืขืจืื ืืช ืืืืืช ืจืฆืฃ ื-DNA (ืคืขื ืื).
ืื ื ืืืืื ืืืืฉืื ืืคืขืืื:
ืื ืืืื ืืืืื ืก ืืคืจืื ืืชืืืื ืืืืืื ืฉืื ืืืจืืืื ืืืื ืขืืืจ ืื ืืืืืื, ืืื ืืงืืฆืืจ, ืืืขื ืื ืืืืืื ืืืฉืชืืฉ ืืืื ืคืืืจืคืืงื ืฉืืืขืื ืืื ืืืืื ืื ืชืืืื ืจืฆืฃ ื-DNA ืขืืจ ืืฆืืจื ืืืงื ืืืืื ืืขืืืช ืืชืขืืจืจื.
ืืฉืืจืืช ืื ืืฉ ืืืืคืืช, ืชืืื ืืืช ืฉืืืื ืขืืืื. ืืื fastq.bio ืืืคืฉืจ ืื ืืืืืฅ ืืช ืืขืืืื ืฉืื ืขื ืืื ืืืืื ืฉื ืื ืชืื ืื. ืืจืื ืืืงืจืื ืืืืจืื, ืืชื ืฆืจืื ืืืืืช ืืกืืื ืืขืืื ืขื ืฉืืจืช ืืคืงืืื, ืืื ืื ืืื ืืื ืืืงืืื ืืฉ ืืช ืื ืืกืืื ืืืจืืฉ.
ืืื ืขืืื ืืคืฉืืืช. ืืงืื ืืื ื ืชืื ืื ืืืืฆืืื ืืฆืืจื ืฉื ืงืืืฅ ืืงืกื. ืงืืืฅ ืื ื ืืฆืจ ืขื ืืื ืืื ืจืฆืฃ ืืืืืืื. ืืงืืืฅ ืืืื ืจืฉืืื ืฉื ืจืฆืคื DNA ืืฆืืื ืืืืืช ืืื ื ืืงืืืืืื. ืคืืจืื ืืงืืืฅ ืืื .fastq, ืืื ืืกืืื ืฉืืฉืืจืืช ืงืืื ืืช ืฉืื.
ืืืฉืื ื-JavaScript
ืืฉืื ืืจืืฉืื ืฉื ืืืฉืชืืฉ ืืขืืืื ืขื fastq.bio ืืื ืืืืืจ ืืช ืืงืืืฅ ืืืชืืื. ืืืืฆืขืืช ืืืืืืงื ืืงืืืฅ, ืืืืฉืื ืงืืจื ืืืื ืืงืจืื ืฉื ื ืชืื ืื ืืงืืืฅ ืืืขืื ืืช ืืืฆืืื. ืืชืคืงืื ืฉื JavaScript ืืื ืืื ืืืฆืข ืคืขืืืืช ืืืจืืืืช ืคืฉืืืืช ืืืืฉื ืืืืื. ืืื ืืื ืืื ืืกืคืจ ืื ืืงืืืืืืืื A, C, G ื-T ืขื ืฉืืจื DNA ืฉืื ืื.
ืืืืจ ืืืฉืื ืืืื ืืืงืืืจืื ืืืจืืฉืื, ืื ืืืฆืืื ืืืืฆืขืืช Plotly.js, ืืืฉืืจืืช ืืชืืื ืืขืืื ืขื ืืืื ื ืชืื ืื ืืืฉ. ื-chunking ื ืขืฉื ืืื ืืฉืคืจ ืืช ืืืืืช ื-UX. ืื ืชืขืืื ืขื ืื ืื ืชืื ืื ืืืช ืืืช, ืืชืืืื ืืงืคื ืืืื ืื, ืืืืืื ืฉืืงืืฆืื ืขื ืชืืฆืืืช ืืจืฆืฃ ืชืืคืกืื ืืืืช ืืืื-ืืืื ืฉื ืฉืื ืงืืฆืื. ืืฉืืจืืช ืืืงื ืคืืกืืช ื ืชืื ืื ืืืืื ืฉื 0,5 ืขื 1 MB ืืขืืื ืืืชื ืฆืขื ืืืจ ืฆืขื, ืืื ื ื ืชืื ืื ืืจืคืืื.
ืืื ืื ืขืืื:
ืืืืื ืืืืื ืืืื ืืช ืืืืืจืืชื ืืจื ืกืคืืจืืฆืื ืฉื ืืืจืืืช ืืืฉืืช ืืืืื. ืืื ืืืืง ืืืื ืื ืกืืื ืืืืชืจ ืืืืื ื ืืืฉืืืืช ืืฉืืจืืช. ืฉืืื ืื ืกืืช ืืืืืืฃ ืืืชื ื- Wasm.
ืืืืงืช WebAssembly
ืืื ืืืขืจืื ืืช ืืืคืฉืจืืช ืืืฉืชืืฉ ื- Wasm, ืฆืืืช ืืคืจืืืงื ืืื ืืืืคืืฉ ืืืจ ืคืชืจืื ืืช ืืืื ืื ืืืฆืืจืช ืืืื QC (QC - ืืงืจืช ืืืืืช) ืืืืืกืกืื ืขื ืงืืฆื fastq. ืืืืคืืฉ ืืืฆืข ืืื ืืืื ืฉื ืืชืื ื-C, C++ ืื Rust, ืื ืฉื ืืชื ืืื ืืืขืืืจ ืืช ืืงืื ื-WebAssembly. ืื ืืกืฃ, ืืืื ืื ืฆืจืื ืืืืืช "ืืืืื"; ื ืืจืฉ ืฉืืจืืช ืฉืืืจ ื ืืืง ืขื ืืื ืืืขื ืื.
ืืชืืฆืื ืืื, ืืืืืจื ื ืขืฉืชื ืืืืืช
ืืคื ื ืืืืจื ื- Wasm, ืืืื ืืืกืชืื ืขื ืขืงืจืื ืืืืืืจ ืฉื seqtk ืขืืืจ ืฉืืืื ืืขืืืื. ืืคื Makefile, ืื ืื ืฉืืชื ืฆืจืื:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lz
ืืืืคื ืขืงืจืื ื, ืืชื ืืืื ืืืจืืื seqtk ืืืืฆืขืืช Emscripten. ืื ืื ืื ืฉื, ืื ืื ื ืืกืชืคืงืื.
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26
ืื ืจืืฆืื
ืืชืื ืืืื, ืืชื ืืืื ืืงืืืช ืืืฉืชืืฉ ื-emcc ืืืืืคื ื-gcc:
# 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 ืขืืืจ ืืืจืืืช ืืื ืืงืื ืงืืืฅ. ืืืงืจื ืื, ืงืืข ืื ืชืื ืื ืืืฆื ืืงืืืฅ data.fastq ื-FS ืืืืจืืืืื ืขื ืงืจืืื ื-main() seqtk ืขืืื.
ืื ื ืืืจืืืืงืืืจื ืืืืฉื:
ืืืืืจ ืืจืื ืฉืืืงืื ืืืฉืืืื ืืฉืจืฉืืจ ืืืคืืคื ืืจืืฉื,
ืืคืงืืื seqtk ืืืคืขืืช ืืืืฆืขืืช Worker ืืงืืืฅ ืืืืชืงื. ืืืืจ ืืฉืืืช ืืืืฆืืข, ืืขืืื ืืืืฆืจ ืชืืฆืื ืืฆืืจื ืฉื ืืืืื. ืืืฉืจ ืืืืขื ืืชืงืืืช ืขื ืืื ืืฉืจืฉืืจ ืืจืืฉื, ืืชืืฆืื ืืฉืืฉืช ืืขืืืื ืืืจืคืื. ืืื ืืืื ืืืื ืืืืจืฆืืืช.
ืื ืืืื ืืืฆืืขื WebAssembly?
ืขื ืื ืช ืืืขืจืื ืืช ืืฉืื ืื ืืืืฆืืขืื, ืฆืืืช ืืคืจืืืงื ืืฉืชืืฉ ืืคืจืืืจ ืคืขืืืืช ืงืจืืื ืืฉื ืื. ืืืื ืฉืืืงื ืืื ืืืช ืืจืคืื ืืื ืืจืืงืืืืืื ืืื ื ื ืืงื ืืืฉืืื ืืืืืื ืฉืฉืชื ืืืืืขืืช ืืฉืชืืฉืืช ื-JavaScript.
ืืขืช ืฉืืืืฉ ืืคืชืจืื ื-out-of-the-box, ืขืืืืช ืืืืฆืืขืื ืืืืชื ืคื ืชืฉืขื.
ืืืื ืชืืฆืื ืืฆืืื ืช, ืืื, ืืคื ืฉืืชืืจืจ, ืืฉ ืื ืืืืื ืืช ืืืืขื ืืืชื. ืืขืืืื ืืื ืฉืืกืคืจ ืจื ืฉื ืชืืฆืืืช ื ืืชืื QC ืืื ื ืืฉืืืืฉ ืขื ืืื seqtk, ืื ืฉื ืืชื ืืืืืง ืืืชื. ืื ืชืขืฉื ืืืช, ืืชืืฆืื ืืฉืชืคืจืช ืคื 13 ืืืฉืืืื ื-JS.
ืื ืืืฉื ืขื ืืื ืืขืจื ืคืฉืืื ืขื ืืคืงืืืืช printf() .
ืืื ืื ืื ืืื. ืืขืืืื ืืื ืฉืืฉืื ืื, fastq.bio ืืงืื ืืช ืชืืฆืืืช ืื ืืชืื ืขื ืืื ืงืจืืื ืืคืื ืงืฆืืืช ืฉืื ืืช ืฉื C. ืื ืืืช ืืื ืืืฉืืช ืืช ืกื ืืืืคืืื ืื ืฉืื, ืื ืฉืื ืงืืข ืฉื ืืงืืืฅ ื ืงืจื ืคืขืืืื.
ืขื ืื ืช ืืขืงืืฃ ืืช ืืืขืื ืืื, ืืืืื ืืฉืื ืฉืชื ืคืื ืงืฆืืืช ืืืืช. ืืชืืฆืื ืืื, ืืชืคืืงื ืขืืชื ืคื 20.
ืจืืื ืืฆืืื ืฉืื ืชืืื ื ืืชื ืืืฉืื ืชืืฆืื ืืืฆืืช ืืืคื ืืื. ืืืงืจืื ืืกืืืืื, ืืืืฆืืขืื ืืจืื, ืืืื ืืืื ืืืขืจืื ืื ืืงืจื.
ืืกืืืื, ืื ื ืืืืืื ืืืืจ ืฉ- Wasm ืืื ืืกืคืงืช ืืืืื ืืช ืืฉืคืจ ืืช ืืืฆืืขื ืืืคืืืงืฆืื, ืื ืขืืื ืืืฉืชืืฉ ืื ืืืืืื.
Skillbox ืืืืืฆื:
- ืงืืจืก ืืขืฉื ืฉื ืชืืื
"ืื ื ืืคืชื ืืชืจืื PRO" .- ืงืืจืก ืืงืืื
"ืืคืชื C# ื-0" .- ืงืืจืก ืืขืฉื ืื ืฉื ื
"ืืคืชื PHP ื-0 ื-PRO" .
ืืงืืจ: www.habr.com