개요[편집 / 원본 편집]
Rust(러스트)는 Mozilla에서 개발한 시스템 프로그래밍 언어로, 메모리 안전성과 성능을 동시에 추구하는 것이 특징이다. C/C++의 성능을 유지하면서도 메모리 관련 오류를 컴파일 타임에 방지할 수 있도록 설계되었다.
언어 이름인 'Rust'는 곰팡이를 뜻하는 영어 단어에서 따온 것으로, 개발자들이 견고하고 내구성이 강한 언어를 만들고자 하는 의도를 담고 있다. 녹이 아니다
역사[편집 / 원본 편집]
초기 개발 (2010-2015)[편집 / 원본 편집]
Rust는 2010년에 Mozilla 직원이었던 Graydon Hoare에 의해 개시된 개인 프로젝트에서 시작되었다. Mozilla는 이 프로젝트에 관심을 보이며 2010년부터 공식적으로 후원하기 시작했다.
- 2010년 - Graydon Hoare가 개인 프로젝트로 시작
- 2011년 - 첫 번째 컴파일된 "Hello, world!" 프로그램 실행 성공
- 2012년 - 첫 번째 프리알파 릴리스 (0.1)
- 2013년 - 첫 번째 알파 릴리스 (0.6)
- 2014년 - 베타 릴리스 (0.9-0.12)
- 2015년 5월 15일 - Rust 1.0 출시
안정화 이후 (2015-현재)[편집 / 원본 편집]
특징[편집 / 원본 편집]
메모리 안전성[편집 / 원본 편집]
Rust의 가장 큰 특징은 가비지 컬렉터 없이도 메모리 안전성을 보장한다는 것이다. 이는 소유권(Ownership) 시스템을 통해 달성된다.
소유권 시스템[편집 / 원본 편집]
Rust의 소유권 시스템은 다음 세 가지 규칙을 기반으로 한다:
- 각각의 값은 소유자(owner)가 있다
- 한 번에 오직 하나의 소유자만 있을 수 있다
- 소유자가 스코프 밖으로 벗어나면, 값이 버려진다(dropped)
fn main() {
let s1 = String::from("hello");
let s2 = s1; // s1의 소유권이 s2로 이동(move)
// println!("{}", s1); // 컴파일 에러! s1은 더 이상 유효하지 않음
println!("{}", s2); // 정상 작동
}빌림(Borrowing)[편집 / 원본 편집]
소유권을 이전하지 않고 값을 참조할 수 있는 시스템이다.
- 불변 참조(&T): 여러 개 동시 존재 가능
- 가변 참조(&mut T): 한 번에 하나만 존재 가능
fn main() {
let mut s = String::from("hello");
let r1 = &s; // 불변 참조
let r2 = &s; // 불변 참조 (동시 존재 가능)
let r3 = &mut s; // 컴파일 에러! 불변 참조와 가변 참조 동시 존재 불가
}성능[편집 / 원본 편집]
Rust는 제로 비용 추상화(Zero-cost abstractions)를 목표로 한다. 이는 고수준 기능을 사용하더라도 런타임 오버헤드가 없다는 의미이다.
- 컴파일 타임 최적화: 대부분의 검사와 최적화가 컴파일 시점에 수행됨
- 인라인 최적화: 함수 호출 오버헤드 제거
- LLVM 백엔드: 강력한 코드 최적화
벤치마크 결과 C/C++와 거의 동일한 성능을 보여준다. 때로는 더 빠르기도 하다
동시성(Concurrency)[편집 / 원본 편집]
Rust는 안전한 동시성을 위한 다양한 기능을 제공한다.
스레드[편집 / 원본 편집]
use std::thread;
fn main() {
let handle = thread::spawn(|| {
for i in 1..10 {
println!("스레드에서 숫자 {}!", i);
}
});
handle.join().unwrap();
}async/await[편집 / 원본 편집]
2019년부터 안정화된 비동기 프로그래밍 지원이다.
async fn hello_world() {
println!("Hello, world!");
}
#[tokio::main]
async fn main() {
hello_world().await;
}타입 시스템[편집 / 원본 편집]
Rust는 강력한 정적 타입 시스템을 가지고 있다.
열거형(Enum)[편집 / 원본 편집]
다른 언어의 enum보다 훨씬 강력하다. 각 variant가 데이터를 가질 수 있다.
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}Option과 Result[편집 / 원본 편집]
null pointer exception을 방지하기 위해 `Option<T>` 타입을 사용한다.
enum Option<T> {
Some(T),
None,
}에러 처리를 위해서는 `Result<T, E>` 타입을 사용한다.
enum Result<T, E> {
Ok(T),
Err(E),
}패턴 매칭[편집 / 원본 편집]
`match` 표현식을 통한 강력한 패턴 매칭을 지원한다.
match some_option {
Some(x) => println!("값: {}", x),
None => println!("값 없음"),
}도구 체계(Toolchain)[편집 / 원본 편집]
Cargo[편집 / 원본 편집]
Rust의 공식 빌드 도구이자 패키지 매니저이다. npm, pip 같은 역할을 한다.
- 프로젝트 생성: `cargo new project_name`
- 빌드: `cargo build`
- 실행: `cargo run`
- 테스트: `cargo test`
- 의존성 관리: `Cargo.toml` 파일을 통해 관리
Crates.io[편집 / 원본 편집]
Rust 패키지 저장소로, npm registry의 Rust 버전이라고 볼 수 있다. 2025년 현재 10만 개 이상의 크레이트가 등록되어 있다.
rustfmt[편집 / 원본 편집]
Rust 코드 자동 포맷팅 도구이다. 일관된 코드 스타일을 유지할 수 있게 해준다.
clippy[편집 / 원본 편집]
Rust 린터(linter)로, 코드의 품질을 높이고 일반적인 실수를 방지하는 데 도움을 준다.
cargo clippyrustup[편집 / 원본 편집]
Rust 툴체인 관리자이다. 여러 버전의 Rust를 설치하고 관리할 수 있다.
에디션(Edition)[편집 / 원본 편집]
Rust는 하위 호환성을 유지하면서도 언어를 발전시키기 위해 에디션 시스템을 도입했다.
Rust 2015[편집 / 원본 편집]
첫 번째 에디션으로, Rust 1.0이 출시된 2015년의 언어 사양이다.
Rust 2018[편집 / 원본 편집]
- 모듈 시스템 개선
- NLL(Non-Lexical Lifetimes) 도입
- dyn Trait 문법 도입
- async/await 기초 작업
Rust 2021[편집 / 원본 편집]
- 디스조인트 캡처(Disjoint captures) 개선
- IntoIterator for arrays 추가
- Cargo resolver version 2 기본값으로 설정
생태계[편집 / 원본 편집]
웹 개발[편집 / 원본 편집]
시스템 프로그래밍[편집 / 원본 편집]
- Redox: Rust로 작성된 운영체제
- Servo: Rust로 작성된 웹 브라우저 엔진
- Firecracker: AWS의 마이크로VM 모니터
게임 개발[편집 / 원본 편집]
- Bevy: 모던 게임 엔진
- Macroquad: 간단한 크로스 플랫폼 게임 라이브러리
- Godot-rust: Godot 엔진용 Rust 바인딩
CLI 도구[편집 / 원본 편집]
크로스 컴파일[편집 / 원본 편집]
Rust는 크로스 컴파일을 잘 지원한다. 한 플랫폼에서 다른 플랫폼용 바이너리를 생성할 수 있다.
# Windows용 바이너리를 Linux에서 빌드
cargo build --target x86_64-pc-windows-gnu지원하는 플랫폼:
- Windows (x86, x86_64, ARM64)
- macOS (x86_64, ARM64)
- Linux (x86, x86_64, ARM, ARM64)
- FreeBSD, OpenBSD, NetBSD
- Android, iOS
- WebAssembly
WebAssembly[편집 / 원본 편집]
Rust는 WebAssembly(WASM) 타겟을 일급 시민으로 지원한다. 웹 브라우저에서 네이티브 수준의 성능으로 Rust 코드를 실행할 수 있다.
# WASM 타겟 추가
rustup target add wasm32-unknown-unknown
# WASM으로 컴파일
cargo build --target wasm32-unknown-unknown관련 도구:
- wasm-pack: Rust-generated WebAssembly 패키징 도구
- wasm-bindgen: JavaScript와 Rust 간의 고수준 바인딩
메모리 모델[편집 / 원본 편집]
스택과 힙[편집 / 원본 편집]
Rust는 스택과 힙을 명확히 구분한다.
- 스택: 빠른 접근, 자동 정리, 크기 제한
- 힙: 동적 할당, 수동 관리 필요, 크기 제한 없음
Box<T>[편집 / 원본 편집]
힙에 데이터를 할당하기 위한 스마트 포인터이다.
let b = Box::new(5);
println!("b = {}", b);Rc<T>와 Arc<T>[편집 / 원본 편집]
- Rc<T>: Reference Counted, 단일 스레드용
- Arc<T>: Atomically Reference Counted, 멀티 스레드용
use std::rc::Rc;
let rc_examples = Rc::new("참조 카운팅");
let rc1 = Rc::clone(&rc_examples);
let rc2 = Rc::clone(&rc_examples);매크로 시스템[편집 / 원본 편집]
Rust는 강력한 매크로 시스템을 제공한다.
선언적 매크로[편집 / 원본 편집]
`macro_rules!`를 사용하여 정의한다.
macro_rules! vec {
( $( $x:expr ),* ) => {
{
let mut temp_vec = Vec::new();
$(
temp_vec.push($x);
)*
temp_vec
}
};
}절차적 매크로[편집 / 원본 편집]
더 복잡한 코드 생성이 가능하다.
- Derive 매크로: `#[derive(Debug)]`
- Attribute-like 매크로: `#[route(GET, "/")]`
- Function-like 매크로: `sql!(...)`
테스트[편집 / 원본 편집]
Rust는 내장 테스트 프레임워크를 제공한다.
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert_eq!(result, 4);
}
#[test]
#[should_panic]
fn another() {
panic!("이 테스트는 패닉해야 합니다");
}
}문서 테스트[편집 / 원본 편집]
독특하게도 문서 내의 예제 코드도 테스트할 수 있다.
/// 두 수를 더하는 함수
///
/// # Examples
///
/// ```
/// assert_eq!(add(2, 3), 5);
/// ```
fn add(a: i32, b: i32) -> i32 {
a + b
}성능 특성[편집 / 원본 편집]
벤치마크 결과[편집 / 원본 편집]
다양한 벤치마크에서 Rust는 C/C++와 비슷한 성능을 보여준다.
- 메모리 사용량: C/C++와 유사
- 실행 속도: C/C++의 95-105% 수준
- 컴파일 속도: C++보다 빠름, Go보다 느림
최적화[편집 / 원본 편집]
- LTO(Link Time Optimization) 지원
- PGO(Profile Guided Optimization) 지원
- SIMD 명령어 활용 가능
- 커뮤니티와 거버넌스 ==
Rust Foundation[편집 / 원본 편집]
2020년에 설립된 비영리 재단으로, Rust 언어의 발전을 지원한다.
창립 멤버:
- Mozilla
- AWS
- Huawei
- Microsoft
RFC 프로세스[편집 / 원본 편집]
Rust는 RFC(Request for Comments) 프로세스를 통해 언어 변경사항을 결정한다. 누구나 RFC를 제출할 수 있으며, 공개적인 토론을 거쳐 결정된다.
행동 강령[편집 / 원본 편집]
Rust 커뮤니티는 포용적이고 환영하는 환경을 조성하기 위해 엄격한 행동 강령을 유지한다.
학습 자료[편집 / 원본 편집]
공식 자료[편집 / 원본 편집]
- The Rust Programming Language (일명 "The Book"): 공식 튜토리얼
- Rust by Example: 예제 중심 학습서
- The Cargo Book: Cargo 가이드
- The Rustonomicon: 고급 및 unsafe Rust 가이드
한국어 자료[편집 / 원본 편집]
- 러스트 프로그래밍 공식 가이드 (한빛미디어)
- 러스트 프로그래밍 (인사이트)
- 다양한 온라인 번역본들
비판과 한계[편집 / 원본 편집]
학습 곡선[편집 / 원본 편집]
Rust는 학습하기 어려운 언어로 유명하다. 특히 소유권 시스템은 기존 언어에 익숙한 개발자에게 새로운 개념이다.
- 빌림 검사기(borrow checker)와의 싸움: "Fighting the borrow checker"라는 표현이 있을 정도
- 라이프타임 개념의 복잡성
- async 프로그래밍의 복잡성
컴파일 시간[편집 / 원본 편집]
복잡한 타입 검사와 최적화로 인해 컴파일 시간이 긴 편이다. 특히 대형 프로젝트에서는 상당한 시간이 소요된다.
생태계[편집 / 원본 편집]
비교적 새로운 언어이기 때문에 일부 영역에서는 라이브러리가 부족할 수 있다. 하지만 빠르게 발전하고 있다.
미래 전망[편집 / 원본 편집]
채택 현황[편집 / 원본 편집]
- Microsoft: Windows 커널 일부를 Rust로 재작성
- Google: Android 시스템 컴포넌트에 Rust 도입
- Facebook: Libra(Diem) 블록체인을 Rust로 개발
- Dropbox: 스토리지 시스템을 Rust로 재작성
- Cloudflare: 다양한 서비스에 Rust 활용
향후 계획[편집 / 원본 편집]
- GAT(Generic Associated Types) 완전 안정화
- async 생태계 개선
- compile time 단축
- IDE 지원 개선
관련 언어[편집 / 원본 편집]
여담[편집 / 원본 편집]
- Rust의 마스코트는 Ferris the Crab(게)이다. 🦀 이모지로도 유명하다.
- Rewrite it in Rust는 Rust 커뮤니티의 유명한 밈이다.
모든 것을 Rust로 다시 써야 한다 - rustacean은 Rust 개발자를 지칭하는 단어다. crustacean(갑각류)에서 따온 것.
- Rust 1.0 출시일인 5월 15일은 비공식적으로 "Rust Day"로 불린다.
- 무어헤드 행성인들이 Rust를 개발했다는 농담이 있다.
소유권 시스템이 외계 기술인 것 같기 때문