러스트 튜토리얼 (1) - 시작하기, 튜토리얼

DaeyeolKim·2022년 5월 13일
1

러스트 내공부

목록 보기
1/4

이전부터 러스트 언어를 배울 생각은 있었지만, 실천하지 못하고 있던 찰나 솔라나 스터디를 참여하게 되었다. 참여하는 김에 그 기록을 남겨보고자 합니다. 절대 문서의 요약의 개념이 아니며 나중에 찾아보기 위함입니다.

러스트는 모질라에서 개발한 프로그래밍 언어이며 메모리 성능,편의성에 중점을 둔 언어입니다.
가장 놀라운점은 가비지 컬렉터 없이 메모리 안정성을 제공한다는 점이다. 러스트는 C/C++을 대체하려는 목적으로 2010년에 발표하였으며 그 기대가 크고, 현재는 안정궤도에 올라와 여러 분야에서 사용 중으로 보입니다.

딥러닝 분야에서는 Tflite, Torch Mobile등 엣지 디바이스를 위한 그래프 기반의 모델들이 존재합니다. 하지만 이는 속도 측면에서 우수한 성능을 내지 못하고 있고, 성능 향상을 위해 rust로 엣지 모델을 구성하는 업체가 보였습니다.


튜토리얼은 The Rust Programming Language라는 책을 따라 가며 실제 코드를 동작해보며 작성할 예정입니다. 이 책은 커뮤니티에서 한글로 번역하여 한글본으로 볼수있습니다.

1장. 시작하기

설치

러스트를 설치 하기 위해서는 rust up이라는 러스트 버전 관리도구들을 이용합니다.

-Linux/MacOs

$ curl https://sh.rustup.rs -sSf | sh
$ source $HOME/.cargo/env
$ export PATH="$HOME/.cargo/bin:$PATH"

-Windows
링크에서 다운받으시면 됩니다.

설치가 싫으시면 play rust를 이용하셔도 됩니다.

버전 확인

$ rustc --version

rust 프로그램 작성하고 실행하기

러스트의 확장자는 .rs로 끝납니다.
간단히 hello word를 출력하는 프로그램을 작성하고 실행합니다.

Filename:main.rs

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

실행 커맨드

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

rust 프로그램 해부하기

"Hello,World!"를 해부하고 어떤 일이 벌어졌는지 보기로 합니다.

fn main() {
}

먼저 fn은 함수(function)을 정의합니다. main함수는 모든 rust 프로그램에서 첫째로 실행되는 코드입니다. () 에는 파라미터를 정의합니다.
러스트에는 rustfmt가 개발중이며, 이는 자동 포맷팅을 도와 줍니다.

    println!("Hello, world!");

첫째로, 러스트 스타일은 탭을 사용하지않으며, 네 개의 스페이스로 들여쓰기를 합니다.
둘째로, println 은 러스트 매크로(macro)라고 불립니다. 함수는 ! 가 없으며, 매크로는 ! 를 붙여 사용합니다.
마지막으로 ; 을 표현식의 마지막에 붙여야합니다. 대다수의 러스트 코드들을 라인이 세미콜론으로 끝납니다.

컴파일과 실행은 개별적인 단계입니다.

러스트 컴파일은

$ rustc main.rs

다음과 같이 진행하며, 컴파일이 성공했을시 아래와 같이 확인 할 수 있습니다.

$ ls
main  main.rs

따라서, 컴파일 완료후 실행파일을 실행시켜야합니다.

$ ./main # or .\main.exe on Windows

Hello Cargo

Cargo는 러스트의 빌드 시스템 및 패키지 매니저입니다. Cargo가 코드를 빌드하고, 라이브러리를 다운해주는 등 많은 일을 합니다.
아래 명령어로 cargo 버전을 확인해 보세요.

$ cargo --version

Cargo를 사용하여 프로젝트 만들기

앞에서 제작한 Hello world와 cargo기반의 프로젝트가 얼마나 차이나는지 살펴 봅시다.

$ cargo new hello_cargo --bin
$ cd hello_cargo

첫번쨰 커맨드는 hello_cargo라고 불리우는 실행가능한 바이너리를 생성합니다. cargo new에게 넘겨지는 --bin 인자가 라이브러리가 아닌 실행 가능한 어플리케이션으로 만들어 줍니다.(바이너리 파일)

hello_cargo 디렉토리로 가서 파일 리스트를 보면 Cargo가 두개의 파일과 하나의 디렉토리를 생성한 것을 볼 수 있습니다.

hello_cargo
├ Cargo.toml
└ src/
   └main.rs

Filename : Cargo.toml

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

이 파일은 TOML포맷으로 작성되었는데, 이것은 cargo의 환경설정 포맷입니다.

Filename : src/main.rs

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

Cargo Project Build

빌드

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

실행

택 1로 가능. Cargo run은 실행전에 다시 빌드합니다.!

$ ./target/debug/hello_cargo # or .\target\debug\hello_cargo.exe on Windows
Hello, world!
cargo run

릴리즈 빌드

cargo build --release

릴리즈 후 target/relase 실행파일 있는지 확인

2장. 추리게임 튜토리얼

이 장에서는 숫자 마추기 게임을 제작합니다.

  • 새 프로젝트 만들기!
$ cargo new guessing_game --bin
$ cd guessing_game

Filename : src/main.rs

use std::io;
fn main() {
    println!("Guess the number!");
    println!("Please input your guess.");
    let mut guess = String::new();
    io::stdin().read_line(&mut guess)
        .expect("Failed to read line");
    println!("You guessed: {}", guess);
}

std::io 는 input/output 라이브러리를 사용하기 위함입니다.

러스트는 모든 프로그램의 스코프에 prelude 타입들을 가져옵니다.
만약 없다면 use 를 이용하여 명시적으로 가저와야합니다.

변수 만들기

let은 변수를 만듭니다. 하지만 let 만으로 가변 변수를 생성할 수 없습니다.

fn main() {
let foo = 5; // immutable
let mut bar = 5; // mutable
}

&

&는 코드의 여러 부분에서 데이터를 여러 번 메모리로 복사하지 않고 접근하기 위한 방법을 제공하는 참조자 임을 나타냅니다. 참조자는 복잡한 특성으로서 러스트의 큰 이점 중 하나가 참조자를 사용함으로써 얻는 안전성과 용이성입니다. 이 프로그램을 작성하기 위해 참조자의 자세한 내용을 알 필요는 없습니다. 4장에서 참조자에 대해 전체적으로 설명할 것입니다. 지금 당장은 참조자가 변수처럼 기본적으로 불변임을 알기만 하면 됩니다. 따라서 가변으로 바꾸기 위해 &guess가 아니라 &mut guess로 작성해야 합니다.

expect

io::Result가 Err인 경우 expect가 프로그램을 멈추게 함.

cargo.lock

명시적 업그레이드를 하지 않는 경우 cargo.lock의 version을 이용

rand

extern crate rand;
rand::thread_rng().gen_range(1, 101);

extern crate rand; <- 외부 의존 크리에트가 잇음을 알ㄹ림

비교

use std::cmp::Ordering;
    match guess.cmp(&secret_number) {
        Ordering::Less    => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal   => println!("You win!"),
    }

guess라는 변수와 크기 비교

반복문

loop{}

profile
BioSignal Processing/ Deep Learning/ Block Chain

4개의 댓글

comment-user-thumbnail
2022년 5월 13일

안녕하세요 블록체인 신입개발자 입니다. 저도 솔라나 관련 업무를 진행 중 인데, 작성해주신 글 너무 잘 보았습니다. Rust를 공부해봐야겠네여.. 솔라나 스터디는 어떻게 참여할 방법이 있을까요..??

그리고 질문이 하나 있습니다.

이더리움이나 클레이튼 노드세팅은 거의 흡사해서 geth.ipc, klay.ipc에 접근해서 계정등록을 하고 전송코드를 짤 수 있었는데, 솔라나 같은 경우는 Rust로 솔라나 프로그램을 작성하면 이 프로그램이 node와 소통을 하는 구조인 것인가요? 다른 점이 많아서 이해가 잘 되지 않네요..

2개의 답글