제가 Node.js를 많이 해서 이거랑 비교 하면서 좀 하겠습니다.
Rust는 2010년 모질라 재단에서 만들어 발표 했다가 2021년 부터 러스트 재단으로 파생되어 관리되어오고 있다.
Rust는 컴파일러 및 인터프리터, 가상화 및 소프트웨어 컨테이너, 데이터베이스, 운영 체제, 암호화에 주로 사용되며,
임베디드 디바이스용 게임, 명령줄 프로그램, 웹 어셈블리 프로그램, 애플리케이션을 빌드하는 데도 Rust를 사용할 수 있다.
Rust의 특징들은 아래와 같다.
특징 | 설명 |
형식 안전 | 컴파일러는 잘못된 형식의 변수에 어떤 작업도 적용되지 않게 보장합니다. |
메모리 안전 | Rust 포인터(참조라고도 함)는 항상 유효한 메모리를 참조합니다. |
데이터 경합 없음 | Rust의 바로우 검사기는 프로그램의 여러 부분이 동일한 값을 동시에 변경할 수 없도록 하여 스레드 보안을 보장합니다. |
무비용 추출 | Rust를 사용하면 최소한의 성능 비용으로, 또는 성능 비용 없이 반복, 인터페이스, 함수 프로그래밍 같은 상위 수준의 개념을 사용할 수 있습니다. 또한 추상화는 기본 코드를 직접 작성하는 것처럼 수행됩니다. |
최소 런타임 | Rust에는 최소한의 선택적 런타임이 있습니다. 메모리를 효율적으로 관리할 수 있도록 이 언어에는 가비지 수집기도 없습니다. 이러한 측면에서 Rust는 C 및 C++ 같은 언어와 가장 유사합니다. |
운영 체제 미설치 대상 | Rust는 임베디드 및 “운영 체제 미설치” 프로그래밍을 대상으로 지정하여 운영 체제 커널 또는 디바이스 드라이버 작성에 적합하도록 합니다. |
Rust는 C/C++을 대체 한다는 목적도 가지고 있는데, 그렇기 때문에 C/C++처럼 가비지 콜렉터가 없다. 하지만 직접 메모리를 관리해야하는 C/C++과는 달리 Rust는 소유권이라는 특정한 방식으로 메모리를 관리하여 BOF같은 메모리 관련 취약점을 코드와 컴파일 상에서 원천적으로 차단한다.
※소유권이란, C/C++에서는 메모리에 'A'라는 데이터를 할당해놓으면 어느 함수에서나 접근 가능 하지만, Rust에서는 Main함수에서 'A'라는 데이터를 할당해놓으면 Main함수가 'A' 의 소유권을 가지고 Main함수 안에서만 액세스 하여 사용할 수 있다. 가령 Main함수에서 bring()이라는 함수를 호출하며 인자값으로 'A'를 보내줬다면, 'A'의 소유권은 bring이라는 함수로 이전되게 되고 Main함수에서는 더이상 'A'를 사용할 수 없다. 이것은 나중에 예제로 볼 수 있게 하겠다.
※가비지 콜렉터란, 가비지 콜렉터에서 가비지는 '정리되지 않은 메모리', '유효하지 않은 메모리 주소'를 말한다. 프로그램내에 사용하지 않는 데이터나 메모리 공간(가비지)이 있다면 가비지 콜렉터가 메모리를 해제해줌으로써 메모리 부족 현상을 해결한다 하지만 그만큼 프로그램 퍼포먼스가 떨어지게 된다.
대충은 개념은 이렇고 전체 구조에 대해서 보자면,
- 크레이트: 모듈의 집합. 모듈들을 하나로 합쳐 컴파일된 바이너리 혹은 라이브러리의 단위
(webpack처럼 하나의 파일로 만드는 것 같은 비슷한 느낌인것 같다 하나의 "프로젝트" 느낌) - 모듈: 크레이트를 구성하고 있는 집합 같은 느낌인데
편하게 풀어보면 Node.js에서 기능별로 디렉토리를 만들어 프로젝트 구조를 구성하는데
맨 상위 모듈은 crate이며 하위에 Account라는 디렉토리 안에 Login 디렉토리가 있고 Register디렉토리가 있다고 했을 때,
Login 디렉토리는 로그인 기능을 구현한 함수가 들어있고, Register 디렉토리는 회원가입을 구현한 함수가 들어있을 것이다.
이것을 Rust로 봤을 때는 하나의 Login이라는, Register라는 모듈이 되는 것이다.
이 모듈들이 모여 하나의 크레이트를 구성한다.
crate
└── Account
├── Login
│ └── compare_id_pw 함수
└── Register
└── add_id_pw 함수
- 경로: 리눅스 처럼 상대 경로 절대 경로가 있는데 모듈에 접근하는 방식을 나타낸 것이다.
자바처럼 접근 제한자가 있어 해당 키워드를 사용한 함수만 접근 해서 사용할 수 있는데 이것은 나중에...
아래 예제를 보면 굉장히 쉽다.
Account::Login::compare_id_pw(); 상대경로
crate::Account::Register::add_id_pw(); 절대경로
이런식으로 접근 할 수 있는 것이다.
Rust에는 C언어의 stdio.h와 대응하는 std라는 기본 입출력 크레이터가 있다.
기본적으로 std 라이브러리는 모든 Rust에서 사용할 수 있고 Node의 npm과 같이 라이브러리를 받아 require나 import를 사용해 사용할 수 있는 것처럼 Rust에도 crates.io라는 곳에서 라이브러리를 다운 받아 use키워드를 사용해 여러 라이브러리들을 사용할 수 있다.
rustc를 사용하여 크레이트를 직접 만들 수 있지만 대부분의 프로젝트는 Cargo라는 종속성 관리자를 사용한다.
주요 명령어는 다음과 같다.
- cargo new 새 프로젝트 템플릿을 만든다.
- cargo build 프로젝트를 빌드한다.
- cargo run 프로젝트를 빌드하고 실행한다.
- cargo test 프로젝트를 테스트한다.
- cargo check 프로젝트 유형을 확인한다. 라이브러리인지 바이너리인지 등...
- cargo doc 프로젝트에 대한 설명서를 작성한다.
- cargo publish crates.io에 라이브러리를 게시한다.
- 크레이트 이름을 Cargo.toml 파일에 추가하여 프로젝트에 종속 파일을 추가한다.
개념하고 구조는 끝
참고
https://docs.microsoft.com/ko-kr/learn/paths/rust-first-steps/
'Rust > Rust 문법' 카테고리의 다른 글
Rust (6) - 주석 (0) | 2022.04.22 |
---|---|
Rust (5) - Rust에서 함수 사용법 (0) | 2022.04.21 |
Rust (4) - Rust에서 변수의 데이터 타입 (0) | 2022.04.20 |
Rust (3) - Rust에서 변수의 특징 (0) | 2022.04.19 |
Rust (2) - Rust설치, 프로젝트 생성과 기본 출력 예제 (0) | 2022.04.14 |
최근댓글