WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” 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 ์„œ์—ด ๋ถ„์„(ํ•ด๋…)์˜ ํ’ˆ์งˆ์„ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

ํ”„๋กœ์„ธ์Šค์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ ๋น„์ „๋ฌธ๊ฐ€์—๊ฒŒ๋Š” ์ƒ๋‹นํžˆ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์—†์ง€๋งŒ, ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๊ณผํ•™์ž๋“ค์€ ์œ„์˜ ์ธํฌ๊ทธ๋ž˜ํ”ฝ์„ ์‚ฌ์šฉํ•˜์—ฌ DNA ์‹œํ€€์‹ฑ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์›ํ™œํ•˜๊ฒŒ ์ง„ํ–‰๋˜์—ˆ๋Š”์ง€, ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์„œ๋น„์Šค์—๋Š” ๋Œ€์ฒด ๋ฐ์Šคํฌํ†ฑ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ fastq.bio๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ์ž‘์—… ์†๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ช…๋ น์ค„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ์œ ์ „ํ•™์ž๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝํ—˜์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ ํ…์ŠคํŠธ ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์€ ํŠน์ˆ˜ํ•œ ์‹œํ€€์‹ฑ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์—๋Š” DNA ์„œ์—ด ๋ชฉ๋ก๊ณผ ๊ฐ ๋‰ดํด๋ ˆ์˜คํ‹ฐ๋“œ์˜ ํ’ˆ์งˆ ์ ์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ ํ˜•์‹์€ .fastq์ด๋ฏ€๋กœ ์„œ๋น„์Šค ์ด๋ฆ„์ด ๋ถ™์—ฌ์กŒ์Šต๋‹ˆ๋‹ค.

JavaScript๋กœ ๊ตฌํ˜„

fastq.bio๋กœ ์ž‘์—…ํ•  ๋•Œ ์‚ฌ์šฉ์ž์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” ์ ์ ˆํ•œ ํŒŒ์ผ์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. File ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํŒŒ์ผ์—์„œ ์ž„์˜์˜ ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ์„ ์ฝ๊ณ  ํ•ด๋‹น ๋ฐฐ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ JavaScript์˜ ์—ญํ• ์€ ๊ฐ„๋‹จํ•œ ๋ฌธ์ž์—ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ธก์ •ํ•ญ๋ชฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ DNA ๋‹จํŽธ์— ์žˆ๋Š” ๋‰ดํด๋ ˆ์˜คํ‹ฐ๋“œ A, C, G ๋ฐ T์˜ ์ˆ˜์ž…๋‹ˆ๋‹ค.

ํ•„์š”ํ•œ ์ง€ํ‘œ๋ฅผ ๊ณ„์‚ฐํ•œ ํ›„ Plotly.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐํ™”ํ•˜๊ณ  ์„œ๋น„์Šค๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ์ƒ˜ํ”Œ๋กœ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ฒญํ‚น์€ UX์˜ ํ’ˆ์งˆ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ์— ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ž‘์—…ํ•˜๋Š” ๊ฒฝ์šฐ ์‹œํ€€์‹ฑ ๊ฒฐ๊ณผ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์ด ์ˆ˜๋ฐฑ ๊ธฐ๊ฐ€๋ฐ”์ดํŠธ์˜ ํŒŒ์ผ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•œ๋™์•ˆ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” 0,5~1MB ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์„ ๊ฐ€์ ธ์™€ ๋‹จ๊ณ„๋ณ„๋กœ ์ž‘์—…ํ•˜์—ฌ ๊ทธ๋ž˜ํ”ฝ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ์ž‘๋™ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

๋นจ๊ฐ„์ƒ‰ ์ง์‚ฌ๊ฐํ˜•์—๋Š” ์‹œ๊ฐํ™”๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์„œ๋น„์Šค์—์„œ ๊ฐ€์žฅ ๊ณ„์‚ฐ ์ง‘์•ฝ์ ์ธ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. Wasm์œผ๋กœ ๊ต์ฒดํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น์–ด์…ˆ๋ธ”๋ฆฌ ํ…Œ์ŠคํŠธ

Wasm ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ํŒ€์€ fastq ํŒŒ์ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ QC ์ง€ํ‘œ(QC - ํ’ˆ์งˆ ๊ด€๋ฆฌ)๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์„ฑ ์†”๋ฃจ์…˜์„ ๊ฒ€์ƒ‰ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. C, C++, Rust๋กœ ์ž‘์„ฑ๋œ ํˆด ์ค‘์—์„œ ๊ฒ€์ƒ‰์„ ์ง„ํ–‰ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ WebAssembly๋กœ ํฌํŒ…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋„๊ตฌ๋Š” "์›์‹œ"์—ฌ์„œ๋Š” ์•ˆ ๋˜๋ฉฐ ๊ณผํ•™์ž๋“ค์ด ์ด๋ฏธ ํ…Œ์ŠคํŠธํ•œ ์„œ๋น„์Šค๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ๋Š” ์œ ๋ฆฌํ•œ ์„ ํƒ์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ. ์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉฐ ์˜คํ”ˆ ์†Œ์Šค์ด๋ฉฐ ์†Œ์Šค ์–ธ์–ด๋Š” C์ž…๋‹ˆ๋‹ค.

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 ๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ POSIX์™€ ์œ ์‚ฌํ•œ FS, ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์˜ RAM์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์ƒˆ๋กœ ๊ณ ์ณ์ง€๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ง€์›Œ์ง‘๋‹ˆ๋‹ค.

๊ฐ€์ƒ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•œ ์ด์œ ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ๋ช…๋ น์ค„์—์„œ 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 ํŒŒ์ผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์•„ํ‚คํ…์ฒ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

๊ทธ๋ฆผ์€ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ € ์Šค๋ ˆ๋“œ์—์„œ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹ , WebWorkers. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ € ์‘๋‹ต์„ฑ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Šค๋ ˆ๋“œ์—์„œ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebWorker ์ปจํŠธ๋กค๋Ÿฌ๋Š” Worker๋ฅผ ์‹œ์ž‘ํ•˜์—ฌ ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

seqtk ๋ช…๋ น์€ ๋งˆ์šดํŠธ๋œ ํŒŒ์ผ์—์„œ Worker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์ด ์™„๋ฃŒ๋˜๋ฉด Worker๋Š” Promise ํ˜•ํƒœ๋กœ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉด ๊ทธ ๊ฒฐ๊ณผ๋Š” ๊ทธ๋ž˜ํ”„๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ๋ฒˆ์˜ ๋ฐ˜๋ณต์œผ๋กœ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

WebAssembly ์„ฑ๋Šฅ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

์„ฑ๋Šฅ ๋ณ€ํ™”๋ฅผ ํ‰๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์ ํŠธ ํŒ€์€ ์ดˆ๋‹น ์ฝ๊ธฐ ์ž‘์—… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ตฌํ˜„ ๋ชจ๋‘ JavaScript๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ๋Œ€ํ™”ํ˜• ๊ทธ๋ž˜ํ”„๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๊ณ ๋ ค๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰์‹œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์†”๋ฃจ์…˜์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์„ฑ๋Šฅ์ด XNUMX๋ฐฐ ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

์ด๋Š” ํ›Œ๋ฅญํ•œ ๊ฒฐ๊ณผ์ด์ง€๋งŒ, ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ด๋ฅผ ์ตœ์ ํ™”ํ•  ๊ธฐํšŒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋งŽ์€ QC ๋ถ„์„ ๊ฒฐ๊ณผ๋Š” seqtk์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด JS์— ๋น„ํ•ด ๊ฒฐ๊ณผ๊ฐ€ 13๋ฐฐ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

์ด๋Š” ๋‹จ์ˆœํžˆ printf() ๋ช…๋ น์„ ์ฃผ์„ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ๋‹ฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ทธ๊ฒŒ ์ „๋ถ€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์‚ฌ์‹ค ์ด ๋‹จ๊ณ„์—์„œ fastq.bio๋Š” ๋‹ค์–‘ํ•œ C ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์ˆ˜์‹ ํ•˜๋ฉฐ, ๊ฐ ํ•จ์ˆ˜๋Š” ๊ณ ์œ ํ•œ ํŠน์„ฑ ์„ธํŠธ๋ฅผ ๊ณ„์‚ฐํ•˜๋ฏ€๋กœ ํŒŒ์ผ์˜ ๊ฐ ์กฐ๊ฐ์„ ๋‘ ๋ฒˆ ์ฝ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ธฐ๋Šฅ์„ ํ•˜๋‚˜๋กœ ๊ฒฐํ•ฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ์ƒ์‚ฐ์„ฑ์ด 20๋ฐฐ๋‚˜ ํ–ฅ์ƒ๋๋‹ค.

WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†๋„๋ฅผ 20๋ฐฐ ํ–ฅ์ƒ์‹œํ‚จ ๋ฐฉ๋ฒ•

๊ทธ๋Ÿฌํ•œ ๋›ฐ์–ด๋‚œ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ๋‹ฌ์„ฑ๋  ์ˆ˜๋Š” ์—†๋‹ค๋Š” ์ ์€ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์„ฑ๋Šฅ์ด ์ €ํ•˜๋˜๋ฏ€๋กœ ๊ฐ ์‚ฌ๋ก€๋ฅผ ํ‰๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ Wasm์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Skillbox๋Š” ๋‹ค์Œ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€