{{위키데이터 속성 추적}}
{{프로그래밍 언어 정보
|이름 = 러스트<br />Rust
|로고 = Rust programming language black logo.svg
|로고크기 = 150px
|패러다임 = [[컴파일]], [[병행 컴퓨팅|병행]], [[함수형 프로그래밍|함수형]], [[명령형 프로그래밍|명령형]], [[객체 지향 프로그래밍|객체 지향]], [[구조적 프로그래밍|구조적]]
|연도 = 2010년
|설계자 = 그레이든 호아레 (Graydon Hoare)
|개발자 = [[모질라]]
|최근 버전 = {{wikidata|property|edit|reference|P548=Q2804309|P348}}
|최근 버전 출시일 = {{wikidata|qualifier|P548=Q2804309|P348|P577}} ({{Time ago| {{wikidata|qualifier|raw|P548=Q2804309|P348|P577}} }})
|미리보기 버전 = 
|미리보기 버전 발표일 = 
|형 체계 = static, strong, inferred, structural
|구현체 = rustc
|방언 = 
|영향을 받은 언어 = Alef, [[C++]], [[Objective Caml]], [[리스프]], [[얼랭]], [[하스켈]], Hermes, Limbo, Napier, Newsqueak, NIL, Sather, [[ML (프로그래밍 언어)|ML]], [[C 샤프|C#]]
|운영 체제 = [[리눅스]], [[macOS]], [[FreeBSD]], [[마이크로소프트 윈도우]], 안드로이드, iOS (부분적 지원)
|라이선스 = [[아파치 라이선스|아파치 라이선스 2.0]], [[MIT 허가서]]
|웹사이트 = http://rust-lang.org
}}

'''러스트'''({{llang|en|Rust}})는 [[모질라]] 리서치에서 개발한 [[다중 패러다임 프로그래밍 언어|다중 패러다임]], [[범용 프로그래밍 언어]]이다. "안전하고, 병렬적이며, 실용적인" 언어로 디자인되었으며,<ref name="language-faq">{{웹 인용|url=https://github.com/mozilla/rust/wiki/Doc-language-FAQ|제목=Doc language FAQ|확인날짜=2013-04-29|언어=en}}</ref> [[함수형 프로그래밍|순수 함수형 프로그래밍]], 액터 기반 병렬 프로그래밍, [[명령형 프로그래밍]], [[객체 지향 프로그래밍]] 스타일을 지원한다.

2006년 개발자 그레이든 호아레의 개인 프로젝트로 시작되었으며, 2009년 호아레의 고용주인 모질라가 개발에 참여했다.<ref name="proj-faq">{{웹 인용|url=https://github.com/mozilla/rust/wiki/Doc-project-FAQ|제목=Project FAQ|날짜=2010-09-14|확인날짜=2012-01-11|언어=en}}</ref> 2010년 처음으로 일반에 공개되었으며,<ref name="future-tense">{{웹 인용|url=http://www.slideshare.net/BrendanEich/future-tense-7782010|제목=Future Tense|날짜=2011-04-29|확인날짜=2012-02-06|언어=en|인용문=At Mozilla Summit 2010, we launched Rust, a new programming language motivated by safety and concurrency for parallel hardware, the “manycore” future which is upon us.}}</ref> 같은 해 [[Objective Caml]]로 작성된 초기 컴파일러에서 Rust로 작성된 컴파일러로 전환되었다.<ref name="rust-in-rust">{{웹 인용|url=http://blog.mozilla.com/graydon/2010/10/02/rust-progress/|제목=Rust Progress|성=Hoare|이름=Graydon|날짜=2010-10-02|확인날짜=2010-10-30|언어=en|보존url=https://web.archive.org/web/20131022063015/https://blog.mozilla.org/graydon/2010/10/02/rust-progress/|보존날짜=2013-10-22|url-status=dead}}</ref> ''rustc''는 2011년 처음으로 자기 자신을 컴파일하는데 성공했다.

2012년 1월 첫 번째 알파 버전인 0.1이 발표되었다.<ref name="rustc-0.1">{{웹 인용|url=http://www.reddit.com/r/programming/comments/opgxd/mozilla_and_the_rust_community_release_rust_01_a/|제목=Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency)|저자=catamorphism|날짜=2012-01-20|확인날짜=2012-02-06|언어=en}}</ref>

모질라의 정책<ref name="moz-manifesto">{{웹 인용|url=http://www.mozilla.org/about/manifesto.ko.html|제목=The Mozilla Manifesto|확인날짜=2013-04-29}}</ref>에 따라, 러스트는 전적으로 오픈 소스로 개발되고 있으며, 커뮤니티로부터 피드백을 받고 있다. 모질라 재단이 러스트의 개발을 후원하고 있다. 러스트의 설계에는 모질라의 렌더링 엔진인 [[서보 (레이아웃 엔진)|서보]]와 rustc 컴파일러를 개발하면서 쌓인 경험들이 반영되어 있다.

== 빌드시스템 ==
[[카고 (소프트웨어)|카고]](cargo)는 러스트의 [[빌드 자동화|빌드 시스템]]이다.<ref>(러스트공식가이드)https://jpub.tistory.com/980</ref><ref>[참고](The Rust Programming Language,Nicholas Matsakis와 Aaron Turon)https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html</ref> 러스트는 CPU 병행처리 및 메모리 자원 누수 방지등의 언어 철학 바탕위에 설계된 취지에 맞게 안전성으로 제작된 프로그램은 빌드 과정에서 사전에 불안정한 결과를 방지할 수 있다는 빌드시스템으로까지 이어지는 완전한 안정성을 실현하고 있다.

== 특징 ==
러스트는 [[인터넷]]에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데 적합한 언어를 목표로 설계되었다. 이 목표에 따라 러스트는 안전성과 [[병행 프로그래밍]], 그리고 메모리 관리의 직접 제어에 초점을 맞추고 있다. 또한 성능 면에서는 [[C++]]와 비슷한 수준을 목표로 하고 있다. 미국 국토안보부에서도 이러한 점을 이유로 러스트, 고, C#의 안전한 언어로 전환을 권고했다.<ref>{{웹 인용|url=https://n.news.naver.com/mnews/article/092/0002273476?sid=105|제목=美 국가안보국, C/C++ 대신 러스트·고·C# 사용 권고|성=기자|이름=남혁우|언어=ko|확인날짜=2022-11-22}}</ref>

러스트의 문법은 중괄호로 코드 블록을 구분하고, <code>if</code>, <code>else</code>, <code>while</code> 등의 키워드를 사용하는 등 [[C (프로그래밍 언어)|C]] 및 [[C++]]와 유사한 모양을 하고 있다. 그러나 러스트와 C/C++는 의미상으로는 크게 다른 문법을 갖고 있다.

러스트는 메모리 오류를 발생시키지 않도록 설계되었다. 러스트는 널 포인터나 초기화되지 않은 포인터가 존재하지 않도록 강제하고 있다. 모든 변수는 초기값을 가지고 할당되며, 해제된 포인터에 접근하는 코드는 컴파일러가 미리 감지하여 컴파일 오류를 일으킨다.

타입 시스템은 [[하스켈]]의 영향을 받아 타입 클래스를 지원한다. 또한, 변수 선언 시 타입을 지정하지 않아도 컴파일러가 타입 추론을 통해 해당 변수의 타입을 지정할 수 있다. 반면 함수의 인자나 반환값에서는 타입 정보를 빼놓을 수 없다.

병행 프로그래밍은 [[얼랭]]과 유사한 actor 기반의 모델을 사용하고 있다. 각각의 태스크는 데이터를 직접 공유하지 않고 메시지 전달을 통해서만 데이터를 교환할 수 있다. 메시지를 복사할 때 생기는 성능 저하를 막기 위해, unique box의 경우 데이터 복사 없이 메시지를 전달할 수 있다. unique box는 하나의 객체만이 소유할 수 있고, 다른 태스크로 전달될 경우 데이터 복사 없이 소유권만 바뀌게 된다.

객체 시스템은 implementation, trait, struct 또는 enum으로 이루어져 있다. <code>struct</code> 또는 <code>enum</code>은 객체의 데이터를 정의하는데 사용되며, <code>impl</code> 키워드로 정의하는 implementation은 객체의 멤버 함수를 정의하는데 사용된다. 객체의 상속은 <code>trait</code>을 통해 이루어지며, [[C++]]의 다형 상속 문제를 회피하기 위해 trait은 객체의 멤버를 정의할 수 없도록 만들어져 있다.

== 예제 ==
아래 코드는 러스트 1.0 기준이며, 러스트의 문법은 향후 변경될 수 있다.

Hello world:

<syntaxhighlight lang="rust">
fn main() {
    println!("hello, world");
}
</syntaxhighlight>

아래는 각각 [[재귀함수]]와 반복문을 사용해 작성된 [[계승 (수학)|계승]] 함수이다:

<syntaxhighlight lang="rust">
/* 이 함수는 러스트의 암묵적 반환문을 이용해 작성되었다. C 스타일 언어들과 달리
   러스트의 `if` 문은 선언문이 아닌 표현식이므로, `if` 문에도 반환값이 존재한다. */
fn recursive_factorial(n: isize) -> isize {
    if n <= 1 { 1 }
    else { n * recursive_factorial(n-1) }
}

fn iterative_factorial(n: isize) -> isize {
    // `mut` 키워드는 값이 바뀔 수 있는 변수를 가리킨다.
    let mut i = 1;
    let mut result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result; // 위의 예제와 달리 명시적 반환문을 사용한다
}

fn foreach_factorial(n: isize) -> isize {
    // 1.21 버전부터는 for_each가 가능해졌다.
    let mut result = 1;
    (1..n+1).for_each(|i| result *= i);
    return result;
}
</syntaxhighlight>

다음은 러스트의 병행 프로그래밍 기능을 보여주는 예제이다.

<syntaxhighlight lang="rust">
/* 이 함수는 각각 병렬적으로 실행되는 10개의 스레드를 만든다. 이 함수를 실행하면
   각각의 스레드가 stdout에 접근을 시도함에 따라, 한 행에 여러 문자열이 섞여서
   표시될 수 있다 */
use std::thread;
fn main() {
    // 변수 message는 변경이 불가능하므로, 여러 개의 태스크에서 동시에 접근해도 안전하다.
    let message = "Hello";
    let mut threads = Vec::new();
    // `for` 반복문은 `Iterator` trait을 구현하는 어떤 객체에 대해서나 사용할 수 있다.
    for num in 0..10 {
        // `thread::spawn`을 통해 스레드를 생성한다.
        threads.push(thread::spawn(move || {
            // println! 은 매크로이며, 컴파일 시간에 변수의 형 검사가 이루어진다.
            // C나 C++의 단순한 코드 치환 매크로와 달리, 러스트의 매크로는 Scheme과 유사한 구조적 매크로이다.
            println!("{} from task {:?}.", message, num);
        }));
    }

    // 각 스레드가 끝날 때까지 기다린다.
    for thread in threads {
        thread.join().unwrap();
    }
}
</syntaxhighlight>

== 언어의 진화 ==
러스트 0.4 이전 버전은 정적 타입 검사에 더해 타입 상태 분석 기능을 지원하였다. 타입 상태 분석 기능은 선언문 전후에 <code>check</code> 키워드를 사용하여 해당 선언문이 의도대로 동작하는지 컴파일시에 검사할 수 있었다. 그러나 이 기능은 실질적으로 거의 사용되지 않아 제거되었다.

객체 시스템은 러스트 0.2에서 0.4에 거쳐 많은 변화를 겪었다. 러스트 0.2는 처음으로 클래스를 도입하였고, 0.3에는 [[소멸자 (컴퓨터 프로그래밍)|소멸자]]와 인터페이스가 도입되었다. 그러나 0.4에 trait 기능이 도입되면서 인터페이스는 trait와 통합되었고, class는 제거되었다.

== 러스트를 사용하는 서비스 ==
* [[파이어폭스]]<ref>https://hacks.mozilla.org/2016/07/shipping-rust-in-firefox/</ref>
* 매직 포켓&nbsp;– 드롭박스의 파일 스토리지 시스템.<ref>http://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/</ref>
* [[서보 (레이아웃 엔진)|서보]]&nbsp;– 모질라의 새 병렬 렌더링 엔진<ref>{{뉴스 인용 |url=http://www.infoworld.com/article/2905688/applications/mozillas-rust-based-servo-browser-engine-inches-forward.html |author=Serdar Yegulalp |date=3 April 2015 |title=Mozilla's Rust-based Servo browser engine inches forward |work=InfoWorld |access-date=2016-03-15}}</ref>으로, [[삼성]]과 함께 개발되고 있음.<ref>{{뉴스 인용 |url=http://techcrunch.com/2013/04/03/mozilla-and-samsung-collaborate-on-servo-mozillas-next-gen-browser-engine-for-tomorrows-multicore-processors/ |author=Frederic Lardinois |date=3 April 2015 |title=Mozilla And Samsung Team Up To Develop Servo, Mozilla’s Next-Gen Browser Engine For Multicore Processors |work=TechCrunch }}</ref>
* [[OpenDNS]]&nbsp;– 구성 요소 중 2개에 러스트를 사용하고 있음.<ref>{{서적 인용|last1=Balbaert|first1=Ivo|title=Rust Essentials|publisher=Packt Publishing|isbn=1785285769|pages=6|url=https://books.google.ca/books?id=TeiuCQAAQBAJ&pg=PA6&lpg=PA6&dq=OpenDNS+Rust&source=bl&ots=UL5thAAi8w&sig=Wf-Z5xSRYU-IXyGiyIl2FVEQWEc&hl=en&sa=X&ved=0ahUKEwizzdSk59LLAhVpnoMKHWdbDrQQ6AEINzAF#v=onepage&q=OpenDNS%20Rust&f=false|accessdate=21 March 2016}}</ref><ref>{{웹 인용|last1=Frank|first1=Denis|title=Using HyperLogLog to Detect Malware Faster Than Ever|url=https://labs.opendns.com/2013/12/05/hyperloglog-and-malware-detection/|website=OpenDNS Security Labs|accessdate=19 March 2016|archive-date=2016-06-03|archive-url=https://web.archive.org/web/20160603035129/https://labs.opendns.com/2013/12/05/hyperloglog-and-malware-detection/|url-status=dead}}</ref><ref>{{웹 인용|last1=Denis|first1=Frank|title=ZeroMQ: Helping us Block Malicious Domains in Real Time|url=https://labs.opendns.com/2013/10/04/zeromq-helping-us-block-malicious-domains/|website=OpenDNS Security Labs|accessdate=19 March 2016|archive-date=2016-06-30|archive-url=https://web.archive.org/web/20160630043417/https://labs.opendns.com/2013/10/04/zeromq-helping-us-block-malicious-domains/|url-status=dead}}</ref>
* [[레독스 OS]]&nbsp;– 러스트로 개발 중인 [[마이크로커널]] [[운영 체제]].<ref>{{뉴스 인용|last1=Yegulalp|first1=Serdar|title=Rust's Redox OS could show Linux a few new tricks|url=http://www.infoworld.com/article/3046100/open-source-tools/rusts-redox-os-could-show-linux-a-few-new-tricks.html|accessdate=21 March 2016|publisher=infoworld}}</ref>
* [[TiKV]]&nbsp;– 러스트로 구동되는 분산 [[키 값 데이터베이스]].<ref>https://github.com/pingcap/tikv</ref>
* Piston&nbsp;– 모듈식 [[게임 엔진]]<ref>http://www.piston.rs/</ref>
* [[디스코드 (소프트웨어)|디스코드]] — 러스트로 백엔드가 구동되는 채팅 소프트웨어<ref>{{웹 인용|url=https://blog.discord.com/why-discord-is-switching-from-go-to-rust-a190bbca2b1f |title=Why Discord is switching from Go to Rust |date=2020-02-04 |first=Jesse |last=Howarth |access-date=2020-04-14}}</ref>
* [https://deno.land/ Deno] – V8을 기반으로 하는 [[자바스크립트]] 및 [[타입스크립트]] 런타임

== 온라인 실행 테스트 ==
러스트 공식홈페이지에서는 '플레이그라운드'(playground) 페이지를 통해서 실시간 빌드 및 실행 테스트 공간을 제공하고있다.<ref>(러스트 - 플레이그라운드)https://play.rust-lang.org/</ref>

== 러스트 파운데이션 ==
러스트 파운데이션(Rust Foundation)은 참여형 대규모 오픈 소스 생태계를 유지하고 성장시키는 새로운 접근 방식으로 "좋은 소프트웨어는 행복하고 잘 지원되는 사람들에 의해 만들어집니다"라는 모토를 갖고서  러스트(Rust) 프로그래밍 언어와 생태계를 관리하는 독립적인 비영리 조직으로, 프로젝트를 관리하고 개발하는 유지 관리자를 지원하는 데 중점을 두고 있다.<ref>(Rust Foundation - official site) https://foundation.rust-lang.org/</ref> 창립 멤버로는 [[구글]], [[마이크로소프트]], [[모질라 재단]], [[아마존 웹 서비스]], [[화웨이]]이다.

== 같이 보기 ==
* [[프로그래밍 언어의 비교]]
* [[프로그래밍 언어의 역사]]
* [[프로그래밍 언어 목록]]
== 각주 ==
{{각주}}

== 외부 링크 ==
* {{공식 웹사이트}}
* {{GitHub|rust-lang|Rust-lang}}
* [http://rust-kr.org/ 한국 러스트 사용자 그룹]

{{프로그래밍 언어}}
{{모질라}}
{{전거 통제}}

[[분류:코드 예시에 관한 문서]]
[[분류:함수형 프로그래밍 언어]]
[[분류:모질라]]
[[분류:다중 패러다임 프로그래밍 언어]]
[[분류:절차적 프로그래밍 언어]]
[[분류:2012년 개발된 프로그래밍 언어]]
[[분류:시스템 프로그래밍 언어]]
[[분류:자유 소프트웨어 프로젝트]]
[[분류:아파치 라이선스 소프트웨어]]
[[분류:MIT 라이선스 소프트웨어]]
[[분류:자유 컴파일러와 인터프리터]]
[[분류:패턴 매칭 프로그래밍 언어]]
[[분류:병행 프로그래밍 언어]]
[[분류:정적 타입 프로그래밍 언어]]
[[분류:고급 프로그래밍 언어]]