๐Ÿฆ•๐Ÿฆ€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));
    

    ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
  • 1. ๋‹จ์ˆœ์€ ์›์‹œ ํŒŒ์ผ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • 2. ํŒŒ์ผ์—์„œ wasm ๋ชจ๋“ˆ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์œผ๋กœ ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • 3. ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋“ˆ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • 4. wasm square() ํ•จ์ˆ˜๋ฅผ Deno ์ฝ”๋“œ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • 5. ๋‹ค๋ฅธ ์ˆซ์ž์˜ ์ œ๊ณฑ์ˆ˜๋ฅผ ์ฝ˜์†”์— ๊ธฐ๋กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ด์ œ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

    deno run --allow-read main.ts
    

    ์ถœ๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    1
    4
    9
    16
    

    ๋” ๋ ˆํฌ



    ๋‹ค์Œ์—์„œ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹คRepo.

    ๋” ๋งŽ์€ Deno ์ฝ˜ํ…์ธ ๋ฅผ ๋ณด๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”? ์•Œ๋ ค์ฃผ์„ธ์š”! ๋ฐ๋…ธ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ๊ธ€๊ณผ ์ฝ˜ํ…์ธ ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

    ๐Ÿ‘‹์•ˆ๋…•ํ•˜์„ธ์š”! | | | Medium | |

    ์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ