https://rust-book.cs.brown.edu/ 를 기반으로 RUST를 독학하는 벨로그 시리즈입니다.
공유보다 공부한 내용을 정리하고, 복습하는 것을 목적으로 합니다.
RUST 설치 경로: https://www.rust-lang.org/tools/install (공식사이트)
이번 포스팅에서는 RUST에서는 "Hello World!"를 어떤 방식으로 출력하는지, RUST가 기본적으로 어떤식으로 동작하는지 그리고 cargo라는 도구는 어떤 도구인지에 대해서 간단히 다루겠습니다.
RUST에서는 "Hello, World!"를 다음과 같이 출력합니다.
// main.rs (rust의 파일 형식)
fn main () {
print!("Hello, World!");
}
만약 여러분이 C/C++과 같은 다른 언어들을 다루어 보았다면 어느정도 익숙할 것 입니다. fn
은 함수를 뜻하고, main
은 main.rs
에서 가장 먼저 실행하는 함수임을 알 수 있을 것 입니다. 또 print!
는 특정 값을 출력해주는 역할임을 추측할 수 있을 것 입니다.
하나 짚고 넘어갈 점은 print!
는 함수가 아닙니다. !
가 붙은 것은 RUST macro라고 불립니다. 이에 대해서는 추후에 다루도록 하겠습니다.
RUST에서는 컴파일과 실행을 각각 실행합니다. 파이썬과 같은 동적 프로그래밍 언어의 경우에는 컴파일과 실행이 동시에 이루어졌을 것 입니다. 이러한 언어들과 다르게 RUST는 실행 전에 소스코드를 기계어로 바꾸는 과정(컴파일)이 필요합니다. 이를 흔히 ahead-of-time compiled 언어라고 합니다. 대표적으로 gcc가 해당 형식을 따릅니다.
RUST파일이 담긴 디렉토리에서 컴파일은 다음과 같이 진행할 수 있습니다.
rustc main.rs
-------------
rustc <파일명>
이후 실행은 다음과 같이 진행할 수 있습니다.
./main.exe or ./main
--------------------
./<실행파일명>
Cargo는 러스트의 빌드 시스템 및 패키지 매니저입니다. 이를 통해 조금 더 큰 프로젝트에 대해 관리할 때 보다 편하게 관리할 수 있습니다.
Cargo를 통해 프로젝트를 생성하는 방법은 다음과 같습니다.
cargo new <프로젝트명> --bin
이후 생성된 디렉토리를 열어보면 다양한 파일들이 생성되어있는 것을 확인할 수 있습니다.
cargo는 소스파일들이 src 디렉토리에 있을 것으로 알아서 판단합니다.
Cargo.toml
은 Cargo의 환경설정 포맷을 담는 파일입니다.
2022년 11월 11일을 기준으로 만들어지는 Cargo.toml
파일은 다음과 같이 구성되어 있습니다.
[package]
name = "new_project"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[package] 에는 Cargo가 프로그램을 컴파일하기 위해 필요로 하는 정보들이 작성됩니다. 현재 프로젝트의 이름, 버전 등이 작성됩니다.
[dependencies] 에는 의존성들이 작성됩니다. RUST에서는 코드의 패키지를 crate(크레이트)라고 합니다. 추후에 crate에 관해 이야기하면서 의존성에 대한 이야기도 함께 하도록 하겠습니다.
우리는 Cargo 를 이용하여 기존에 main.rs
를 실행하던 방식보다 더 나은 방식으로 main.rs
를 실행할 수 있습니다.
우선 다음을 이용하여 프로젝트를 빌드할 수 있습니다.
$ cargo build
이를 통해 현재 디렉토리가 아닌 target/debug/
에 <프로젝트명>.exe
를 생성합니다.
다음을 통해 실행 파일을 실행할 수 있습니다.
$ ./target/debug/hello_cargo # Mac or Linux
or
$ .\target\debug\hello_cargo.exe # Windows
우리는 위의 두 과정을 한 번에 할 수도 있습니다.
$ cargo run
'cargo run'은 프로젝트를 실행하기 전에 빌드를 한 번 거치고, 실행파일을 찾아 실행합니다.
추가적으로 RUST는 cargo check
라고 하는 커멘드를 제공합니다. 이는 단순히 컴파일되는지를 확인만해줍니다.(실행파일을 생성하지는 않음) 해당 커멘드를 사용하는 이유는 실행파일이 생성되지 않기에 build
에 비해서 빠르게 작동하기 때문입니다. 매번 build
를 사용하는 것보다 check
를 사용하여 코드가 작동하는지 확인하는 것이 개발 속도를 높여줄 것입니다.
마지막으로 릴리즈 버전을 빌드하는 방법입니다.
$ cargo build --release
개발이 완료되어 배포할 준비가 끝이 났다면 위의 커멘드를 통해 최적화와 함께 이를 컴파일할 수 있습니다. 해당 커멘드를 처음 사용하게 되면, target/release
디렉토리를 생성하고 하위에 실행파일 및 부가적인 파일들을 생성할 것입니다. 릴리즈 버전은 디버그 버전에 비해 컴파일 시간이 더 오래 걸린다는 것을 기억해야합니다.