๐ฆ๐ฆRust์์ WebAssembly๋ฅผ ์์ฑํ๊ณ Deno์์ ์คํํ๊ธฐ!
5749 ๋จ์ด denobeginnerswebassemblyrust
์๊ตฌ ์ฌํญ
์ปดํจํฐ์ ์ค์น๋ ๋๊ตฌ๋ฅผ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
์ด๊ฒ์ Rust๋ฅผ ๊ฐ๋ฐํ๊ณ Deno์ ํจ๊ป ์์ ํ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ ํ์ค์ ๋๋ค.
์ด์ ๋ น์ ๋ํ was ํน์ ๋๊ตฌ๋ฅผ ์ค์นํด์ผ ํฉ๋๋ค.
๋จผ์ ๋ค์๊ณผ ๊ฐ์ ์ปดํ์ผ๋ฌ ๋์์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
rustup target add wasm32-unknown-unknown
wasm-gc
๋๊ตฌ๋ ํ์ํฉ๋๋ค.cargo install wasm-gc
์ ๋ ๊ฐ๋ฐ์ ์ํด Visual Studio Code๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ ์ด ํ๋ก์ ํธ๋ฅผ ์ํด ๋ค์ ํ์ฅ๋ ์ค์นํ์ต๋๋ค.
bungcip.better-toml
rust-lang.rust
๋ฌ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ง๋ค๊ธฐ
๋ น ๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ ํ๋ฌผ ๋ณด๊ดํจ์ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ผ๋ก ํ ์ ์์ต๋๋ค.
cargo new --lib wasm_deno_example
cd wasm_deno_example
๋ค์์ผ๋ก VSCode์์ ํ๋ก์ ํธ๋ฅผ ์ด ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ was์ ๋ํ ์์กด์ฑ์
Cargo.toml
์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.[lib]
crate-type =["cdylib"]
cdylib
๋ ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ฅผ C์ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด ๋๋ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ wasm
์ ํจ๊ป ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ๋ํ ๋
น์ ํ์ํ ๋ชจ๋ ํน์ ๋ฌผ์ง์ ์ ๊ฑฐํฉ๋๋ค.์ฐ๋ฆฌ์ ์์ ๋ น ๊ธฐ๋ฅ
์ด์
src/lib.rs
ํ์ผ์ ๋ค์ ์ฝ๋๋ก ๋ณ๊ฒฝํฉ๋๋ค.#[no_mangle]
pub extern "C" fn square(x: u32) -> u32 {
x * x
}
์ด๊ฒ์ ์ซ์๋ฅผ ๋ฐ์ ์ซ์๋ฅผ ๋ฐํํ๋ ๊ฐ๋จํ ํจ์์ ๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์
extern
ํค์๋๋ฅผ ์ถ๊ฐํ์ฌ ์ด ํจ์๋ฅผ Deno ์ฝ๋์์ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ด ๊ฒ์๋ฌผ์ ์ฝ์ ๋ ์ดํดํด์ผํฉ๋๋ค x * x
๐๋ น์ wasm์ผ๋ก ์ปดํ์ผ
์ด์ Rust ์ฝ๋๋ฅผ was ์ฝ๋๋ก ์ปดํ์ผํ ์ ์์ต๋๋ค.
๋จผ์ ๋ค์ ๋ช ๋ น์ผ๋ก ๋น๋๋ฅผ ์ปดํ์ผํด์ผ ํฉ๋๋ค.
$ cargo build --target wasm32-unknown-unknown
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ํ์๋ก ํ์ง ์๋ ๋ชจ๋ ๊ฒ๋ค์์ ๊ทธ๊ฒ์ ์ ๊ฑฐํด์ผ ํฉ๋๋ค. ์ด๊ฒ์
wasm
์ ๋ํ ๋ชจ๋ ๋ถํ์ํ ์ฝ๋๋ฅผ ์ ๊ฑฐํ๊ณ ํ์ผ์ ๋ ์๊ฒ ๋ง๋ญ๋๋ค.wasm-gc target/wasm32-unknown-unknown/debug/wasm_deno_example.wasm
์ด์ Deno์ ๋ก๋ํ๊ณ ์คํํ ์ค๋น๊ฐ ๋
wasm
๋ฐ์ด๋๋ฆฌ๊ฐ ์์ต๋๋ค.Deno์ ํจ๊ป ์คํ
์ด์
main.ts
๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ์ด๋ฆ์ ์ค์ํ์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉํ ์ด๋ฆ์
๋๋ค.ํ์ผ์ ๋ค์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ผ ํ ๋.
const wasmCode = await Deno.readFile("./target/wasm32-unknown-unknown/debug/wasm_deno_example.wasm");
const wasmModule = new WebAssembly.Module(wasmCode);
const wasmInstance = new WebAssembly.Instance(wasmModule);
const {
square,
} = wasmInstance.exports;
console.log(square(1));
console.log(square(2));
console.log(square(3));
console.log(square(4));
๋จ๊ณ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
wasm
square()
ํจ์๋ฅผ Deno ์ฝ๋๋ก ๊ฐ์ ธ์ต๋๋ค. ์ด์ ๋ค์์ ์ฌ์ฉํ์ฌ ์ด ์ฝ๋๋ฅผ ์คํํด ๋ณด๊ฒ ์ต๋๋ค.
deno run --allow-read main.ts
์ถ๋ ฅ์ ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค.
1
4
9
16
๋ ๋ ํฌ
๋ค์์์ ์ฝ๋๋ฅผ ์ฐพ์ ์ ์์ต๋๋คRepo.
๋ ๋ง์ Deno ์ฝํ ์ธ ๋ฅผ ๋ณด๊ณ ์ถ์ผ์ ๊ฐ์? ์๋ ค์ฃผ์ธ์! ๋ฐ๋ ธ์ ๋ํด ๋ ๋ง์ ๊ธ๊ณผ ์ฝํ ์ธ ๋ฅผ ๋ง๋ค๊ณ ์ถ์ต๋๋ค!
๐์๋ ํ์ธ์! | | | Medium | |
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ฆ๐ฆRust์์ WebAssembly๋ฅผ ์์ฑํ๊ณ Deno์์ ์คํํ๊ธฐ!), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/lampewebdev/writing-webassembly-in-rust-and-runing-it-in-deno-144jํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค