์ด ๊ธฐ์ฌ์์๋ JavaScript ๊ณ์ฐ์ WebAssembly๋ก ๋์ฒดํ์ฌ ๋ธ๋ผ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์
์๋๋ฅผ ๋์ด๋ ์ฌ๋ก์ ๋ํด ์ค๋ช
ํฉ๋๋ค.
์น์ด์ ๋ธ๋ฆฌ - ๊ทธ๊ฒ ๋ญ์ฃ ?
๊ฐ๋จํ ๋งํด์ ์ด๋ ์คํ ๊ธฐ๋ฐ ๊ฐ์ ๋จธ์ ์ ๋ํ ์ด์ง ๋ช ๋ น ํ์์ ๋๋ค. Wasm(์งง์ ์ด๋ฆ)์ ์ข ์ข ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก ๋ถ๋ฆฌ์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ช ๋ น ํ์์ JavaScript์ ํจ๊ป ๋ธ๋ผ์ฐ์ ์์ ์คํ๋ฉ๋๋ค.
C/C++, Rust, Go ๋ฑ์ ์ธ์ด๋ก ์์ค๋ฅผ ์ปดํ์ผํ์ฌ WebAssembly๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํต๊ณ์ ํ์ดํ๊ณผ ์์ ํ๋ซ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์ฌ์ฉ๋ฉ๋๋ค. ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ ์ฝ๋๋ ์์ถ๋ ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ์ ์ฅ๋๋ฏ๋ก ๋ช ๋ น์ค์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๊ฒ๋งํผ ๋น ๋ฆ ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ผ๋ก ์ธํด WebAssembly์ ์ธ๊ธฐ๊ฐ ๋์์ก์ต๋๋ค.
์๋ฆผ: "Habr"์ ๋ชจ๋ ๋ ์๋ฅผ ์ํ - "Habr" ํ๋ก๋ชจ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ Skillbox ๊ณผ์ ์ ๋ฑ๋กํ ๋ 10 ๋ฃจ๋ธ ํ ์ธ.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค. ์ค๊ธฐ ์ฝ์ค
"๋ชจ๋ฐ์ผ ๊ฐ๋ฐ์ PRO" .
ํ์ฌ Wasm์ Doom 3๊ณผ ๊ฐ์ ๊ฒ์๋ถํฐ Autocad ๋ฐ Figma์ ๊ฐ์ ์น ํฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค. Wasm์ ์๋ฒ๋ฆฌ์ค ์ปดํจํ ๊ณผ ๊ฐ์ ์์ญ์์๋ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๊ธฐ์ฌ์์๋ Wasm์ ์ฌ์ฉํ์ฌ ๋ถ์ ์น ์๋น์ค ์๋๋ฅผ ๋์ด๋ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ช ํ์ฑ์ ์ํด C๋ก ์์ฑ๋ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ WebAssembly๋ก ์ปดํ์ผํ์ต๋๋ค. ๊ฒฐ๊ณผ๋ JS์ ์ฑ๋ฅ์ด ์ ํ๋ ์น์ ์ ๋์ฒดํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ํ์
์ด ์์์๋ ์ ์ ํ์๋ฅผ ์ํ fastq.bio ๋ธ๋ผ์ฐ์ ์๋น์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด DNA ์์ด ๋ถ์(ํด๋ )์ ํ์ง์ ํ๊ฐํ ์ ์์ต๋๋ค.
๋ค์์ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋๋ค.
ํ๋ก์ธ์ค์ ์ธ๋ถ ์ฌํญ์ ๋น์ ๋ฌธ๊ฐ์๊ฒ๋ ์๋นํ ๋ณต์กํ๊ธฐ ๋๋ฌธ์ ์ดํด๋ณผ ๊ฐ์น๊ฐ ์์ง๋ง, ๊ฐ๋จํ ๋งํด์ ๊ณผํ์๋ค์ ์์ ์ธํฌ๊ทธ๋ํฝ์ ์ฌ์ฉํ์ฌ DNA ์ํ์ฑ ํ๋ก์ธ์ค๊ฐ ์ํํ๊ฒ ์งํ๋์๋์ง, ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ดํดํ ์ ์์ต๋๋ค.
์ด ์๋น์ค์๋ ๋์ฒด ๋ฐ์คํฌํฑ ํ๋ก๊ทธ๋จ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ fastq.bio๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ์ฌ ์์ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ช ๋ น์ค์ ์ฌ์ฉํ์ฌ ์์ ํ ์ ์์ด์ผ ํ์ง๋ง ๋ชจ๋ ์ ์ ํ์๊ฐ ํ์ํ ๊ฒฝํ์ ๊ฐ๊ณ ์๋ ๊ฒ์ ์๋๋๋ค.
๋ชจ๋ ๊ฒ์ด ๊ฐ๋จํ๊ฒ ์๋ํฉ๋๋ค. ์ ๋ ฅ์ ํ ์คํธ ํ์ผ ํ์์ผ๋ก ํ์๋๋ ๋ฐ์ดํฐ์ ๋๋ค. ์ด ํ์ผ์ ํน์ํ ์ํ์ฑ ๋๊ตฌ๋ฅผ ํตํด ์์ฑ๋ฉ๋๋ค. ํ์ผ์๋ DNA ์์ด ๋ชฉ๋ก๊ณผ ๊ฐ ๋ดํด๋ ์คํฐ๋์ ํ์ง ์ ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ํ์ผ ํ์์ .fastq์ด๋ฏ๋ก ์๋น์ค ์ด๋ฆ์ด ๋ถ์ฌ์ก์ต๋๋ค.
JavaScript๋ก ๊ตฌํ
fastq.bio๋ก ์์ ํ ๋ ์ฌ์ฉ์์ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ์ ์ ํ ํ์ผ์ ์ ํํ๋ ๊ฒ์ ๋๋ค. File ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ผ์์ ์์์ ๋ฐ์ดํฐ ์ํ์ ์ฝ๊ณ ํด๋น ๋ฐฐ์น๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ์ฌ๊ธฐ์ JavaScript์ ์ญํ ์ ๊ฐ๋จํ ๋ฌธ์์ด ์์ ์ ์ํํ๊ณ ์ธก์ ํญ๋ชฉ์ ๊ณ์ฐํ๋ ๊ฒ์ ๋๋ค. ๊ทธ ์ค ํ๋๋ ์๋ก ๋ค๋ฅธ DNA ๋จํธ์ ์๋ ๋ดํด๋ ์คํฐ๋ A, C, G ๋ฐ T์ ์์ ๋๋ค.
ํ์ํ ์งํ๋ฅผ ๊ณ์ฐํ ํ Plotly.js๋ฅผ ์ฌ์ฉํ์ฌ ์๊ฐํํ๊ณ ์๋น์ค๋ ์๋ก์ด ๋ฐ์ดํฐ ์ํ๋ก ์์ ์ ์์ํฉ๋๋ค. ์ฒญํน์ UX์ ํ์ง์ ํฅ์์ํค๊ธฐ ์ํด ์ํ๋ฉ๋๋ค. ํ ๋ฒ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ ์ํ์ฑ ๊ฒฐ๊ณผ๊ฐ ํฌํจ๋ ํ์ผ์ด ์๋ฐฑ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ํ์ผ ๊ณต๊ฐ์ ์ฐจ์งํ๋ฏ๋ก ํ๋ก์ธ์ค๊ฐ ํ๋์ ์ค๋จ๋ฉ๋๋ค. ์ด ์๋น์ค๋ 0,5~1MB ํฌ๊ธฐ์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ๊ฐ์ ธ์ ๋จ๊ณ๋ณ๋ก ์์ ํ์ฌ ๊ทธ๋ํฝ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
๋ค์์ ์๋ ๋ฐฉ์์ ๋๋ค.
๋นจ๊ฐ์ ์ง์ฌ๊ฐํ์๋ ์๊ฐํ๋ฅผ ์ป๊ธฐ ์ํ ๋ฌธ์์ด ๋ณํ ์๊ณ ๋ฆฌ์ฆ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด๋ ์๋น์ค์์ ๊ฐ์ฅ ๊ณ์ฐ ์ง์ฝ์ ์ธ ๋ถ๋ถ์
๋๋ค. Wasm์ผ๋ก ๊ต์ฒดํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์น์ด์ ๋ธ๋ฆฌ ํ ์คํธ
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์ ์ด๋ฅผ ํ๋ก์ ํธ์ ํฌํจํฉ๋๋ค.
Emscriptpten ๊ฐ์ ํ์ผ ์์คํ
์ด ํ์ฑํ๋์์ต๋๋ค. ์ด๊ฒ
๊ฐ์ ํ์ผ ์์คํ ์ด ํ์ํ ์ด์ ๋ฅผ ์ดํดํ๋ ค๋ฉด ๋ช ๋ น์ค์์ 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 ์ฑ๋ฅ์ ์ด๋ป์ต๋๊น?
์ฑ๋ฅ ๋ณํ๋ฅผ ํ๊ฐํ๊ธฐ ์ํด ํ๋ก์ ํธ ํ์ ์ด๋น ์ฝ๊ธฐ ์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๋ ๊ตฌํ ๋ชจ๋ JavaScript๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ํํ ๊ทธ๋ํ๋ฅผ ์์ฑํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๊ณ ๋ ค๋์ง ์์ต๋๋ค.
์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ฑ๋ฅ์ด XNUMX๋ฐฐ ํฅ์๋์์ต๋๋ค.
์ด๋ ํ๋ฅญํ ๊ฒฐ๊ณผ์ด์ง๋ง, ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด๋ฅผ ์ต์ ํํ ๊ธฐํ๋ ์์ต๋๋ค. ์ฌ์ค ๋ง์ QC ๋ถ์ ๊ฒฐ๊ณผ๋ seqtk์์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก ์ญ์ ๋ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด JS์ ๋นํด ๊ฒฐ๊ณผ๊ฐ 13๋ฐฐ ํฅ์๋ฉ๋๋ค.
์ด๋ ๋จ์ํ printf() ๋ช
๋ น์ ์ฃผ์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ๋ฌ์ฑ๋์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ ์ ๋ถ๋ ์๋๋๋ค. ์ฌ์ค ์ด ๋จ๊ณ์์ fastq.bio๋ ๋ค์ํ C ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ์์ ํ๋ฉฐ, ๊ฐ ํจ์๋ ๊ณ ์ ํ ํน์ฑ ์ธํธ๋ฅผ ๊ณ์ฐํ๋ฏ๋ก ํ์ผ์ ๊ฐ ์กฐ๊ฐ์ ๋ ๋ฒ ์ฝ์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ํ๋๋ก ๊ฒฐํฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ์์ฐ์ฑ์ด 20๋ฐฐ๋ ํฅ์๋๋ค.
๊ทธ๋ฌํ ๋ฐ์ด๋ ๊ฒฐ๊ณผ๊ฐ ํญ์ ๋ฌ์ฑ๋ ์๋ ์๋ค๋ ์ ์ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ด๋ค ๊ฒฝ์ฐ์๋ ์ฑ๋ฅ์ด ์ ํ๋๋ฏ๋ก ๊ฐ ์ฌ๋ก๋ฅผ ํ๊ฐํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก Wasm์ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํ์ง๋ง ํ๋ช ํ๊ฒ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ๋งํ ์ ์์ต๋๋ค.
Skillbox๋ ๋ค์์ ๊ถ์ฅํฉ๋๋ค.
- XNUMX๋ ์ค์ต ์ฝ์ค
"์ ๋ PRO ์น ๊ฐ๋ฐ์์ ๋๋ค" .- ์จ๋ผ์ธ ์ฝ์ค
"0์ C# ๊ฐ๋ฐ์" .- ์ค๊ธฐ ์ฝ์ค
"0์์ PRO๋ก์ PHP ๊ฐ๋ฐ์" .
์ถ์ฒ : habr.com