[Rust] rust 시작하기
rust 가 좋다는 말은 들었지만 시작하겠다는 생각은 하지 않고 있었다.
그러다 rust 팀의 문서를 읽게 되었는데 그 문서가 좋아서 배우기 시작하게 됐다.
rust 의 장점은 위 문서에서도 잘 설명이 되어있고, 다른 아티클들을 찾아봐도 좋을 것 같다.
포스팅에서는 rust 를 공부하며 간단한 정리를 해두는 것으로 한다.
- 설치하기
- rustup: 러스트 버전 및 관련 도구들을 관리하기 위한 커멘드 라인 도구
설치 방법은 문서에 잘 나와있다. 설치 후 rustup — version 을 통해 설치 확인을 하면 된다.
- 빌드 도구: C++ 빌드 도구 등이 필요하여 visual studio 빌드 도구를 설치한다. ( https://visualstudio.microsoft.com/downloads/) - 폴더, 파일 생성
- 작업할 폴더와 파일을 생성한다.
폴더를 만든 후 해당 폴더에 main.rs 파일을 만든다. 작업의 기본이 되는 파일로써, react 에서의 app.js 또는 index.js 파일이라고 생각 할 수 있겠다. - main.rs
fn main() {
println!("Hello, world!");
}
코드에 대한 설명은 뒤에서 하고 실행을 한다.
- 실행
# Linux or macOS
$ rustc main.rs
$ ./main Hello, world!# windows
> rustc main.rs
> .\main.exe Hello, world!
참고로 windows 환경에서 visual studio 를 사용하고 있다면 git bash 와 같은 도구를 사용하면 Linux or macOS 의 커맨드를 그대로 사용할 수 있다.
해당 커맨드를 실행하면, Hello, world! 가 출력된 것을 볼 수 있다. 역시 Hello, world! 는 짜릿하다.
- 러스트 프로그램 해부하기
fn main() {}
위 코드는 러스트의 함수를 정의한다. ‘ main
함수는 특별합니다: 이것은 모든 실행가능한 러스트 프로그램 내에서 첫번째로 실행되는 코드입니다.’ 고 한다.
파라미터가 있다면 () 안에 위치하게 되고, {} 안에서 실행 구문을 작성하게 된다.
println!("Hello, world!");
스크린에 텍스트를 출력하는 라인이다. 네 가지의 디테일이 있다.
첫번째: 러스트 스타일은 탭이 아닌 네개의 스페이스로 들여쓰기를 한다.
두번째: println! 은 러스트 매크로(macro) 라고 불린다. 함수라고 불리려면 (!없이) println 으로 입력되어야 한다고 한다. !은 보통의 함수가 아닌 매크로를 호출한다.
세번째: “Hello, world!” 라는 스트링을 printls! printls! 의 인자로 넘기고 이 스트링이 화면에 출력된다.
네번째: 세미콜론으로 끝난다. 이는 이 표현식이 끝났고 다음것이 시작 될 준비가 되었음을 알린다. 대부분의 러스트 코드라인이 세미콜론으로 끝난다.
- 컴파일과 실행
# 컴파일
$ rustc main.rs# 실행
$ ./main # or .\main.exe on Windows
자바스크립트나 파이썬과 다른 부분이다. 러스트는 먼저 컴파일을 한 뒤, 실행한다.
‘러스트는 ahead-of-time compiled 언어인데, 이는 여러분이 프로그램을 컴파일하고, 그 실행파일을 다른 이들에게 주면, 그들은 러스트를 설치하지 않고도 이를 실행할 수 있다는 의미입니다.’
자바스크립트나 파이썬과 같은 동적언어에서는 해당 언어의 구현체가 설치되어 있어야 한다. 하지만 그러한 언어에서는 하나의 커맨드로 프록램을 컴파일 하고 실행가능 하다.
언어 디자인의 트레이드 오프이다.
- Cargo: 러스트의 빌드 시스템 및 패키지 매니저
- Cargo.toml: toml 은 Cargo의 환경설정 포맷이다.
해당 파일은 package.json 과 같이 프로그램의 정보, package, dependency 를 나타내고, 작성할 수 있다. - Cargo 프로그램의 특징:
- Cargo는 소스 파일들이 src 디렉토리 안에 있을 것으로 예상한다.
- 최상위 프로젝트 디렉토리는 그저 README 파일들, 라이센스 정보, 환경 파일들, 그리고 작성하는 코드와는 관련이 없는 다른 것들 뿐이다.
- 이러한 공통 구조는 프로그램을 조직화 하는데에 도움이 된다. - cargo build / check / run
# 빌드
$ cargo build
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 2.85 secs# 실행
$ ./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
Hello, world!
run 커맨드를 사용하여 실행 할 수 있다.
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
Running `target/debug/hello_cargo`
Hello, world!
위 커맨드 출력에서는 컴파일 중이라는 메시지를 볼 수 없다. 그것은 Cargo 파일들이 변경된 적이 없다는 것을 알아내고, 따라서 해당 바이너리를 그저 실행한다는 것이다.
파일을 수정한다면 다음과 같은 메시지가 나타난다.
$ 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 check 를 통해 컴파일 되는지 확인하고, 실행 파일을 사용할 때 cargo build 를 사용하면 된다.
$ cargo check
Compiling hello_cargo v0.1.0 (file:///projects/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.32 secs
cargo run 을 사용하면 컴파일을하고, 실행 파일을 실행한다.
요약:
- 우리는 cargo build
나 cargo check
를 사용하여 프로젝트를 빌드할 수 있습니다.
- 우리는 cargo run
를 사용하여 단숨에 프로젝트를 빌드하고 실행할 수 있습니다.
- 우리 코드가 있는 동일한 디렉토리에 빌드의 결과물이 저장되는 대신, Cargo는 이를 target/debug 디렉토리에 저장합니다.
- 릴리즈 빌드
프로젝트가 마침내 배포(릴리즈)를 위한 준비가 되었다면,cargo build --release
를 사용하여 최적화와 함께 이를 컴파일할 수 있다.
이 커맨드는 target/debug 대신 target/release에 실행파일을 생성한다. - 최적화는 러스트 코드를 더 빠르게 만들지만 컴파일 시간을 길게 한다. 그렇기 때문에 두개의 프로파일이 있는 것이다.
하나는 자주 빌드하기를 원하는 개발용,
하나는 최적화를 한 뒤 사용자에게 제공하게 될 프로그램의 빌드를 위한 용도이다.
러스트를 사용하여 기본적인 실행까지 해보았다. 문서가 워낙 잘 되어있어서 해당 문서를 요약하고, 예제를 따라가며 참고할 만한 자료가 있으면 추가해가며 포스팅을 이어가려고 한다.
개발을 해오며 문서가 좋아서 배우기 시작한 경험은 또 새롭다. 러스트 팀에게도, 번역자께도, 고맙습니다.