사용자:다메즈마/Rust

Rust is a systems programming language that runs blazingly fast, prevents nearly all segfaults, and guarantees thread safety.
— 러스트 공식 홈페이지

Rust(러스트)는 모질라 재단에서 제작중인 프로그래밍언어이다. 2015년 10월 14일 기준 최신버전은 1.3.0이다

Rust의 제작방향[편집 | 원본 편집]

모질라 재단에서 왜 굳이 새로운 언어를 만들어야 했는가? 그 이유는 기존 프로그래밍 언어들에게 각각의 단점이 있었기 때문이다.

우선 모질라 재단의 주력 소프트웨어는 파이어폭스이고, 이 파이어폭스의 커널과 비견될만한 엔진은 Gecko이다. 하지만 이 Gecko엔진은 아직 멀티 프로세싱이 개인에게 보급되기 전인 2000년대에 만들어졌기 때문에 싱글 프로세스 기준으로 제작되었으며, 기본적으로 렌더링이든, 자바스크립트의 작동이든, 부가기능이든 Gecko엔진에서 전부 처리되는 시스템이여서 Gecko엔진에 부담이 몰려있는 구조이다.

거기다 구글의 Chrome, MS사의 인터넷익스플로러 및 엣지가 무서울 정도로 빠른 성능적인 발전이 있었고, 이에 따라 파이어폭스의 점유율이 낮아지기 시작했다.

이러한 상황에서 모질라재단은 성능의 향상을 위해서 새로운 엔진을 제작하기로 마음을 먹었다. 그러나 이러한 새로운 엔진 제작에 발목을 잡는게 있었다 바로 예산이다.

새로운 엔진을 제작할 때 프로그래밍 언어의 선택은 매우 중요하다. 엔진의 실행속도, 제작속도 및 제작의 용이성이 아주 중요하기 때문이다.

  • 우선 C++의 경우 엔진의 실행속도를 잡을 수는 있으나, 제작속도및 용이성에서 아주 떨어지는 문제점이 있었다. 새로운 엔진을 제작할 때는 멀티 프로세싱을 하기 위해서 쓰레드를 사용해야 하는데 C++의 쓰레드는 숙련된 C++ 프로그래머가 아니면 사용하기가 매우 어렵고, 숙련된 C++프로그래머의 몸값은 매우 비싸다
  • Java의 경우 쓰레드의 사용은 C++보다 용이하고 메모리 관리 또한 C++보다 편한 면이 있으나, 기본적으로 Java의 경우 가상머신 위에서 돌기 때문에 속도가 느리다라는 점이 있어 새로운 엔진에 사용하기가 곤란했다.
  • C#의 경우 Java와 비슷한 장단점이 있으나, 기본적으로 MS에 종속되어 있어서 역시 곤란했다.
  • 기타 스크립트 언어들은 이러한 무거운 프로그램을 제작하는데 적합하기 않았다.

한편 이러한 기존 언어들은 장단점이 있어서 곤란할 때, 모질라는 역발상을 하게 되었다

어차피 이렇게 된거 C++보다 메모리 관리가 용이하고 쓰레드의 사용이 쉬운 언어를 만들자!

한편, 모질라 소속의 개발자였던 그레이던 호어의 개인 프로젝트였던 Rust를 매의 눈으로 발견하고 이를 지원하게 되었다.

특징[편집 | 원본 편집]

이러한 사정으로 개발이 시작된 Rust이기 때문에 C++의 단점을 보완하기 위한 몇가지 특징이 존재한다.

변수의 기본은 상수[편집 | 원본 편집]

변수는 기본적으로 상수(바꿀 수 없는 상태)이다. 처음에 선언했을 때의 값을 가지고 계속 보존하고 있으며, 코드 중간에 값을 수정하는 일을 금지한다. 물론 모든 변수가 상수이면, 프로그래밍을 짜기 어렵기 때문에, 변수를 선언할 때, mut이라는 키워드를 넣어주면 변수의 값을 중간에 바꿀 수 있다.

fn main()
{
    let a = 5;
    println!("{}",a);
    a = 10;
    println!("{}",a);
}

이러한 코드는 Rust에서는 동작할 수 없다. Rust에서는 기본적으로 모든 변수는 변경불가가 기본상태이기 때문이다. 따라서 mut키워드를 추가해 줘야 한다.

fn main()
{
    let mut a = 5;
    println!("{}",a);
    a = 10;
    println!("{}",a);
}

Rust에서 기본 변수의 상태를 변경불가로 둔 것은 멀티 프로세싱과 메모리 안정성에 중요도를 둔 결과다. 멀티프로세싱에서 제일 문제가 되는 것은 여러 스레드에서 한 데이터를 접근할 때인데 기본 상태를 변경 불가로 두면, 데이터의 수정을 제한 시킬 수 있으므로, 스레드의 데이터 변경에 의한 문제를 미리 방지할 수 있고, 최적화 또한 쉽게 이룰수 있으며, 문제가 생기더라도 확인해야 하는 구간이 적어진다.

메모리의 소유권한[편집 | 원본 편집]

기본적으로 C++의 메모리 관리는 프로그래머가 다 해야하는 것이다. 최신 라이브러리에서 shared_ptr이나 unique_ptr같이 메모리 관리를 도와주는 것이 있기는 하지만, 기본은 프로그래머에게 맞기는 것이기 때문에 사용하는 것은 선택사항이다.

이에 반해 자바의 메모리 관리는 가상머신이 해야 하는 것이다 프로그래머는 기본적으로 메모리 관리에 신경쓸 필요가 없으며, 실제 메모리에 떨어지게 만들었다. 물론 고급으로 나아갈 수록 프로그래머가 쓰레기 수집에 신경을 써야 하지만 기본은 가상머진이 하는 것이다.

C++의 메모리 관리와 자바의 메모리 관리는 각각 장단점이 있다. 이러한 장단점을 절충한 Rust의 메모리 관리의 사상은 메모리에 소유권을 주고, 소유권을 컴파일할 때 감시한다이다.

Rust의 모든 데이터는 소유자가 있으며, 기본적으로 데이터의 소유권은 한 곳에만 있다. 만약에 소유권을 빌렸다면 소유자(함수)가 끝나기 전에 반환해야 한다

#include<iostream>
void func(int  a){
    std::cout<<a<<std::endl;
    
}
int main()
{
int a = 5;
func(a);
std::cout<<a<<std::endl;
return 0;
}

Rust

fn func(a:i32){
    println!("{}",a);
}
fn main()
{
    let a = 5;
    func(a);
    println!("{}",a);
}

C/C++를 대체하기 위한 프로그래밍 언어[편집 | 원본 편집]

앞서 설명했드시 기본적으로 웹브라우저 엔진 제작을 위해 나온 언어이며, C++를 대체하기 위해서 나왔다. 따라서 컴파일 결과물이 가상머신이나 인터프리터를 거치지 않는 기계어로 나온다.

라이브러리[편집 | 원본 편집]

cargo라고 하는 프로젝트 관리 프로그램이 있으며, 세팅 파일로 라이브로리를 관리하므로 C/C++보다 라이브러리 관리가 편하다.

멀티 스레드 지원[편집 | 원본 편집]

최근에 나온 프로그래밍 언어인만큼 언어 표준에 스레드 라이브러리가 있다.