러스트 ()는 모질라 리서치에서 개발한 범용 프로그래밍 언어이다. "안전하고, 병렬적이며, 실용적인" 언어로 디자인되었으며, 순수 함수형 프로그래밍, 액터 기반 병렬 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍 스타일을 지원한다. 2006년 개발자 그레이든 호아레의 개인 프로젝트로 시작되었으며, 2009년 호아레의 고용주인 모질라가 개발에 참여했다. 2010년 처음으로 일반에 공개되었으며, 같은 해 Objective Caml로 작성된 초기 컴파일러에서 Rust로 작성된 컴파일러로 전환되었다. rustc 는 2011년 처음으로 자기 자신을 컴파일하는데 성공했다. 2012년 1월 첫 번째 알파 버전인 0.1이 발표되었다. 모질라의 정책에 따라, 러스트는 전적으로 오픈 소스로 개발되고 있으며, 커뮤니티로부터 피드백을 받고 있다. 모질라 재단이 러스트의 개발을 후원하고 있다. 러스트의 설계에는 모질라의 렌더링 엔진인 Servo와 rustc 컴파일러를 개발하면서 쌓인 경험들이 반영되어 있다. 러스트는 인터넷에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데 적합한 언어를 목표로 설계되었다. 이 목표에 따라 러스트는 안전성과 병행 프로그래밍, 그리고 메모리 관리의 직접 제어에 초점을 맞추고 있다. 또한 성능 면에서는 C++와 비슷한 수준을 목표로 하고 있다. 러스트의 문법은 중괄호로 코드 블록을 구분하고, if, else, while 등의 키워드를 사용하는 등 C 및 C++와 유사한 모양을 하고 있다. 그러나 러스트와 C/C++는 의미상으로는 크게 다른 문법을 갖고 있다. 러스트는 메모리 오류를 발생시키지 않도록 설계되었다. 러스트는 널 포인터나 초기화되지 않은 포인터가 존재하지 않도록 강제하고 있다. 모든 변수는 초기값을 가지고 할당되며, 해제된 포인터에 접근하는 코드는 컴파일러가 미리 감지하여 컴파일 오류를 일으킨다. 타입 시스템은 하스켈의 영향을 받아 타입 클래스를 지원한다. 또한, 변수 선언 시 타입을 지정하지 않아도 컴파일러가 타입 추론을 통해 해당 변수의 타입을 지정할 수 있다. 반면 함수의 인자나 반환값에서는 타입 정보를 빼놓을 수 없다. 병행 프로그래밍은 얼랭과 유사한 actor 기반의 모델을 사용하고 있다. 각각의 태스크는 데이터를 직접 공유하지 않고 메시지 전달을 통해서만 데이터를 교환할 수 있다. 메시지를 복사할 때 생기는 성능 저하를 막기 위해, unique box의 경우 데이터 복사 없이 메시지를 전달할 수 있다. unique box는 하나의 객체만이 소유할 수 있고, 다른 태스크로 전달될 경우 데이터 복사 없이 소유권만 바뀌게 된다. 객체 시스템은 implementation, trait, struct 또는 enum으로 이루어져 있다. struct 또는 enum은 객체의 데이터를 정의하는데 사용되며, impl 키워드로 정의하는 implementation은 객체의 멤버 함수를 정의하는데 사용된다. 객체의 상속은 trait을 통해 이루어지며, C++의 다형 상속 문제를 회피하기 위해 trait은 객체의 멤버를 정의할 수 없도록 만들어져 있다. 아래 코드는 러스트 1.0 기준이며, 러스트의 문법은 향후 변경될 수 있다. Hello world fn main() { println!("hello, world"); } 아래는 각각 재귀함수와 반복문을 사용해 작성된 계승 함수이다 / 이 함수는 러스트의 암묵적 반환문을 이용해 작성되었다. C 스타일 언어들과 달리 러스트의 `if` 문은 선언문이 아닌 표현식이므로, `if` 문에도 반환값이 존재한다. */ fn recursive_factorial(n isize) -> isize { if n isize { // `mut` 키워드는 값이 바뀔 수 있는 변수를 가리킨다. let mut i = 1; let mut result = 1; while i isize { // 1.21 버전부터는 for_each가 가능해졌다. let mut result = 1; (1..n+1).for_each(|i| result *= i); return result; } 다음은 러스트의 병행 프로그래밍 기능을 보여주는 예제이다. / 이 함수는 각각 병렬적으로 실행되는 10개의 태스크를 만든다. 이 함수를 실행하면 각각의 태스크가 stdout에 접근을 시도함에 따라, 한 행에 여러 문자열이 섞여서 표시될 수 있다 */ use std::thread::Thread; fn main() { // 변수 message는 변경이 불가능하므로, 여러 개의 태스크에서 동시에 접근해도 안전하다. let message = "Hello"; let mut threads = Vec::new(); // `for` 반복문은 `Iterator` trait을 구현하는 어떤 객체에 대해서나 사용할 수 있다. for num in 0..10 { threads.push(Thread::scoped(move { // println! 은 매크로이며, 컴파일 시간에 변수의 형 검사가 이루어진다. // C나 C++의 단순한 코드 치환 매크로와 달리, 러스트의 매크로는 Scheme과 유사한 구조적 매크로이다. println!("{} from task {:?}.", message, num); })); } } 러스트 0.4 이전 버전은 정적 타입 검사에 더해 타입 상태 분석 기능을 지원하였다. 타입 상태 분석 기능은 선언문 전후에 check 키워드를 사용하여 해당 선언문이 의도대로 동작하는지 컴파일시에 검사할 수 있었다. 그러나 이 기능은 실질적으로 거의 사용되지 않아 제거되었다. 객체 시스템은 러스트 0.2에서 0.4에 거쳐 많은 변화를 겪었다. 러스트 0.2는 처음으로 클래스를 도입하였고, 0.3에는 소멸자와 인터페이스가 도입되었다. 그러나 0.4에 trait 기능이 도입되면서 인터페이스는 trait와 통합되었고, class는 제거되었다. 파이어폭스 매직 포켓 – 드롭박스의 파일 스토리지 시스템. 서보 – 모질라의 새 병렬 렌더링 엔진으로, 삼성과 함께 개발되고 있음. 카고 - 러스트의 빌드 시스템 OpenDNS – 구성 요소 중 2개에 러스트를 사용하고 있음. 레독스 OS – 러스트로 개발 중인 마이크로커널 운영 체제. TiKV – 러스트로 구동되는 분산 키 값 데이터베이스. Piston – 모듈식 게임 엔진 공식 홈페이지 Rust 언어 위키 메일링 리스트 공식 소스 코드 저장소 한국 러스트 사용자 그룹 분류:코드 예시에 관한 문서 분류:함수형 프로그래밍 언어 분류:모질라 분류:다중 패러다임 프로그래밍 언어 분류:절차적 프로그래밍 언어 분류:2012년 개발된 프로그래밍 언어 분류:시스템 프로그래밍 언어 분류:자유 소프트웨어 프로젝트 분류:아파치 라이선스 소프트웨어 분류:MIT 라이선스 소프트웨어