러스트 (프로그래밍 언어)

최근 편집: 2022년 12월 13일 (화) 11:27
최근 버전1.44.0[1]
최근 버전 출시일2020년 6월 4일 (전)(2020-06-04)

러스트(영어: Rust)는 모질라 리서치에서 개발한 범용 프로그래밍 언어이다. "안전하고, 병렬적이며, 실용적인" 언어로 디자인되었으며,[2] 순수 함수형 프로그래밍, 액터 기반 병렬 프로그래밍, 명령형 프로그래밍, 객체 지향 프로그래밍 스타일을 지원한다.

2006년 개발자 그레이든 호아레의 개인 프로젝트로 시작되었으며, 2009년 호아레의 고용주인 모질라가 개발에 참여했다.[3] 2010년 처음으로 일반에 공개되었으며,[4] 같은 해 Objective Caml로 작성된 초기 컴파일러에서 Rust로 작성된 컴파일러로 전환되었다.[5] rustc는 2011년 처음으로 자기 자신을 컴파일하는데 성공했다.

2012년 1월 첫 번째 알파 버전인 0.1이 발표되었다.[6]

모질라의 정책[7]에 따라, 러스트는 전적으로 오픈 소스로 개발되고 있으며, 커뮤니티로부터 피드백을 받고 있다. 모질라 재단이 러스트의 개발을 후원하고 있다. 러스트의 설계에는 모질라의 렌더링 엔진인 Servo와 rustc 컴파일러를 개발하면서 쌓인 경험들이 반영되어 있다.

특징

러스트는 인터넷에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데 적합한 언어를 목표로 설계되었다. 이 목표에 따라 러스트는 안전성과 병행 프로그래밍, 그리고 메모리 관리의 직접 제어에 초점을 맞추고 있다. 또한 성능 면에서는 C++와 비슷한 수준을 목표로 하고 있다.

러스트의 문법은 중괄호로 코드 블록을 구분하고, if, else, while 등의 키워드를 사용하는 등 CC++와 유사한 모양을 하고 있다. 그러나 러스트와 C/C++는 의미상으로는 크게 다른 문법을 갖고 있다.

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

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

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

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


정치 참여

러스트 코어 팀은 기술이 언제나 정치적이었으며 앞으로도 그럴 것이라고 입장을 밝혔다. 미국과 전세계적인 경찰 폭력에 맞서는 것이 기술 지식을 공유하는 것보다 더 중요하다는데 동의하는 의미로 1.44.0 릴리즈에 대한 홍보를 크게 줄이기로 하였다고 밝혔다.[1][8]

예제

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

Hello world:

fn main() {
    println!("hello, world");
}

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

/* 이 함수는 러스트의 암묵적 반환문을 이용해 작성되었다. 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;
}

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

/* 이 함수는 각각 병렬적으로 실행되는 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는 제거되었다.

러스트를 사용하는 프로젝트

각주

출처

  1. 1.0 1.1 The Rust Core Team (2020년 6월 4일). “Announcing Rust 1.44.0”. 《Rust Blog》. 2020년 6월 5일에 확인함. 
  2. “Doc language FAQ” (영어). 2013년 4월 29일에 확인함. 
  3. “Project FAQ” (영어). 2010년 9월 14일. 2012년 1월 11일에 확인함. 
  4. “Future Tense” (영어). 2011년 4월 29일. 2012년 2월 6일에 확인함. 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. 
  5. Hoare, Graydon (2010년 10월 2일). “Rust Progress” (영어). 2013년 10월 22일에 원본 문서에서 보존된 문서. 2010년 10월 30일에 확인함. 
  6. catamorphism (2012년 1월 20일). “Mozilla and the Rust community release Rust 0.1 (a strongly-typed systems programming language with a focus on memory safety and concurrency)” (영어). 2012년 2월 6일에 확인함. 
  7. “The Mozilla Manifesto”. 2013년 4월 29일에 확인함. 
  8. @senokay (2020년 6월 5일). “@senokay 의 트윗”. 《@senokay 의 트위터》. 2020년 6월 5일에 확인함. 
  9. https://hacks.mozilla.org/2016/07/shipping-rust-in-firefox/
  10. http://www.wired.com/2016/03/epic-story-dropboxs-exodus-amazon-cloud-empire/
  11. Serdar Yegulalp (2015년 4월 3일). “Mozilla's Rust-based Servo browser engine inches forward”. 《InfoWorld》. 2016년 3월 15일에 확인함. 
  12. Frederic Lardinois (2015년 4월 3일). “Mozilla And Samsung Team Up To Develop Servo, Mozilla’s Next-Gen Browser Engine For Multicore Processors”. 《TechCrunch》. 
  13. Balbaert, Ivo. 《Rust Essentials》. Packt Publishing. 6쪽. ISBN 1785285769. 21 March 2016에 확인함. 
  14. Frank, Denis. “Using HyperLogLog to Detect Malware Faster Than Ever”. 《OpenDNS Security Labs》. 2016년 3월 19일에 확인함. 
  15. Denis, Frank. “ZeroMQ: Helping us Block Malicious Domains in Real Time”. 《OpenDNS Security Labs》. 2016년 3월 19일에 확인함. 
  16. Yegulalp, Serdar. “Rust's Redox OS could show Linux a few new tricks”. infoworld. 2016년 3월 21일에 확인함. 
  17. https://github.com/pingcap/tikv
  18. http://www.piston.rs/


외부 링크