ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C++의 대체자를 꿈꾸는 새로운 언어, 러스트(RUST)
    아티클 2015. 2. 3. 13:33
    반응형




    C++ 대체를 꿈꾸는 새로운 프로그래밍 언어 러스트(RUST) 정식판이 공개된다!

    러스트는 C, C++처럼 빠르며 메모리 안전하고, 보다 쉬운 병렬 프로그래밍을 목표로 하는 차세대 시스템 프로그래밍 언어이다.

    요즘같은 멀티코어의 시대에서, 동시성과 병렬성(Concurrency & Pararrel)을 최대한 지원할 수 있도록 고안됐다는 뜻이다.


    RUST?


    러스트(RUST)는 인터넷 브라우저 파이어폭스(FireFox)로 유명한 모질라 리서치(Mozila Research)에서 개발중인 프로그래밍 언어이다.

    모질라 직원인 그레이든 호아레(Graydon Hoare)가 2006년 개인 프로젝트로 시작했다가, 

    지난 2009년 모질라 리서치 프로젝트에 편입됐다. 모질라의 차세대 브라우저 엔진인 '서보(Servo)' 개발 언어로도 알려졌다. 


    인터넷 환경에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데 적합한 언어를 목표로 설계되었으며,

    이 목표에 따라 안전성과 병행 프로그래밍, 그리고 메모리 관리의 직접 제어에 초점을 맞추고, 성능 면에서는 C++와 비슷한 수준을 추구한다.


    안전한 메모리


    메모리 에러를 발생시키지 않도록 설계되었으며, 이에 따라 Rust는 널 포인터나 초기화되지 않은 포인터가 존재하지 않도록 강제하고 있다. 

    모든 변수는 초기값을 가져야하며, 모든 값은 한 곳에서만 소유한다. 

    다른 곳에서 그 값에 접근하려면 소유권을 넘겨서 받거나, 빌려서 써야한다.

    해제된 포인터와 동시에 같은 값에 접근하는 코드는 컴파일 타임 단계에서 에러를 일으킨다.

    즉, 메모리가 안전하진 구문은 컴파일 타임 내에 잡아낸다는 것이다.


    타입 시스템


    타입 시스템은 하스켈의 영향을 받아 타입 클래스를 지원한다. 

    또한, 변수 선언 시 타입을 지정하지 않아도 컴파일러가 타입 추론을 통해 해당 변수의 타입을 지정할 수 있다. 

    반면 함수의 인자나 반환값에서는 타입 정보를 빼놓을 수 없다.


    객체


    객체 시스템은 implementation, trait, struct 또는 enum으로 이루어져 있다. 

    struct과 enum은 객체의 데이터를 정의하는데 사용되며, 

    impl 키워드로 정의하는 implementation은 객체의 멤버 함수를 정의하는데 사용된다. 

    객체의 상속은 trait을 통해 이루어지며, C++의 다형 상속 문제를 회피하기 위해 trait은 객체의 멤버를 정의할 수 없도록 만들어져 있다.


    병행 프로그래밍


    병행 프로그래밍 부분은 얼랭(Erlang)과 유사한 액터(Actor) 기반의 모델을 사용하고 있다.

    각각의 태스크는 데이터를 직접 공유하지 않고 메시지 전달을 통해서만 데이터를 교환할 수 있다. 

    메시지를 복사할 때 생기는 성능 저하를 막기 위해, unique box의 경우 데이터 복사 없이 메시지를 전달할 수 있다. 

    unique box는 하나의 객체만이 소유할 수 있고, 다른 태스크로 전달될 경우 데이터 복사 없이 소유권만 바뀌게 된다.


    코드 예제


    - Hello World!

    fn main() {

        println("hello, world");

    }


    - 병행 프로그램 예제


    이 함수는 각각 병렬적으로 실행되는 10개의 태스크를 만든다. 

    함수를 실행하면 각각의 태스크가 stdout에 접근을 시도함에 따라, 한 행에 여러 문자열이 섞여서 표시될 수 있다 

    /* 

      println! 은 매크로이며, 컴파일 시간에 변수의 형 검사가 이루어진다. C나 C++의 단순한 코드 치환 매크로와 달리, Rust의 매크로는 Scheme과 유사한 구조적 매크로이다.


      `for` 반복문은 `Iterator` trait을 구현하는 어떤 객체에 대해서나 사용할 수 있다.

    */


    use std::thread::Thread;


    fn main() {


        let message = "Hello"; // 변수 message는 변경이 불가능하므로, 여러 개의 태스크에서 동시에 접근해도 안전하다.

        let mut threads = Vec::new();


        for num in 0..10 { 

          threads.push(Thread::scoped(move || {println!("{} from task {:?}.", message, num);

            }));

        }

    }



    관련 링크


    위키백과, 러스트 

    엔하위키 미러, 러스트

    모질라, C++ 대체 러스트1.0 공개 임박

    한국 러스트 사용자 그룹

    러스트 공식 사이트(영문)

    러스트 저장소





    반응형
Designed by Tistory.