SmileCat.

Rust ์ฐ๋จนํ›„๊ธฐ

Review

๐Ÿค” ์™œ Rust๋ฅผ?

์–ธ์ œ ์–ด๋–ป๊ฒŒ ์•Œ๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š๋Š” ์–ธ์–ด์ง€๋งŒ, ์ถ”์ธกํ•ด๋ณด๊ฑด๋Œ€ ์•„๋งˆ WebAssembly ๊ด€๋ จํ•˜๋ฉด์„œ ์ฒ˜์Œ ๋“ค์–ด๋ณธ ๊ฒƒ์ด ์•„๋‹๊นŒ ํ•œ๋‹ค. WebAssembly๋„ Rust๋„ ์–ด๋”˜๊ฐ€์—์„œ์˜ ์ปจํผ๋Ÿฐ์Šค๋‚˜ ์„ธ๋ฏธ๋‚˜์—์„œ ์ ‘ํ•œ ์ง€ ํ•œ์ฐธ์ด๋‚˜ ๋˜์—ˆ์ง€๋งŒ, ๊ธฐ์ˆ ์ด ๋ฌด๋ฅด์ต๊ณ  ํ•„์ž๋„ ๋ฐ›์•„๋“ค์ผ ๋งˆ์Œ์ด ๋“ค๊ธฐ๊นŒ์ง€ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ ๊ฒƒ ๊ฐ™๋‹ค.

WebAssembly๋Š” Go๋กœ ํ•ด๋ด์•ผ์ง€ ํ•˜๋ฉด์„œ ๊ทน๊ตฌ ์™ธ๋ฉดํ•˜๊ณ  ์žˆ๋˜ Rust๋ฅผ ์–ด๋–ค ๊ธ€์— ํ˜นํ–ˆ๋Š”์ง€ ํ˜น์€ ๋ˆ„๊ตฐ๊ฐ€์˜ ๋ฝ๋ฟŒ์˜€๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์ง€๋‚œ 3์›” ๋ถˆํ˜„๋“ฏ ์ง‘์–ด ๋“ค์–ด 4๊ฐœ์›”์ด ๋„˜์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜์„œ์•ผ ๊ธ€๋กœ ์ •๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฐ”์œ ์™€์ค‘์— ์งฌ์ด ๋‚  ๋•Œ ์ง„ํ–‰ํ•˜์—ฌ 4๊ฐœ์›”์ด๋ผ๋Š” ๊ธฐ๊ฐ„์น˜๊ณ ๋Š” ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ๋„ ์ ๊ณ , ์ด๋ฏธ ์ž˜ ์ •๋ฆฌ๋œ ์žˆ๋Š” ๊ธ€์ด ๋งŽ์•„์„œ ๊ฐ„๋‹จํ•œ ํ›„๊ธฐ ์ •๋„์˜ ์ปจ์…‰์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿ”  ์–ธ์–ด๋กœ์„œ์˜ ์–ด๋–ค ํŠน์ง•์ด ์žˆ๋‚˜?

ํ•„์ž๋Š” JavaScript๋ฅผ ์ฃผ๋ ฅ์œผ๋กœ ์“ฐ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ฐ€๋” ์–ด๋””์„ ๊ฐ€ ์ ‘ํ•  ๊ธฐํšŒ๊ฐ€ ์ƒ๊ธฐ์–ด ๊ด€์‹ฌ์ด ์ƒ๊ธด๋‹ค๋ฉด ํ•ด๋‹น ์–ธ์–ด๋ฅผ ๋ฐฐ์›Œ๋ณด๋Š” ๋ฐฉ์‹์œผ๋กœ ์–ธ์–ด๋“ค์„ ์ ‘ํ–ˆ๋‹ค. ํ•„์ž๋Š” ํ•„์ž๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ ‘ํ•ด๋ณธ ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go๋ž‘ ๋น„์Šทํ•œ ๋А๋‚Œ์œผ๋กœ Rust๋ฅผ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— WebAssembly๋ฅผ Go๋กœ ๊ตฌํ˜„ํ•  ์ƒ๊ฐ๊ณผ ์ด์— ๋Œ€ํ•œ ์กฐ์‚ฌ๋ฅผ ํ•ด๋ดค๊ณ , ๋Š˜ Rust๊ฐ€ Go์— ๋น„ํ•ด ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด ์˜๋ฌธ์ด์—ˆ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์˜๋ฌธ์€ Rust๋ฅผ ๋ฐฐ์›Œ๊ฐ€๋ฉฐ ํ•˜๋‚˜์”ฉ ํ•ด์†Œ๋  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ์„œ Rust๋Š” JavaScript๋‚˜ Python, Java ๊ฐ™์€ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒ๊ฐํ•˜๋˜ ๋ฐฉ์‹๊ณผ๋Š” ํ™•์—ฐํžˆ ๋‹ฌ๋ž๊ณ  ๊ฐ™์€ ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์™€๋„ ํฌ๊ฒŒ ๋‹ค๋ฅธ ๋А๋‚Œ์ด์—ˆ๋‹ค. Go๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•์œผ๋กœ ์ธํ•ด์„œ ๋ฌธ๋ฒ•์  ํ˜ผ๋™์ด ๋จผ์ € ์™”์„ ๋ฟ ์‚ฌ์šฉํ•˜๋Š” ์ธก๋ฉด์—์„œ๋Š” ์ „๋ฐ˜์ ์œผ๋กœ ํฐ ์–ด๋ ค์›€์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. Go์™€ ๋‹ฌ๋ฆฌ Rust๋Š” ๋ณด๋ฉด์„œ ๊ณผ๊ฑฐ ํ•™๋ถ€์ƒ ๋•Œ C๋‚˜ C++์„ ๋ฐฐ์šฐ๋˜ ์‹œ์ ˆ์ด ์ฃผ๋งˆ๋“ฑ์ฒ˜๋Ÿผ ์ง€๋‚˜๊ฐ”๋‹ค.

Rust๋Š” C/C++๊ณผ ๋™๋“ฑํ•œ ์ˆ˜์ค€์˜ ์„ฑ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ, ๋™์‹œ์„ฑ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ๋‹ค. ์ด์— JavaScript ๋“ฑ์˜ ์–ธ์–ด์™€ ๋‹ฌ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๋กœ์ง๋“ค์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ ๊ฒฝํ—˜ํ•˜์ง€ ๋ชปํ•œ ์ƒˆ๋กœ์›€์„ ์ค€๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  C/C++๊ณผ ๊ฐ™์ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๋ฅผ ์ง์ ‘ ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, ์„ ์–ธ๋œ ์ธ์ž(๋ณ€์ˆ˜)์— ์†Œ์œ ๊ถŒ(Ownership)์ด ๋ถ€์—ฌ๋˜๊ณ  ์ด ์†Œ์œ ๊ถŒ์€ ๋‹ค๋ฅธ ์ธ์ž์— ํ• ๋‹น๋˜๊ฑฐ๋‚˜ ๋ธ”๋ก์˜ ๋์— ๋„๋‹ฌํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด์ œ๋˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์ด ์ธ์ž๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์†Œ๋ฉธํ•˜๊ธฐ๊นŒ์ง€์˜ ๋ฒ”์œ„๋ฅผ ์ˆ˜๋ช…(Lifetime)์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ฐ ์ธ์ž ๊ฐ„์˜ ์ˆ˜๋ช…์„ ๋ณด๊ณ  ์ปดํŒŒ์ผ ๋‹จ์—์„œ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋ฅผ ํ™•์ธํ•˜์—ฌ ๋Œ•๊ธ€๋ง ํฌ์ธํ„ฐ(Dangling pointer)๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ด์™ธ์— ์†Œ์œ ๊ถŒ์œผ๋กœ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹ ์ด์™ธ์—, ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์˜ ํฌ์ธํ„ฐ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ„๋„์˜ ๋ฐฉ๋ฒ•์ธ ์ฐธ์กฐ์ž(&)๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š”๋ฐ, ์ด ๋˜ํ•œ ์•ž์„œ ๋งํ•œ ์ˆ˜๋ช…์— ๋ฒ”์œ„ ์•ˆ์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

error[E0382]: use of moved value: `s1`
 --> src/main.rs:4:27
  |
3 |     let s2 = s1;
  |         -- value moved here
4 |     println!("{}, world!", s1);
  |                            ^^ value used here after move
  |
  = note: move occurs because `s1` has type `std::string::String`,
which does not implement the `Copy` trait

๋˜ํ•œ Rust๋Š” ๋ช‡ ๊ฐ€์ง€ ์—ด๊ฑฐํ˜•๊ณผ ํŒจํ„ด ๋งค์นญ์„ ํ†ตํ•ด ๋ช…ํ™•ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. Result<T, E>๋‚˜ Option์™€ ๊ฐ™์€ ์—ด๊ฑฐํ˜•์„ ๋‹ค๋ฅธ ์–ธ์–ด์˜ switch์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ match๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด, ๊ฐ€๋…์„ฑ๋„ ํ™•๋ณดํ•˜๋ฉด์„œ๋„ ์˜ˆ์™ธ ๋“ฑ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์†์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

fn plus_one(x: Option&#x3C;i32>) -> Option&#x3C;i32> {
    match x {
        None => None,
        Some(i) => Some(i + 1),
    }
}

let five = Some(5);
let six = plus_one(five);
let none = plus_one(None);

JavaScript์—์„œ๋Š” ์—†์–ด TypeScript์—์„œ ๊ฐ์ง€๋•์ง€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ•œํŽธ์œผ๋กœ ๋Š˜ ์•„์‰ฌ์šด ๋ถ€๋ถ„์ด ์—ด๊ฑฐํ˜•์ด์—ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์—๋Š” ์ƒ์ˆ˜๋‚˜ ๋ฌธ์ž์—ด๋งŒ์œผ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ–ˆ์ง€๋งŒ ์ข€ ๋” ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ด ๋ถ€๋ถ„์ด ๋Š˜ ์•„์‰ฌ์› ๋‹ค. Rust๋Š” ๊ฐ’์— ๊ตฌ์กฐ์ฒด๋‚˜ ํŠœํ”Œ ๋“ฑ์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ณ  ์—ด๊ฑฐํ˜•์— ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์–ด์„œ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ ์ด ์ข‹์•˜๋‹ค.

enum IpAddr {
    V4(u8, u8, u8, u8),
    V6(String),
}

let home = IpAddr::V4(127, 0, 0, 1);

let loopback = IpAddr::V6(String::from("::1"));

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

use std::sync::{Mutex, Arc};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&#x26;counter);
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap();

            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap());
}

์ธ์ƒ ๊นŠ์—ˆ๋˜ ํŠน์ง•์„ ์œ„์ฃผ๋กœ ์ž‘์„ฑํ•ด ๋ณด์•˜๋Š”๋ฐ, ์ด์™ธ์—๋„ ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ ํŠน์ง•์ด ์žˆ์œผ๋‹ˆ ์ข‹์€ ๋‹ค์–‘ํ•œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•ด๋ณด๊ธฐ๋ฅผ ์ถ”์ฒœํ•œ๋‹ค.

๐Ÿ› ๏ธ ์ œ๊ณตํ•˜๋Š” ํ™˜๊ฒฝ์€ ์–ด๋– ํ•œ๊ฐ€?

ํ•™๋ถ€์ƒ ๋•Œ์™€ ์ดํ›„ ์—…๋ฌด๋ฅผ ํ†ตํ•ด ๊ฒช์€ Python, Java์™€ JavaScript ๋ชจ๋‘ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ์ธก๋ฉด์ด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ, ์ปค๋ฎค๋‹ˆํ‹ฐ ๋“ฑ์˜ ํ›Œ๋ฅญํ•œ ์—์ฝ” ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๋ฌด์—‡์ธ๊ฐ€ ๋ง‰ํ˜”๋‹ค๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์„ ๋•Œ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ž˜ ๊ด€๋ฆฌ๋œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋ฐ˜๋ฉด, ์ง€๊ธˆ์€ ๋‹ฌ๋ผ์กŒ์„ ์ˆ˜ ์žˆ์œผ๋‚˜ ์ฒ˜์Œ Go๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ด๋Ÿฐ ๋ถ€๋ถ„์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‹ค. ๋ฌด์—‡์ธ๊ฐ€ ๋ถ€์‹คํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์™€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ฐพ์•˜์ง€๋งŒ, ์ƒ๋‹น์ˆ˜ ๋งŒ๋“ค์–ด์ง€๋‹ค ๋งŒ ๋“ฏํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ๋งŽ๋‹ค๊ณ  ๋А๊ปด์กŒ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋‚ด๋ถ€ ์ €์žฅ์†Œ์— ํ•˜๋‚˜๋‘˜์”ฉ ํฌํฌ ๋˜์–ด ๊ฐ€๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์ƒ๊ฒจ๋‚ฌ๊ณ , ๊ด€๋ฆฌ ํฌ์ธํŠธ๊ฐ€ ๋Š˜์–ด๋‚ฌ์—ˆ๋‹ค.

Rust์— ๋Œ€ํ•œ ํ•™์Šต์„ ์‹œ์ž‘ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ๋จผ์ € ๋ˆˆ์—ฌ๊ฒจ๋ณธ ๋ถ€๋ถ„์ด ๊ทธ ๋ถ€๋ถ„์ด์—ˆ๋‹ค. Rust์˜ ๋ชจ๋“ˆ๋“ค์€ Crate๋ผ๋Š” ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋˜๋Š”๋ฐ ์ด๋ฅผ ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ธ create.io๊ฐ€ ์กด์žฌํ•œ๋‹ค. NPM๊ณผ ์œ ์‚ฌํ•œ ์ˆ˜์ค€์˜ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ํฐ ๋ถˆํŽธํ•จ์€ ์—†์—ˆ๋‹ค. Rust๋Š” ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ ์ด์™ธ์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ(์ž„์˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋‚˜ ์‹œ๊ฐ„ ๊ด€๋ จ๋œ ๋ถ€๋ถ„๋“ค๊นŒ์ง€๋„), ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ•ด์™”๋˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๋ฐฐํฌ์ผ๋“ค์ด ์˜ค๋ž˜๋˜์ง€ ์•Š์•˜๊ณ  ๊ธฐ๋Šฅ ๋˜ํ•œ ๋ถ€์กฑํ•จ์ด ์—†๋‹ค๊ณ  ๋А๊ปด์ ธ์„œ ์ž˜ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ๋А๋‚Œ์„ ๋ฐ›์•˜๋‹ค.

create.io

๋˜ํ•œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ์ธ Cargo๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•ด์ฃผ๊ฑฐ๋‚˜, ์ฃผ์„์„ ํ†ตํ•ด ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉฐ, ํฌ๋งคํŒ…, ๋ฆฐํŒ… ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค. ํŠนํžˆ ์ฃผ์„์„ ํ†ตํ•œ ๋ฌธ์„œ์—๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์–ด์„œ, ๋ฌธ์„œ์™€ ๊ฒ€์ฆ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•จ๊ป˜ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋”์šฑ ์ข‹์•˜๋‹ค.

/// Block in blockchain has sequence, data, time, and so on.
#[derive(Debug, Serialize, Deserialize)]
pub struct Block {
    /// Sequence in blockchain
    pub index: usize,

    /// Hash from other properties
    pub hash: String,

    /// Previous block hash
    pub previous_hash: String,

    /// Timestamp when created
    pub timestamp: usize,

    /// Data in block
    pub data: Vec&#x3C;Transaction>,

    /// Difficulty to generate block
    pub difficulty: usize,

    /// Nonce to generate block
    pub nonce: usize,
}

Document

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

error[E0308]: `match` arms have incompatible types
  --> src\main.rs:17:14
   |
15 |       let some_variable = match my_number {
   |  _________________________-
16 | |         10 => 8,
   | |               - this is found to be of type `{integer}`
17 | |         _ => "Not ten",
   | |              ^^^^^^^^^ expected integer, found `&#x26;str`
18 | |     };
   | |_____- `match` arms have incompatible types

IDE ์ง€์› ๋ถ€๋ถ„์€ IntelliJ์—์„œ๋Š” ์ฝ”๋“œ ํ•˜์ผ๋ผ์ดํŒ…, ์ž๋™ ์™„์„ฑ, ํ…Œ์ŠคํŠธ, ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋“ฑ ๋ชจ๋“  ๋ถ€๋ถ„์—์„œ ๋ถˆํŽธํ•จ์€ ์—†์—ˆ๋‹ค. IntelliJ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋จผ์ € VS Code๋กœ ์‚ฌ์šฉ์„ ์‹œ๋„ํ•ด๋ณด์•˜๋Š”๋ฐ, ์„ค์ •์ด ๋ฏธํกํ–ˆ๋˜ ๊ฒƒ์ธ์ง€ ์ž๋™ ์™„์„ฑ ์ธก๋ฉด ๋“ฑ์—์„œ ๋ถˆํŽธํ•˜๋‹ค๊ณ  ๋А๊ปด์ ธ IntelliJ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๐Ÿ“– ํ•™์Šตํ•˜๊ธฐ์— ์‰ฌ์šด๊ฐ€?

ํ•™์Šต์€ ํ•™์Šตํ•˜๊ธฐ ์ข‹์€ ํ™˜๊ฒฝ์ธ์ง€์™€ ํ•™์Šตํ•  ๋‚ด์šฉ์ด ์ˆ˜์›”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ ๋‚˜๋ˆ ์„œ ์ƒ๊ฐํ•ด ๋ณด๊ณ ์ž ํ•œ๋‹ค.

์šฐ์„  ํ•™์Šตํ•˜๊ธฐ ์ข‹์€ ํ™˜๊ฒฝ์ธ๊ฐ€ ๋ดค์„ ๋•Œ๋Š” ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด๋“ค์— ๋น„ํ•ด์„œ๋Š” ๊ทธ๋ฆฌ ๋งŒ๋งŒํ•œ ํ™˜๊ฒฝ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ธ๊ธฐ ์žˆ๋Š” ์–ธ์–ด๋“ค์€ ํ•™์Šต์— ๋Œ€ํ•œ ๊ฐ€์ด๋“œ ๋ฐ ๋‹ค์–‘ํ•œ ํ•œ๊ธ€๋กœ ๋œ ์„œ์ ๋“ค์ด ์žˆ๋Š” ๋ฐ˜๋ฉด์— Rust๋Š” ๊ทธ๋Ÿฐ ์ธก๋ฉด์—์„œ ๋ถ€์กฑํ•œ ๊ฒƒ์€ ์‚ฌ์‹ค์ด๋‹ค. ๋‹ค๋งŒ ํ•œ๊ธ€ํ™” ๋œ์ง€ ์ข€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ธด ํ–ˆ์ง€๋งŒ, ํ•œ๊ธ€ ๋ฒˆ์—ญ๋œ ์ฑ…์ธ The Rust Programming Language ๊ฐ€ ์กด์žฌํ•˜๋ฉฐ, David MacLeod๊ฐ€ ์ž‘์„ฑํ•œ Easy Rust ๋ผ๋Š” ์ฑ…๊ณผ Easy Rust ํ•œ๊ธ€ ๋น„๋””์˜ค ๋„ ์žˆ์–ด์„œ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ๋‹ค.

ํ•„์ž๋Š” The Rust Programming Language๋ฅผ ํ†ตํ•ด ๋จผ์ € ์ „๋ฐ˜์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ ์‘ํ•œ ํ›„์— Easy Rust๋ฅผ ์ฑ…๊ณผ ๊ฐ€์ด๋“œ๋ฅผ ๋ณ‘ํ–‰ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€๋‹ค. ๋‘ ์ฑ…์˜ ์ฐจ์ด์ ์€ The Rust Programming Language๋Š” ํ•œ๊ธ€ํ™”๋œ ์ง€ ์‹œ๊ฐ„์ด ์ง€๋‚˜ Rust ํ˜„์žฌ ๋ฒ„์ „์—์„œ ์ผ๋ถ€ ์˜ˆ์ œ๋“ค์ด ์‹คํ–‰์ด ์•ˆ ๋˜์—ˆ๋‹ค. ๋˜ํ•œ ์ „๋ฐ˜์ ์ธ ๊ตฌ์„ฑ์ด Easy Rust์— ๋น„ํ•ด ์–ด๋ ต๊ฒŒ ์ž‘์„ฑ๋œ ๋А๋‚Œ์ด์—ˆ๋‹ค.

๋ฐ˜๋ฉด Easy Rust๋Š” ๋ฒˆ์—ญ๋œ ์ฑ…์€ ์•„๋‹ˆ๋‚˜ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋‹จ์–ด๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ณ  ํ•œ๊ธ€ ๋น„๋””์˜ค ๋˜ํ•œ ์ œ๊ณต๋˜์–ด ์ดํ•ดํ•˜๊ธฐ ์ˆ˜์›”ํ•œ ํŽธ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๋˜ํ•œ ๋ฌธ๋ฒ•์ ์ธ ์ธก๋ฉด ์™ธ์— ์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋“ค๋„ ๊ฐ™์ด ์–ธ๊ธ‰๋˜์–ด ์ข‹์•˜๋‹ค. ๋‹ค๋งŒ, The Rust Programming Language์™€ ๋‹ฌ๋ฆฌ ์†Œ์œ ๊ถŒ ๋“ฑ์˜ ๊ฐœ๋…์— ๋Œ€ํ•œ ์„ค๋ช…์ด ์ „๋ฐ˜์ ์œผ๋กœ ๋…น์•„๋“ค์–ด ์žˆ์–ด์„œ ์ด ์ฑ…์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ดค๋‹ค๋ฉด ๋ณ„๋„๋กœ ๊ฒ€์ƒ‰์ด ํ•„์š”ํ–ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•™์Šตํ•  ๋‚ด์šฉ ์ž์ฒด๋Š” JavaScript๋‚˜ Python, Java ๋“ฑ์˜ ์–ธ์–ด์— ๋น„ํ•ด์„œ๋Š” ์–ด๋ ค์› ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๊ฐ™์€ ์ปดํŒŒ์ผ ์–ธ์–ด์ธ Go๋ณด๋‹ค๋„ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๊ณผ๊ฑฐ C/C++์„ ๋ฐฐ์› ๋˜ ๊ธฐ์–ต์ด ์—†๋‹ค๋ฉด ๋น„๊ตํ•  ์ƒ๋Œ€๊ฐ€ ์—†์–ด์„œ ๋” ์–ด๋ ค์› ์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋‹ค๋งŒ, ์ด๋Ÿฐ ๋ถ€๋ถ„์€ ์‹œ๊ฐ„์ด ํ•ด๊ฒฐํ•ด ์ฃผ์—ˆ๊ณ  ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋‹ˆ ์กฐ๊ธˆ ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

๋ฌผ๋ก  ์—ฌ์ „ํžˆ ์‰ฝ์ง€ ์•Š์€ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ฒƒ๋„ ๋ถ€์ •ํ•  ์ˆ˜๋Š” ์—†๋‹ค. ๊ทธ์ € ์ „์ฒด ๋ชฉ๋ก์„ ๋Œ๋ฉฐ ์„œ๋กœ์— ์˜ํ–ฅ์„ ๋ผ์น  ํ•„์š”๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ์„ ๋ฟ์ธ๋ฐ ๊ฐ€๋ณ€์„ฑ ์ธ์ž๋Š” ๋‘ ๋ฒˆ ์ฐธ์กฐํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค๋ณด๋‹ˆ ๋งŽ์ด ํ—ค๋งธ๋‹ค.

fn update () {
    //...
    for i in 0..points.len() {
        for j in 0..points.len() {
            let (p1, mut p2) = if i &#x3C; j {
                // `i` is in the left half
                let (left, right) = points.split_at_mut(j);
                (&#x26;mut left[i], &#x26;mut right[0])
            } else if i == j {
                // cannot obtain two mutable references to the
                // same element
                continue;
            } else {
                // `i` is in the right half
                let (left, right) = points.split_at_mut(i);
                (&#x26;mut right[0], &#x26;mut left[j])
            };

            //...
        }
        // ...
    }
}

โ–ถ๏ธ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด์ž

์‚ฌ์‹ค ํ•„์ž๋Š” ์ฒ˜์Œ Rust์— ๋Œ€ํ•œ ์ฑ…์„ ๋ณผ ๋•Œ ์ƒ์†Œํ•˜๊ธฐ๋Š” ํ•˜๋‚˜ ๊ทธ์ € ๋ˆˆ์œผ๋กœ ๋ณด๊ณ  ์˜ˆ์ œ๋ฅผ ์กฐ๊ธˆ ์น˜๊ฑฐ๋‚˜ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰ํ•ด ๋ณด๋ฉด์„œ ๋ชน์‹œ ์–ด๋ ต์ง€ ์•Š๊ณ  ๋ณผ๋งŒํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. The Rust Programming Language๋ฅผ ํ•œ ๋‹ฌ์—ฌ ๊ฐ„ ๋ณด๊ณ  Easy Rust๋ฅผ ๋ณ‘ํ–‰ํ•ด๊ฐ€๋ฉด์„œ๋„ ์ง์ ‘ ์ž‘์„ฑํ•ด๋ณด์ง€ ์•Š์œผ๋‹ˆ ๋„์ €ํžˆ ์ฒด๊ฐํ•  ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค. ๋˜ ํ•˜๋‚˜์˜ Template Library ์‹œ๋ฆฌ์ฆˆ ๋Œ€์ƒ์œผ๋กœ ์žก์„๊นŒ ํ•˜๋‹ค๊ฐ€๋„ ์‰ฝ์‚ฌ๋ฆฌ ์†์ด ๊ฐ€์ง€ ์•Š์•˜๋‹ค.

์ด๋•Œ ์—…๋ฌด์ ์œผ๋กœ ๋ธ”๋ก์ฒด์ธ์— ๋Œ€ํ•ด์„œ ์ ‘ํ•  ๊ธฐํšŒ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐœ๋…์ ์œผ๋กœ ์ดํ•ด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ์ด์ „์— ๋ธ”๋ก์ฒด์ธ์— ๋Œ€ํ•ด ๊ฐœ๋…์ ์œผ๋กœ ๊ถ๊ธˆํ•ด์„œ ์ฐพ์•„๋ดค์„ ๋•Œ JavaScript๋กœ ๋ธ”๋ก์ฒด์ธ ๋งŒ๋“ค๊ธฐ ๋ผ๋Š” ๊ธ€์ด ์žˆ์—ˆ๋˜ ๊ฒƒ์ด ๋– ์˜ฌ๋ผ Rust๋กœ ์ด ๊ธ€์„ ๋”ฐ๋ผ์„œ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณด๊ณ ์ž ํ–ˆ๋‹ค.

์ด ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•, ๋น„๋™๊ธฐ, ์ง๋ ฌํ™”, ์‹œ์Šคํ…œ ์ ‘๊ทผ, ์ธ์ฆ ๋ฐ HTTP, Socket ํ†ต์‹  ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฒฝํ—˜์„ ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฑ…์„ ํ†ตํ•ด ์•Œ์ง€ ๋ชปํ–ˆ๋˜ ์–ด๋ ค์›€์„ ๋А๊ผˆ๊ณ , ์ด๋ฅผ ์ฐพ์•„์„œ ํ•ด๊ฒฐํ•˜๊ณ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ์ •ํ•˜๋Š” ๊ณผ์ •์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์—…๋ฌด์—์„œ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ถ€๋ถ„๋“ค์„ ํ•˜๋‚˜์”ฉ ์‹คํ—˜ํ•ด๋ณด๋ฉฐ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒ€์ฆํ•˜์ง€ ๋ชปํ•œ Persistence๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋งŒ์กฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์ด Blockchain Study ์ €์žฅ์†Œ์— ์ž‘์„ฑํ•ด ๋‘์—ˆ๋‹ค.

์•ž์„  ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ ์ข€ ๋” ์ž์‹ ๊ฐ์„ ์–ป์–ด์„œ, ํ•„์ž์˜ ์˜์—ญ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๊ณ ๋ฏผํ•ด๋ณด์•˜๋‹ค. ๋‹ค์–‘ํ•œ ์ธก๋ฉด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ํ•„์ž๊ฐ€ ์ˆ˜์›”ํ•˜๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด์„œ๋„ ๋ˆˆ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์บ”๋ฒ„์Šค์— ๋งŽ์€ ์ˆ˜์˜ ํŒŒํ‹ฐํด๋“ค์„ ๋ฌด์ž‘์œ„๋กœ ์ด๋™ํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด๊ณ ์ž ํ•˜์˜€๋‹ค. ๋ Œ๋”๋ง ๋“ฑ์˜ ๊ธฐ๋ณธ ์š”์†Œ๋Š” ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์ž‘์„ฑํ•˜๊ณ  ํŒŒํ‹ฐํด์„ ์ƒ์„ฑํ•˜๊ณ  ์˜ฎ๊ธฐ๋Š” ๋ถ€๋ถ„๋งŒ ๊ฐ๊ธฐ JavaScript์™€ Rust๋กœ ์ž‘์„ฑ๋œ WebAssembly๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋‘ ์ฝ”๋“œ ๋ชจ๋‘ ์ตœ์ดˆ ๋žœ๋คํ•œ ์œ„์น˜์™€ ์†๋„๋ฅผ ๊ฐ€์ง„ ํŒŒํ‹ฐํด์„ ์ฃผ์–ด์ง„ ๊ฐœ์ˆ˜๋งŒํผ ์ƒ์„ฑํ•˜๊ณ  ์บ”๋ฒ„์Šค๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ์ ๋งˆ๋‹ค ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

const PlaygroundWasmParticlesJsOnlyPixiTemplate: FC&#x3C;PropsType> = props => {
  const { controlInfo } = props;
  const [dimensions, setDimensions] = useState&#x3C;Dimensions>(null);
  const [points, setPoints] = useState&#x3C;Point[]>([]);

  useEffect(() => {
    if (!dimensions || !controlInfo.size) {
      return;
    }
    setPoints(generatePointsByDimensions(controlInfo.size, dimensions));
  }, [dimensions, controlInfo.size]);

  const handleUpdate = useCallback(
    (points: Point[]) => {
      points.forEach(point => point.update(dimensions, points));
      return points;
    },
    [dimensions],
  );

  return (
    &#x3C;PixiView onResize={setDimensions}>
      {dimensions &#x26;&#x26; (
        &#x3C;>
          &#x3C;ReactPixiGrid dimensions={dimensions} />
          &#x3C;ReactPixiParticles dimensions={dimensions} points={points} onUpdate={handleUpdate} />
        &#x3C;/>
      )}
    &#x3C;/PixiView>
  );
};
const PlaygroundWasmParticlesRustWasmPixiTemplateInner: FC&#x3C;PropsType> = props => {
  const { controlInfo } = props;
  const { wasm } = useWasmContext();
  const [dimensions, setDimensions] = useState&#x3C;Dimensions>(null);
  const [points, setPoints] = useState&#x3C;Point[]>([]);

  useEffect(() => {
    if (!dimensions || !controlInfo.size || !wasm) {
      return;
    }
    setPoints(wasm.generate_particles(controlInfo.size, dimensions));
  }, [dimensions, controlInfo.size, wasm]);

  const handleUpdate = useCallback(
    (points: Point[]) => {
      return wasm.update_particles(dimensions, points);
    },
    [dimensions, wasm],
  );

  return (
    &#x3C;PixiView onResize={setDimensions}>
      {dimensions &#x26;&#x26; (
        &#x3C;>
          &#x3C;ReactPixiGrid dimensions={dimensions} />
          &#x3C;ReactPixiParticles dimensions={dimensions} points={points} onUpdate={handleUpdate} />
        &#x3C;/>
      )}
    &#x3C;/PixiView>
  );
};

300๊ฐœ ํŒŒํ‹ฐํด ์ •๋„์—์„œ๋Š” JavaScript์™€ WebAssembly๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ ๋ชจ๋‘ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด 60fps๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • JS with 300 Particles
  • WebAssembly with 300 Particles

ํŒŒํ‹ฐํด์˜ ๊ฐœ์ˆ˜๋ฅผ 800๊ฐœ๋กœ ๋Š˜๋ฆฌ์ž WebAssembly๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋™์ผํ•˜๊ฒŒ 60fps๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฐ˜๋ฉด์—, JavaScript๋กœ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋Š” ์„ฑ๋Šฅ์ด ๋งŽ์ด ๋–จ์–ด์ ธ 8fps๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

  • JS with 800 Particles
  • WebAssembly with 800 Particles

์˜ˆ์ œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•˜์ง€ ํ•˜๋ฉด์„œ ๋…ธ์‹ฌ์ดˆ์‚ฌํ–ˆ๋Š”๋ฐ, ๊ทธ๋Ÿฐ ๊ฑฑ์ •์ด ๋ฌผ์ƒ‰ํ•  ์ •๋„๋กœ ์ƒ๊ฐ๋ณด๋‹ค ํฐ ์ฐจ์ด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์–ธ๊ธ‰๋œ ์˜ˆ์ œ๋Š” Labs / Particles ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿš€ ๋งˆ์น˜๋ฉฐ...

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

Loading comments...

Recent Posts