소소한 개발 공부

[러스트] 러스트 시작하기 - Hello World! 본문

프로그래밍/Rust

[러스트] 러스트 시작하기 - Hello World!

이내내 2023. 7. 17. 08:20

https://rinthel.github.io/rust-lang-book-ko/ch01-02-hello-world.html

 

Hello, World! - The Rust Programming Language

여러분이 러스트를 설치했으니, 이제 여러분의 첫번째 러스트 프로그램을 작성해봅시다. 새로운 언어를 배울 때면 “Hello, world!”라는 텍스트를 스크린에 출력하는 짧은 프로그램을 작성하는

rinthel.github.io

터미널에 아래 명령어를 실행해 폴더를 만들어 프로젝트를 진행해보자.

// home 디렉터리에 projects 디렉터리 생성
$ mkdir ~/projects

// projects 디렉터리로 이동
$ cd ~/projects

// hello_world 디렉터리 생성
$ mkdir hello_world

// hello_world 디렉터리로 이동
$ cd hello_world

파일명은 main.rs

fn main() {
    println!("Hello, world!");
}

터미널에서 main.rs를 실행시켜준다.

// 컴파일
$ rustc main.rs

// 실행
$ ./main
Hello, world!

와! 첫 rust 프로그램을 실행했다!

 


fn 은 함수를 정의한다.

여기서 main은 모든 실행 가능한 러스트 프로그램 중 첫번째로 실행되는 코드다.

함수 본체는 {}로 감싼다.

 

위 Hello, world! 를 살펴보자.

1. 러스트 스타일은 탭이 아닌 4개의 스페이스로 들여쓰기를 한다.

2. println!러스트 매크로라고 한다. (함수는 println() 으로 쓰여야 함)

=> ! 는 보통 함수 대신 매크로를 호출한다.

3. "Hello, world!" string 을 사용한다. 매크로에 string 을 인자로 넘기고 이 string 이 화면에 출력된다.

4. 세미콜론 ; 으로 표현식을 끝낸다.

 

rustfmt 라는 자동 포맷팅 도구가 있으며 코드를 특정한 스타일로 포매팅하고자 할 때 사용할 수 있다.

 

컴파일

- rustc 로 수행한다.

=> 컴파일 후 실행가능한 바이너리를 출력한다.

 

러스트는 ahead-of-time compiled 언어로 프로그램을 컴파일하고 나면 실행파일을 통해 러스트를 설치하지 않고도 이를 실행할 수 있다는 의미이다. 

간단한 프로그램은 rustc 로 컴파일해도 되지만, 프로젝트가 커지면 컴파일하기 힘들어지기 때문에 Cargo 를 사용한다. 

 


Cargo

- 러스트의 빌드 시스템 및 패키지 매니저

코드를 빌드하고, 라이브러리를 다운해주고, 그 라이브러리를 빌드하는 등 많은 작업을 다룸

(코드가 필요로 하는 라이브러리를 의존성(dependency)라고 함)

 

cargo 가 있는지 확인하려면 아래처럼 확인 가능

cargo --version

cargo 를 이용해 새로운 프로젝트를 만들어보자.

$ cargo new hello_cargo --bin
$ cd hello_cargo

cargo new hello_cargo --bin => 실행 가능한 바이너리를 생성한다.

--bin => 인자가 라이브러리가 아닌 실행 가능한 애플리케이션으로 만들어준다. (= 바이너리 파일)

 

cargo는 hello_cargo 디렉터리에 프로젝트 파일(Cargo.toml, src/main.rs)을 생성한다. 또한 .gitignore 와 함께 새로운 Git 저장소도 초기화한다.

 

Cargo.toml

[package]
name = "hello_cargo"
version = "0.1.0"
authors = ["Your Name <you@example.com>"]

[dependencies]

이 파일은 TOML(Tom’s Obvious, Minimal Language) 이라는 Cargo 환경 설정 포맷이다.

- [package] 는 환경설정을 나타내는 섹션의 시작점

- 다음의 3 라인은 컴파일하기 위해 필요로 하는 정보에 대한 설정. cargo 는 환경에서 사용자의 이름과 이메일 정보를 얻어내므로 정확치 않다면 수정 필요

- [dependencies] 는 프로젝트의 의존성 리스트를 적을 수 있는 섹션의 시작점

러스트는 코드의 패키지를 크레이트(crate)라고 부른다.

 

cargo는 소스 파일이 src 디렉터리 안에 있을 것으로 예상하기 때문에 소스 코드는 src 안에 넣어두고, 관련 없는 readme, 라이센스 정보, Cargo.toml 등은 상위에 빼놓는다.

 


Cargo 프로젝트를 빌드하고 실행하기

$ cargo build
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs

=> cargo build

이는 실행 파일을 생성하고, 생성된 파일은 ./target/debug/hello_cargo 을 통해 실행할 수 있다. => ./(파일 경로)

cargo build 를 실행하면, Cargo.lock 파일을 최상위 디렉터리에 생성한다. -> 이는 프로젝트에 어떠한 의존성도 가지고 있지 않고 파일의 내용이 얼마 없다. 신경 쓸 필요 x

* 빌드된 파일의 저장경로는 target/debug 이다.

 

cargo run

- 단숨에 프로젝트를 빌드하고 실행할 수 있다.

만약 코드를 수정한다면, run 내용에 컴파일 내용이 추가된다.

$ cargo run
   Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
    Finished dev [unoptimized + debuginfo] target(s) in 0.33 secs
     Running `target/debug/hello_cargo`
Hello, world!

 

cargo check

- 코드가 컴파일되는지 빠르게 확인해주지만, 실행 파일을 생성하지 않는 컴파일 체크 커맨드 => 실행 파일을 만들지 않아 더 빠르게 컴파일할 수 있다. 

실행 파일을 사용할 준비가 되면 cargo build 로 실행파일을 만든다.

 

릴리즈

cargo build --release

- 최적화와 함께 컴파일 가능

- target/debug 대신 target/release 에 실행 파일 생성

- 배포용 릴리즈 빌드: 빠르게 실행되지만 만들어지는데 오래걸림 vs 개발용 빌드: 빠르게 생성되지만 실행되는데 오래 걸림