Rust ์ฐ๋จนํ๊ธฐ
๐ค ์ 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
fn plus_one(x: Option<i32>) -> Option<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(&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๋ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ ๊ธฐ๋ฅ ์ด์ธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ผ ํ๋๋ฐ(์์์ ๊ฐ์ ๊ฐ์ ธ์์ผ ํ๋ ๊ฒฝ์ฐ๋ ์๊ฐ ๊ด๋ จ๋ ๋ถ๋ถ๋ค๊น์ง๋), ์ง๊ธ๊น์ง ์ฌ์ฉํด์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๋ฐฐํฌ์ผ๋ค์ด ์ค๋๋์ง ์์๊ณ ๊ธฐ๋ฅ ๋ํ ๋ถ์กฑํจ์ด ์๋ค๊ณ ๋๊ปด์ ธ์ ์ ๊ด๋ฆฌ๋๊ณ ์๋ค๋ ๋๋์ ๋ฐ์๋ค.

๋ํ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ์ธ 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<Transaction>,
/// Difficulty to generate block
pub difficulty: usize,
/// Nonce to generate block
pub nonce: usize,
}

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 `&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 < j {
// `i` is in the left half
let (left, right) = points.split_at_mut(j);
(&mut left[i], &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);
(&mut right[0], &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<PropsType> = props => {
const { controlInfo } = props;
const [dimensions, setDimensions] = useState<Dimensions>(null);
const [points, setPoints] = useState<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 (
<PixiView onResize={setDimensions}>
{dimensions && (
<>
<ReactPixiGrid dimensions={dimensions} />
<ReactPixiParticles dimensions={dimensions} points={points} onUpdate={handleUpdate} />
</>
)}
</PixiView>
);
};
const PlaygroundWasmParticlesRustWasmPixiTemplateInner: FC<PropsType> = props => {
const { controlInfo } = props;
const { wasm } = useWasmContext();
const [dimensions, setDimensions] = useState<Dimensions>(null);
const [points, setPoints] = useState<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 (
<PixiView onResize={setDimensions}>
{dimensions && (
<>
<ReactPixiGrid dimensions={dimensions} />
<ReactPixiParticles dimensions={dimensions} points={points} onUpdate={handleUpdate} />
</>
)}
</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๊ฐ์๊ฐ ์ด๋ฐ์ ๋ฐ ์ด์ ๋ก ์ฌ์ ๋กญ์ง ์์ ์๊ฐ์ด์์ง๋ง ํํ์ด ์งํํ๋ ๋ด์ฉ์ด์ด์ ๋ถ์กฑํ์ง๋ง ํ๋ฒ ๋ง์นจํ๋ฅผ ์ฐ๊ณ ๊ฐ ์ ์์์ ๊ธฐ์จ์ ๊ฐ์ถ ์ ์๋ค. ๋์ฑ์ด ๊ธฐ๋ํ๋ ๋ถ๋ถ๊น์ง ํ์ธํ ์ ์์ด์ ๋์ฑ์ด ๊ธฐ์ ๊ฒ ๊ฐ๋ค. ์ด ๊ธฐ์จ์ ์์๋ถ ์ผ์ ์์ง ๋ ๋ง์ด ํด์ผ ํ ๊ฒ๋ค, ๋ ๋ง๋ค์ด๋ด์ผ ํ ๊ฒ๋ค์ ํด๋๊ฐ๊ณ ์ ํ๋ค.