러스트(Rust)라는 프로그래밍 언어는 "안전하고, 병렬적이며, 실용적인"언어로 디자인되었으며 동시에
Rust를 사용해서 효율적인 시스템 소프트웨어를 빌드할 수 있고
순수 함수형 프로그래밍,액터기반 프로그래밍, 명령형 프로그래밍,
객제지향 프로그래밍 스타일을 지원합니다.
개발자는 웹 서버, 메일 서버, 웹 브라우저와 같은 네트워킹 소프트웨어(Networking Software)에 Rust를
사용하고 있습니다. Rust는 컴파일러 및 인터프리터, 가상화 및 소프트웨어 컨테이너, 데이터 베이스
운영 체제, 암호화에도 사용됩니다. 임베디드 디바이스용 게임,명령줄 프로그램, 웹 어셈블리 프로그램,
어플리케이션을 빌드할 때에도 Rust를 사용할 수 있습니다. Rust는 C및 C++같은 기존 시스템 소프트웨어
언어를 안전하게 대체할 수 있는데, C 및 C++과 마찬가지로 Rust에는 거의 모든 기타 최신 언어와 달리
대규모 런타임 또는 가비지 수집기가 없습니다.
그럼에도 불구하고 Rust는 메모리 안정성을 보장하고, C및 C++에서 발생할 수 있는 잘못된 메모리 사용과
관련된 수많은 버그를 방지해주며 동시에 성능 및 안정성과 구현 식 간에 고유한 균형을 유지해줍니다.
프로그래밍에 대한 배경 지식에 관계 없이 Rust를 파고든다면 Rust에서 제공되는 것들을 하나하나씩
알아낼 수 있을 것 입니다.
Rust의 탄생
Rust의 탄생은 2006년 개발자 그레이든 호아레(Graydon Hoare)라는 개발자의 개인 프로젝트에서
시작 되었으며 2009년 호아레의 고용주인 모질라(Mozila)에서 공동 개발에 참여했습니다.
2010년이 되면서 Rust가 처음 공개되면서 같은 해에 Objective Caml(멀티 패러다임)로 작성된 초기
컴파일러에서 Rust로 전환되었습니다.
모질라에 정책에 따라서, 러스트는 전적으로 오픈 소스로 개발되고 있으며, 커뮤니티로부터 많은
피드백을 받고있는 언어입니다. 모질라 재단에서 Rust를 후원하고 있으며,
러스트의 설계에는 모질라의 렌더링 엔진인 Servo(레이아웃 엔진)와 rustc 컴파일러를 개발하면서
쌓인 경험들이 반영되어 있습니다.
Rust를 배우기 위한 가장 좋은 방법
Rust를 배우기 위한 방법으로는 Rust에서 Rust코드를 생산적으로 작성해줄
약간의 이론적 지식이 필요합니다.
개발을 시작하기 전에는 이런 과정이나 다른 Rust 학습 리소스에 따라서 진행해야 하는데,
언어에 대한 기본적인 이해를 마침 코드 작성을 최대한 많이 연습해 놓는 것이 좋습니다.
Rust의 특징
러스트는 인터넷에서 실행되는 서버 및 클라이언트 프로그램을 개발하는데에 적합한 언어를 목표로
설계된 언어입니다.
이러한 목표로 러스트는 안정성과 병행 프로그래밍, 그리고 메모리 관리의 직접 제어에 초점을 맞추고
있으며, 현대적인 스스템 프로그래밍 언어이면서 성능 면에서도 C++과 비슷한 수준을 목표로 하고 있습니다.
"안전하지 않은"코드를 사용해 "안전한"코드로 추상화할 수 있는 도구 또한 언어 차원에서 제공됩니다.
안전한 코드는 C++의 RAII(Resource Acquisition is Initialization)을 강제하고 참조하는 변수의 수명을
컴파일러에서 확인합니다.
러스트에 문법은 중괄호로 코드 블록을 구분하고 if문, else문, while문 등의 키워드를 사용하는 등
C 및 C++과 유사한 모양을 하고 있습니다.
타입이 강제되는 매크로를 사용해 언어를 확장하는 것도 가능하며, 현대적인 모듈 시스템을 통해서
쉽게 모듈화를 할 수 있습니다.
러스트는 메모리 오류를 발생시키지 않도록 설계되었고, 러스트에서는 null 포인터나 초기화되지 않은
포인터가 존재하지 않도록 강제하고 있으며
모든 변수에는 초기값을 가지고 할당되고, 해제된 포인터에 접근하는 코드는 컴파일러가 미리 감지해
컴파일 오류를 일으킵니다.
언어 차원에서 지원하는는 Object<T>라는 제네릴 enum이 존재하고, Object<T>는 Some<T>혹은 None
둘 중 하나로 지정될 수 있으며, None이 기존 프로그래밍 언어의 null역할을 담당합니다.
이 Object<T>를 통해서 데이터가 없다는 상태를 관리하기 떄문에 논리적으로는 프로그래밍을 잘못해서
발생하는 버그일 수 있으나 unsafe코드가 아닌 이상에는 메모리 오류가 발생하지 않습니다.
타입 시스템에는 Haskell(하스켈)의 영향을 받아 타입 클래스를 지원합니다. 변수 선언 시에도 타입을
지정하지 않아도 컴파일러가 타입을 추론해 해당 변수의 타입을 지정해줄 수 있습니다.
반면에 함수의 인자나 반환값에는 타입 정보를 빼놓을 수 없습니다. 병행 프로그래밍은 얼랭과 유사한
actor 기반의 모델을 사용하고 있습니다. 각각의 태스크는 데이터를 직접 공유하지 않고
메시지 전달을 통해 데이터를 교환할 수 있습니다. 메시지를 복사할 때 성능 저하를 막기 위해서,
unique box의 경우 데이터 복사 없이 메시지를 전달해줄 수 있습니다.
unique box는 하나의 객체만이 소유할 수 있고, 다른 태스크로 전달될 경우 데이터 복사 없이
소유권 만 바뀌게 됩니다.
Rust를 요약하자면
- 컴파일러가 사람이 찾아내기 힘든 버그를 유발하는 코드의 컴파일 자체를 거부하면서
버그의 발생 가능성을 감소시킨다. 이는 개발자로 하여금 버그를 추적하는 데에
소비하는 시간을 절약해 프로그램 로직 작성에 활용할 수 있게 한다. - 운영체제와 같은 시스템 프로그램으로 부터 CLI tool, 웹 서비스, DevOps 도구, 임베디드 장치
암호학, 검색엔진, loT 애플리케이션, 머신러닝, Firewox web browser의 주요 기능 구현 등
다양한 분야로 폭넓게 이용됩니다. - C언어와 같은 직접적 메모리 할당 해제 작업을 하지 않으면서 Java의 grabage collector과 같은
overhead 없이도 메모리를 관리할 수 있기에 메모리 사용면에서도 효율성과 편의성 사이의
trade-off issue를 좀 더 효과적으로 처리할 수 있습니다.
참고 자료
'백엔드 > Rust' 카테고리의 다른 글
[Rust] Rust 개념 - 1.보편적인 프로그래밍 개념 - 변수와 가변성 (0) | 2023.01.11 |
---|---|
[Rust] Rust 추리 게임 만들기 (0) | 2023.01.11 |
[RUST] RUST 설치하기 (0) | 2023.01.10 |