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

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
러스트(Rust)
패러다임 컴파일, 병행, 함수형, 명령형, 객체 지향, 구조적
발표년도 2010년
설계자 그레이든 호아레
개발자 모질라
미리보기 버전 [1]
자료형 체계 static, strong, inferred, structural
주요 구현체 rustc
영향을 받은 언어 Alef, C++, Objective Caml, 리스프, 얼랭, 하스켈, Hermes, Limbo, Napier, Newsqueak, NIL, Sather, ML, C#
운영 체제 리눅스, 맥 OS X, FreeBSD, 마이크로소프트 윈도
라이선스 아파치 라이선스 2.0, MIT 허가서
웹사이트 http://rust-lang.org

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

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

2012년 1월 첫 번째 알파 버전인 0.1이 발표되었다.[5] 현재 최신 버전은 2014년 7월에 발표된 0.11 버전이다.

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

특징[편집]

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

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

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

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

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

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

예제[편집]

아래 코드는 Rust 0.6 기준이며, Rust의 문법은 향후 바뀔 수 있다.

Hello world:

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

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

/* 이 함수는 Rust의 암묵적 반환문을 이용해 작성되었다. C 스타일 언어들과 달리
   Rust의 `if` 문은 선언문이 아닌 표현식이므로, `if` 문에도 반환값이 존재한다. */
fn recursive_factorial(n: int) -> int {
    if n <= 1 { 1 }
    else { n * recursive_factorial(n-1) }
}
 
fn iterative_factorial(n: int) -> int {
    // `mut` 키워드는 값이 바뀔 수 있는 변수를 가리킨다.
    let mut i = 1,
    let mut result = 1;
    while i <= n {
        result *= i;
        i += 1;
    }
    return result; // 위의 예제와 달리 명시적 반환문을 사용한다
}

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

/* 이 함수는 각각 병렬적으로 실행되는 10개의 태스크를 만든다. 이 함수를 실행하면
   각각의 태스크가 stdout에 접근을 시도함에 따라, 한 행에 여러 문자열이 섞여서
   표시될 수 있다 */
fn main() {
    // 변수 message는 변경이 불가능하므로, 여러 개의 태스크에서 동시에 접근해도 안전하다.
    let message = "This is part of a lightweight thread.";
    for num in range(0, 10) {
        do spawn {
            println(message);
            // println! 은 매크로이며, 컴파일 시간에 변수의 형 검사가 이루어진다.
            // C나 C++의 단순한 코드 치환 매크로와 달리, Rust의 매크로는 Scheme과 유사한 구조적 매크로이다.
            println!("Message printed by task {:i}.", num);
        }
    }
}

언어의 진화[편집]

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

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

주석[편집]

  1. Doc language FAQ (en). 2013년 4월 29일에 확인.
  2. Project FAQ (en) (2010년 9월 14일). 2012년 1월 11일에 확인.
  3. Future Tense (en) (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.”
  4. Hoare, Graydon (2010년 10월 2일). Rust Progress (en). 2010년 10월 30일에 확인.
  5. 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) (en). 2012년 2월 6일에 확인.
  6. The Mozilla Manifesto. 2013년 4월 29일에 확인.

외부 고리[편집]