Rust ํ์ต ๊ฐ์ด๋
์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์ ๋ฆฌ๋ Rust ํ๋ก๊ทธ๋๋ฐ ๊ฐ์ด๋
๐ ๊ธฐ์ด ๋ฌธ๋ฒ
์์ ๊ถ๊ณผ ๋น๋ฆผ โ Rust๊ฐ GC ์์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
์ปดํ์ผ ํ์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํ๋ Rust์ ํต์ฌ ๊ท์น
Rust์ ์์ ๊ถ ์์คํ ์ GC ์์ด ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ์ ๋ณด์ฅํ๋ค. ๊ฐ ํ๋์ ์์ ์ ํ๋, ๋น๋ ค์ค ๋๋ ์ฝ๊ธฐ ์ ์ฉ ์ฌ๋ฌ ๊ฐ ๋๋ ์ฐ๊ธฐ ์ ์ฉ ํ๋๋ง ํ์ฉ.
๋ผ์ดํํ์ โ Rust ์ปดํ์ผ๋ฌ๊ฐ ์ฐธ์กฐ์ ์ ํจ ๋ฒ์๋ฅผ ์ถ์ ํ๋ ๋ฐฉ๋ฒ
'a๊ฐ ๋ญ์ง ํ ๋ฒ์ ์ดํดํ๊ธฐ
๋ผ์ดํํ์์ ์ฐธ์กฐ๊ฐ ์ ํจํ ๋ฒ์๋ฅผ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ฃผ๋ ์ฃผ์์ด๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋ต(elision) ๊ฐ๋ฅํ์ง๋ง, ์ฌ๋ฌ ์ฐธ์กฐ๊ฐ ์ฝํ ๋ ๋ช ์์ ์ผ๋ก ์จ์ผ ํ๋ค.
ํจํด ๋งค์นญ โ match์ if let์ผ๋ก ๋ถ๊ธฐํ๊ธฐ
switch/case์ ์์ ํธํ, Rust ์ฝ๋์ ํต์ฌ ํํ ๋ฐฉ์
Rust์ match๋ ๊ฐ์ ๋ถํดํ๋ฉด์ ๋์์ ๋ถ๊ธฐํ๋ค. ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ๋น ์ง์์ด ์ฒ๋ฆฌํด์ผ ํ๋(exhaustive) ์ปดํ์ผ๋ฌ ๊ฐ์ ๋๋ถ์ ๋๋ฝ ์๋ ๋ถ๊ธฐ๊ฐ ๋ณด์ฅ๋๋ค.
Result์ ? ์ฐ์ฐ์ โ Rust์ ์๋ฌ ์ฒ๋ฆฌ ํจํด
try-catch ์์ด ์๋ฌ๋ฅผ ํ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
Rust์๋ ์์ธ(exception)๊ฐ ์๋ค. ๋์ Result<T, E> ํ์ ์ผ๋ก ์ฑ๊ณต/์คํจ๋ฅผ ๋ช ์ํ๊ณ , ? ์ฐ์ฐ์๋ก ์๋ฌ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ํํ๋ค.
๐งฌ ํ์ ์์คํ
Trait๊ณผ ์ ๋ค๋ฆญ โ Rust์ ๋คํ์ฑ
์ธํฐํ์ด์ค + ์ ๋ค๋ฆญ์ด ํฉ์ณ์ง Rust์ ์ถ์ํ ๋๊ตฌ
Trait์ Java์ ์ธํฐํ์ด์ค์ ๋น์ทํ์ง๋ง ๋ ๊ฐ๋ ฅํ๋ค. ์ ๋ค๋ฆญ๊ณผ ๊ฒฐํฉํ๋ฉด ์ปดํ์ผ ํ์์ ํ์ ์ด ํ์ ๋๋(monomorphization) ์ ๋ก ์ฝ์คํธ ์ถ์ํ๊ฐ ๊ฐ๋ฅํ๋ค.
Enum, Option, Result โ Rust์ ๋์์ ๋ฐ์ดํฐ ํ์
null ์๋ ์ธ๊ณ๋ฅผ ๋ง๋๋ ํ์ ์์คํ
Rust์๋ null์ด ์๋ค. ๋์ Option<T>์ด ๊ฐ์ ๋ถ์ฌ๋ฅผ, Result<T, E>๊ฐ ์ฐ์ฐ์ ์คํจ๋ฅผ ํ์ ์ผ๋ก ํํํ๋ค. enum์ด ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ์ค๊ณ๋ค.
Box, Rc, Arc, RefCell โ ์ค๋งํธ ํฌ์ธํฐ ๊ฐ์ด๋
์์ ๊ถ ๊ท์น์ ์ ์ฐํ๊ฒ ์ฐํํ๋ ๋๊ตฌ๋ค
์์ ๊ถ ๊ท์น๋ง์ผ๋ก ํด๊ฒฐ ์ ๋๋ ํจํด(์ฌ๊ท ํ์ , ๊ณต์ ์์ ๊ถ, ๋ด๋ถ ๊ฐ๋ณ์ฑ)์ด ์๋ค. ์ค๋งํธ ํฌ์ธํฐ๊ฐ ์ด ๊ฐญ์ ๋ฉ์ด๋ค.
โก ๋์์ฑ
์ค๋ ๋์ ์ฑ๋ โ ์์ ๊ถ ๊ธฐ๋ฐ ๋์์ฑ
"๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํด์ ํต์ ํ์ง ๋ง๊ณ , ํต์ ํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ผ"
Rust์ ์์ ๊ถ ์์คํ ์ data race๋ฅผ ์ปดํ์ผ ํ์์ ์ฐจ๋จํ๋ค. std::thread๋ก OS ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ , mpsc ์ฑ๋ ๋๋ Arc<Mutex>๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค.
async/await โ Rust์ ๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
Future trait ๊ธฐ๋ฐ, ๋ฐํ์ ์ ํ์ด ์์ ๋ก์ด ๋น๋๊ธฐ ๋ชจ๋ธ
Rust์ async/await๋ Future trait์ ์ปดํ์ผ๋ฌ๊ฐ ์ํ ๋จธ์ ์ผ๋ก ๋ณํํ๋ ์ ๋ก ์ฝ์คํธ ์ถ์ํ๋ค. ๋ฐํ์(tokio, async-std)์ ์ฌ์ฉ์๊ฐ ์ ํํ๋ค.
๐ง ์ค์ ํจํด
Rust๋ก ๋ง๋ค ์ ์๋ ๊ฒ๋ค โ ์ด๊ธ๋ถํฐ ์๊ธ๊น์ง ํ๋ก์ ํธ ๋ก๋๋งต
Hello World ๋ค์์ ๋ญ ๋ง๋ค์ง ๋ง๋งํ ๋
Rust ๋ฌธ๋ฒ์ ๋ฐฐ์ ๋๋ฐ ๋ญ ๋ง๋ค์ด์ผ ํ ์ง ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด. ๋์ด๋๋ณ๋ก ์ค์ ๋ก ๋ง๋ค ์ ์๋ ํ๋ก์ ํธ๋ฅผ ์ ๋ฆฌํ๋ค. CLI ๋๊ตฌ๋ถํฐ ์น ์๋ฒ, ๊ฒ์ ์์ง๊น์ง.
Rust๋ก CLI ๋๊ตฌ ๋ง๋ค๊ธฐ
clap + serde๋ก ๋น ๋ฅด๊ฒ ๋ง๋๋ ์ค์ ์ปค๋งจ๋๋ผ์ธ ๋๊ตฌ
Rust๋ CLI ๋๊ตฌ ์ ์์ ํนํ ๊ฐํ๋ค. ์ฑ๊ธ ๋ฐ์ด๋๋ฆฌ๋ก ์ปดํ์ผ๋๊ณ , ์์ ์๊ฐ์ด ๋น ๋ฅด๋ฉฐ, clap/serde ์ํ๊ณ๊ฐ ํํํ๋ค.
Rust โ WASM โ ๋ธ๋ผ์ฐ์ ์์ Rust ๋๋ฆฌ๊ธฐ
wasm-pack + wasm-bindgen์ผ๋ก JS์์ Rust ํจ์ ํธ์ถํ๊ธฐ
Rust๋ WASM ํ๊ฒ์ผ๋ก ์ปดํ์ผํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ค์ดํฐ๋ธ ์๋๋ก ์คํ๋๋ค. wasm-bindgen์ด JS โ Rust ๊ฐ ํ์ ๋ณํ์ ์๋ ์ฒ๋ฆฌํ๋ค.
FFI โ Rust์์ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถํ๊ธฐ
extern "C", bindgen, unsafe์ ์ค์ ์ฌ์ฉ๋ฒ
Rust๋ C ABI์ ์ง์ ํธํ๋๋ค. extern "C" ๋ธ๋ก์ผ๋ก C ํจ์๋ฅผ ์ ์ธํ๊ณ unsafe์์ ํธ์ถํ๋ค. VOICEVOX Engine์ด Core๋ฅผ ctypes๋ก ํธ์ถํ๋ ๊ฒ๋ ์ด ํจํด์ ์ญ๋ฐฉํฅ(RustโC ABI ๋ ธ์ถ)์ด๋ค.
๐ Rubyist๋ฅผ ์ํ Rust
๋ณ์์ ๋ถ๋ณ์ฑ โ Ruby์ ์์ ๋ก์ด ์ฌํ ๋น์ด ์ฌ๋ผ์ง ์ด์
let, mut, shadowing, const โ Ruby ๋ณ์์ 1:1 ๋น๊ต
Ruby์์ ๋ณ์๋ ์ธ์ ๋ ์ฌํ ๋นํ ์ ์๋ค. Rust๋ ๊ธฐ๋ณธ์ด ๋ถ๋ณ์ด๋ค. mut, shadowing, const์ ์ฐจ์ด๋ฅผ Ruby ์ฝ๋์ ๋น๊ตํ๋ฉฐ ์ ๋ฆฌํ๋ค.
ํ์ ์์คํ โ ๋์ ํ์ ์ ์์ ๋ฅผ ํฌ๊ธฐํ๋ฉด ์ป๋ ๊ฒ
Ruby์ duck typing vs Rust์ ์ ์ ํ์ ์ถ๋ก
Ruby๋ duck typing์ด๋ค. "quack ํ๋ฉด ์ค๋ฆฌ." Rust๋ ์ปดํ์ผ ํ์์ ๋ชจ๋ ํ์ ์ ๊ฒฐ์ ํ๋ค. ์ถ๋ก ์ด ๊ฐ๋ ฅํด์ ๋๋ถ๋ถ ์ง์ ์ธ ํ์๋ ์์ง๋ง, ํ ๋ฒ ์ ํด์ง๋ฉด ์ ๋ ์ ๋ฐ๋๋ค.
ํจ์์ ๋ฉ์๋ โ def๊ฐ fn์ด ๋๋ฉด ๋ญ๊ฐ ๋ฌ๋ผ์ง๋๊ฐ
๋ฐํ ํ์ , ์ธ๋ฏธ์ฝ๋ก , ๊ทธ๋ฆฌ๊ณ Ruby์ ๊ฐ์ "๋ง์ง๋ง ์์ด ๋ฐํ๊ฐ" ๊ท์น
Ruby์ def โ Rust์ fn. ์ธ์ ํ์ ๊ณผ ๋ฐํ ํ์ ์ ๋ช ์ํด์ผ ํ๊ณ , ์ธ๋ฏธ์ฝ๋ก ํ๋๋ก ๋ฐํ๊ฐ ์ฌ๋ถ๊ฐ ๊ฒฐ์ ๋๋ค. ๊ทธ ์ธ์๋ Ruby์ ์๊ฐ๋ณด๋ค ๋น์ทํ๋ค.
๊ตฌ์กฐ์ฒด์ impl โ Ruby์ class๊ฐ Rust์์ ๋ ์กฐ๊ฐ์ผ๋ก ๋๋๋ค
struct๋ก ๋ฐ์ดํฐ, impl๋ก ๋ฉ์๋, trait๋ก ๋คํ์ฑ
Ruby์ class๋ ๋ฐ์ดํฐ์ ๋ฉ์๋๋ฅผ ํ ๊ณณ์ ๋ฌถ๋๋ค. Rust๋ struct(๋ฐ์ดํฐ)๊ณผ impl(๋ฉ์๋)๋ก ๋ถ๋ฆฌํ๊ณ , ์์ ๋์ trait์ผ๋ก ๊ณตํต ํ์๋ฅผ ์ ์ํ๋ค.
Enum๊ณผ ํจํด ๋งค์นญ โ Symbol๊ณผ case/when์ ๊ฐ๋ ฅํ ์งํํ
Rust์ enum์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ค โ Ruby์๋ ์๋ ๊ฐ๋
Ruby์ Symbol์ด๋ ์์ ๊ทธ๋ฃน์ ํด๋นํ๋ Rust์ enum์ ๊ฐ ๋ณํ(variant)์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ค. match๋ case/when์ ๊ฐํํ์ธ๋ฐ, ๋ชจ๋ ์ผ์ด์ค๋ฅผ ๋น ์ง์์ด ์ฒ๋ฆฌํด์ผ ํ๋ค.
Option<T> โ nil์ด ์ฌ๋ผ์ง ์ธ๊ณ์์ ์ด์๋จ๊ธฐ
Ruby์ nil๊ณผ &. ์ฐ์ฐ์๊ฐ Rust์์๋ ์ด๋ป๊ฒ ๋ฐ๋๋๊ฐ
Ruby์ nil์ ์ด๋์๋ ํ์ด๋์จ๋ค. Rust์๋ nil์ด ์๋ค. ๊ฐ์ด ์์ ์ ์์ผ๋ฉด Option<T>์ ์จ์ผ ํ๊ณ , ์ปดํ์ผ๋ฌ๊ฐ None ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ๋ค.
Result์ ์๋ฌ ์ฒ๋ฆฌ โ begin/rescue๊ฐ ์ฌ๋ผ์ง ์๋ฆฌ
์์ธ ๋์ ๋ฐํ๊ฐ์ผ๋ก ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ Rust์ ๋ฐฉ์
Ruby๋ ์์ธ๋ฅผ ๋์ง๊ณ rescue๋ก ์ก๋๋ค. Rust๋ ์์ธ๊ฐ ์๋ค. ๋์ Result<T, E>๋ฅผ ๋ฐํํ๊ณ , ? ์ฐ์ฐ์๋ก ์๋ฌ๋ฅผ ์ ํํ๋ค.
์ดํฐ๋ ์ดํฐ์ ํด๋ก์ โ Rubyist๊ฐ ๊ฐ์ฅ ํธํ๊ฒ ๋๋ผ๋ ์์ญ
select/map/reduce๊ฐ filter/map/fold๋ก ๋ฐ๋์์ ๋ฟ
Ruby์ Enumerable ๋ฉ์๋๊ฐ ๊ฑฐ์ ๊ทธ๋๋ก Rust์ ์๋ค. ์ด๋ฆ๋ง ์ฝ๊ฐ ๋ค๋ฅด๊ณ ์ฒด์ด๋ ํจํด๋ ๊ฐ๋ค. Rubyist๊ฐ Rust์์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์ ์ํ๋ ๋ถ๋ถ.
String vs &str โ Ruby์๋ ์๋ ๋ฌธ์์ด์ ๋ ์ผ๊ตด
์์ ํ๋ ๋ฌธ์์ด๊ณผ ๋น๋ฆฌ๋ ๋ฌธ์์ด์ ์ฐจ์ด
Ruby์์ ๋ฌธ์์ด์ String ํ๋๋ค. Rust์๋ String(์์ )๊ณผ &str(๋น๋ฆผ) ๋ ์ข ๋ฅ๊ฐ ์๋ค. ์ฒ์์ ํผ๋์ค๋ฝ์ง๋ง, ์์ ๊ถ ๊ฐ๋ ๊ณผ ์ฐ๊ฒฐ๋๋ ํต์ฌ.
์ปฌ๋ ์ โ Array์ Hash๊ฐ Vec๊ณผ HashMap์ด ๋๋ฉด
ํ์ ์ด ๊ณ ์ ๋ ์ธ๊ณ์ ๋ฐฐ์ด๊ณผ ํด์๋งต
Ruby์ Array์ Hash๊ฐ Rust์์๋ Vec<T>์ HashMap<K, V>์ด ๋๋ค. ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ ํ ๊ฐ์ง ํ์ ๋ง ๋ด์ ์ ์๋ค๋ ๊ฒ.
์์ ๊ถ โ Ruby์ GC๊ฐ ํด์ฃผ๋ ์ผ์ ์ง์ ํ๊ธฐ
Rubyist๊ฐ ๊ฐ์ฅ ์ด๋ ค์ํ๋ Rust์ ํต์ฌ ๊ฐ๋
Ruby์์๋ GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์์ ์ ๋ฆฌํ๋ค. Rust์์๋ ์์ ๊ถ ๊ท์น์ด GC๋ฅผ ๋์ฒดํ๋ค. ๊ฐ์ ๋๊ธฐ๋ฉด ์๋ณธ์ด ์ฌ๋ผ์ง๋ move ๊ฐ๋ ์ด ํต์ฌ์ด๋ค.
Cargo โ Bundler + Rake๊ฐ ํ๋๋ก ํฉ์ณ์ง ๊ฒ
Gemfile โ Cargo.toml, bundle exec โ cargo run
Ruby ์ํ๊ณ์์ Bundler(์์กด์ฑ)์ Rake(๋น๋/ํ์คํฌ)๋ฅผ ๋ฐ๋ก ์ฐ์ง๋ง, Rust๋ Cargo ํ๋๋ก ์ ๋ถ ํ๋ค. ํ๋ก์ ํธ ์์ฑ, ๋น๋, ํ ์คํธ, ์์กด์ฑ ๊ด๋ฆฌ, ๋ฐฐํฌ๊น์ง.