러스트 프로그래밍 튜토리얼 1장

rust의 공식 문서를 참조해 작성함 https://rinthel.github.io/rust-lang-book-ko/

Rust

C/C++과 같은 low level programming 언어
장점: 다른 low level 언어처럼 빠름, c/c++에서의 메모리 안정성 문제에 대한 해결책 보유 등등...
단점: 매우 어렵다...

Rust에 대한 주워 들은 말들 :
1. 메모리 안정성 문제는 ownership 개념을 통해 해결한 듯?
2. 컴파일러가 꽤나 좋은 듯 하다. 에러 체킹 부분 등에서 장점을 가지고 있는 듯하다
3. gcc 같이 실행 전 컴파일 과정이 필요

Rust 설치 및 실행(Windows)

  1. https://play.rust-lang.org/ >> 인터넷 ide 환경
  2. https://rinthel.github.io/rust-lang-book-ko/ch01-01-installation.html >> Windows에서는 wsl이 최고인 듯
  3. https://docs.microsoft.com/ko-kr/windows/dev-environment/rust/setup >> 비쥬얼 스튜디오와 확장팩을 이용해서도 가능

설치는 커맨드라인 및 rustup을 통해 진행된다. wsl2를 사용하고 있는데 따로 에러가 일어나진 않는다. 설치가 다 되면
커맨드라인에 $ rustc --version을 입력해서 버전 정보를 확인할 수 있으면 정상적으로 설치가 된 것

Rust으로 Hello World! 출력하기

러스트로 파일 생성 및 실행까지는 2가지 방법이 있는데 하나는 그냥 main.rs 파일을 만들어서 컴파일 후 실행 하는 방법이고 나머지 하나는 cargo를 이용해 만드는 것이다. 주로 후자의 방법이 더 많이 쓰인다고 한다.

1. main.rs으로 출력하기

main.rs 생성

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

그 후에 터미널에 아래와 같이 입력하면 Hello, world!가 출력된다.

$ rustc main.rs
$ ./main
Hello, world!

먼저 코드 부분을 살펴보면 함수임을 fn을 통해, 함수 이름은 main으로 선언된 것을 볼 수 있다.
rust 내에서 main 함수는 실행가능한 러스트 프로그램 내에서 가장 먼저 실행 되는 부분이다.
반환 값과 파라미터가 없는 main 함수이고 {} 중괄호로 감싸져있다.

코드 내용을 볼 때 특이한 점이 두 가지가 있는데
우선 첫번째는 러스트는 tab 들여쓰기가 아니라 네 개의 스페이스로 들여쓰기를 한다는 점이다.
두번째는 다른 언어와 달리 println뒤에 !가 있다. !가 붙은 println!은 러스트 매크로라고 불린다는 데 이는
추후에 다시 다뤄진다.
rust에서도 ; 즉 세미콜론을 사용한다는 점을 볼 수 있다.

컴파일

$ rustc main.rs
$ ls
main main.rs

컴파일 부분을 살펴보면 커맨드라인에 rustc 를 통해 main.rs을 main으로 컴파일 해주는 것을 볼 수 있다.
실제로 컴파일 뒤 ls 명령어를 통해 보게 되면 main 파일이 새로 생긴 것을 알 수 있으며
./main 명령어를 통해 main.rs가 아닌 main 파일을 실행시켜 주는 것을 볼 수 있다.

rustc로 컴파일 된 main 파일은 실행 가능한 binary로 이 실행파일은 다른 사람들이 러스트를 설치하지 않고도
이를 실행할 수 있다. 이를 ahead-of-time compiled 언어라고 부른다.

2. Cargo으로 출력하기

Cargo는 러스트의 빌드 시스템 및 패키지 매니저라고 공식 문서에 나와 있다. 그 이유는 문서에 잘 나와 있는데 라이브러리와 의존성 등등 인데 대충 더 편하다고 생각하면 될 것 같다.

Cargo는 rust를 설치할 때 자동적으로 설치되며 이 역시 $ cargo --version을 통해 설치 유뮤를 확인할 수 있다.

Cargo로 프로젝트 생성

$ cargo new hello_cargo --bin
$ cd hello_cargo

커맨드라인에 위의 명령어를 입력하게 되면 작업하고 있는 디렉토리에 hello_cargo라는 디렉토리와 실행 가능한 바이너리를 생성한다. bin 인자가 라이브러리가 아닌 애플리케이션으로 만들어 준다고 한다. hello_cargo라는 디렉토리 안에 가보게 되면 .git, .gitignore, Cargo.toml, src와 같은 파일과 디렉토리가 생성된 것을 볼 수 있고 src 디렉토리 안에는 main.rs라는 파일이 자동적으로 생성되 있다. main.rs의 코드를 보면 생성과 동시에 1.main.rs 에서 작성했던 hello, world를 출력할 수 있는 코드를 담고 있다.

돌아와서 먼저 Cargo.toml 파일을 텍스트 에디터로 보게 된다면 아래와 같은 내용을 볼 수 있다.

[package]
name = "hello_cargo"
version = "0.1.0"
edition = "2021"
See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]

Cargo.toml에서 toml은 TOML (Tom’s Obvious, Minimal Language) 포맷으로 작성되었다는 뜻인데 Cargo의 환경설정 포맷이라고 한다.

첫 행에서의 [package]는 그 아래 행들부터가 환경설정 부분이라는 나타내는 시작점이다.
그 아래가 환경설정 내용인데 공식문서에는 name, version, authors라고 나와 있는데 왜 다른지는 잘 모르겠다.

[dependencies] 부분은 프로젝트가 의존하고 있는 의존성의 리스트라는데 아마 추후에 부가 설명이 나올 듯하다.
src/main.rs의 코드는 위에 기술했던거와 같이 똑같고 차이점은 Cargo로 만든다면 메인 코드파일이 scr 안에 있다는 점, cargo.toml 환경설정 등등이 있다. 이는 비쥬얼 스튜디오에서 Cargo로 작업한다면 더 쉽게 볼 수 있다.

컴파일

$ cargo build
Compiling hello_cargo v0.1.0 (/home/arhan/projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.55s

컴파일은 hello_cargo 디렉토리에서 $ cargo build를 통해 할 수 있다. 그러면 현재 디렉토리 대신
target/debug/hello_cargo에 실행 파일을 생성한다. 실제로 target이라는 디렉토리를 생성해준다.
여기서 재밌는 점은 3번째 줄에 unoptimized라고 출력되는데 이것은 현재 만들어진 실행파일이 최적화가
되지 않았다는 점을 표현한다. 이에 대해선 아래에서 다시 한번 설명할 것이다.

이렇게 파일을 만들었으면 단순히 파일을 실행시켜 출력할 수도 있고

$ ./target/debug/hello_cargo
Hello, world!

혹은 Cargo run 명령어를 통해 실행시킬 수 있다.

$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running 'target/debug/hello_cargo'
Hello, world!

build와 다른 점은 Compiling이라는 문장을 볼 수 없는데 이는 build 이후로 파일이 수정되지 않아 단순히
바이너리를 실행시켰다는 것을 알 수 있다. 만약 파일이 수정됬다면

$ 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가 있는데 이 명령어는 작성한 파일이 에러 없이 컴파일 되는지를 확인해준다.
이 명령어는 run과 달리 파일을 실행시키지 않아 run 명령어보다 빨라 단순히 에러 체킹의 목적이라면
run 보다 check 명령어가 더 적절하다

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

실제로 Running이 출력되지 않는다는 것을 볼 수 있다.

Release

최종적으로 파일을 배포하기 위해서는 단순히 파일을 컴파일 하는 것 뿐만 아니라 최적화도 해주어야 한다.
이는 $cargo build --release를 통해 할 수 있다.

cargo build --release
Compiling hello_cargo v0.1.0 (/home/arhan/projects/hello_cargo)
Finished release [optimized] target(s) in 0.14s

이렇게 하게 되면 최적화가 된 것이고 전과 달리 unoptimized에서 optimized으로 바뀐 것을 볼 수 있다.
--release 옵션은 /target 안에 debug와 다른 release 디렉토리를 생성해주고 그 안에 최적화된 파일을 저장한다.

최적화돤 파일을 실행하려면 run 뒤에도 --release 값을 주어야 된다. 단순히 run을 하면 /target/release가 아닌
/target/debug 안에 있는 unoptimized된 파일이 실행된다.

cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running 'target/debug/hello_cargo'
Hello, world!

cargo run --release
Finished release [optimized] target(s) in 0.00s
Running './hello_cargo'
Hello, world!

Summary

  1. Cargo 명령어를 통해 파일 관리 및 실행
  2. cargo new를 통해 프로젝트 생성, cargo build를 통해 컴파일
  3. cargo run을 통해 실행
  4. --release를 통해 최적화

좋은 웹페이지 즐겨찾기