The Rust Programming Language
Rust is a systems programming language that runs blazingly fast, prevents segfaults, and guarantees thread safety.
“The Rust Programming Language” (https://doc.rust-lang.org/stable/book) 의 내용을 기반으로 Rust 프로그래밍을 실습하는 포스팅을 게재해보고자 합니다. 먼저 Rust 시작하기(https://doc.rust-lang.org/stable/book/getting-started.html)입니다.
1. 앞으로 Rust 실습에 사용할 아나콘다 가상환경 설치한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | root@localhost:~# conda create -n envrust python=3.5 anaconda Fetching package metadata: .... Solving package specifications: . Package plan for installation in environment /root/anaconda/envs/envrust: The following packages will be downloaded: package | build ---------------------------|----------------- openssl-1.0.2j | 0 3.2 MB setuptools-27.2.0 | py35_0 526 KB ------------------------------------------------------------ Total: 3.7 MB The following NEW packages will be INSTALLED: anaconda: custom-py35_0 openssl: 1.0.2j-0 pip: 8.1.2-py35_0 python: 3.5.2-0 readline: 6.2-2 setuptools: 27.2.0-py35_0 sqlite: 3.13.0-0 tk: 8.5.18-0 wheel: 0.29.0-py35_0 xz: 5.2.2-0 zlib: 1.2.8-3 Proceed ([y]/n)? y Fetching packages ... openssl-1.0.2j 100% |################################| Time: 0:00:02 1.32 MB/s setuptools-27. 100% |################################| Time: 0:00:01 368.65 kB/s Extracting packages ... [ COMPLETE ]|###################################################| 100% Linking packages ... [ COMPLETE ]|###################################################| 100% # # To activate this environment, use: # $ source activate envrust # # To deactivate this environment, use: # $ source deactivate # root@localhost:~# source activate envrust discarding /root/anaconda/bin from PATH prepending /root/anaconda/envs/envrust/bin to PATH (envrust)root@localhost:~# | cs |
2. Rust를 설치한다.
이하는 우분투 기준으로 플랫폼별 설치는 https://doc.rust-lang.org/book/getting-started.html#platform-support 링크를 참조한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | (envrust)root@localhost:~# curl -sSf https://static.rust-lang.org/rustup.sh | sh rustup: gpg available. signatures will be verified rustup: downloading manifest for 'stable' rustup: downloading toolchain for 'stable' ######################################################################## 100.0% gpg: Signature made 2016년 09월 28일 (수) using RSA key ID 7B3B09DC gpg: Good signature from "Rust Language (Tag and Release Signing Key) <rust-key@rust-lang.org>" gpg: WARNING: This key is not certified with a trusted signature! gpg: There is no indication that the signature belongs to the owner. Primary key fingerprint: 108F 6620 5EAE B0AA A8DD 5E1C 85AB 96E6 FA1B E5FE Subkey fingerprint: C134 66B7 E169 A085 1886 3216 5CB4 A934 7B3B 09DC rustup: installing toolchain for 'stable' rustup: extracting installer install: creating uninstall script at /usr/local/lib/rustlib/uninstall.sh install: installing component 'rustc' install: installing component 'rust-std-x86_64-unknown-linux-gnu' install: installing component 'rust-docs' install: installing component 'cargo' Rust is ready to roll. | cs |
3. Hello! World! 프로그램을 만들어보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | (envrust)root@localhost:~# mkdir ~/projects (envrust)root@localhost:~# cd ~/projects (envrust)root@localhost:~/projects# mkdir hello_world (envrust)root@localhost:~/projects# cd hello_world (envrust)root@localhost:~/projects/hello_world# rustc main.rs error[E0425]: unresolved name `println`. Did you mean the macro `println!`? --> main.rs:2:2 | 2 | println ("Hello, world!") | ^^^^^^^ error: aborting due to previous error (envrust)root@localhost:~/projects/hello_world# rustc main.rs (envrust)root@localhost:~/projects/hello_world# ./main Hello, world! (envrust)root@localhost:~/projects/hello_world# | cs |
※ 윈도우 환경에서는 ~ 가 작동하지 않음에 유의할 것
4. Rust 프로그램의 해부학
Hello World! 프로그램의 생김새를 살펴보자.
fn main() { }
위의 코드는 함수의 기본 구조를 나타낸다. 위의 mian 함수는 특별한 함수로, 모든 Rust 프로그램의 시작을 나타낸다.
특별한 argument 가 있다면 ( ) 사이에 들어가야하고, 함수의 body는 { } 로 감싸야한다.
다음 라인을 살펴보자.
println!("Hello, world!");
println!()은 스크린에 텍스트를 출력해주데, ! 에 주의할 필요가 있다.
println!()은 Rust macro로 함수대신 매크로를 호출한다는 의미이다.
함수라면 !가 없는 prinlin() 의 형태여야 한다.
그리고 "Hello, world!" 는 string 으로 println!의 argument 이다.
5. 컴파일과 실행
실행전에 먼저 컴파일부터 해야한다.
1 | (envrust)root@localhost:~/projects/hello_world# rustc main.rs | cs |
컴파일을 하고 나면 아래와 같이 실행가능한 파일을 생성해낸다.
1 2 | (envrust)root@localhost:~/projects/hello_world# ls main main.rs | cs |
그리고 나서 실행한다.
1 2 | (envrust)root@localhost:~/projects/hello_world# ./main | cs |
Rust는 컴파일되고 난 이후에는 러스트가 설치되지 않은 환경에서라도 실행이 가능한 ahead-of-time compiled 언어다.
6. Hello, Cargo!
Rust 프로젝트를 관리하기 위해 Cargo 를 사용해보자.
Cargo는 아래의 기능을 수행한다.
- building code
- downloading the libraries you code depends on
- building those libraries
Cargo 는 Rust 설치시 같이 설치된다.
1 2 3 | (envrust)root@localhost:~/projects/hello_world# cargo --version cargo 0.13.0-nightly (109cb7c 2016-08-19) | cs |
7. Converting to Cargo
그럼 Hello world 프로그램을 Cargo 로 컨버터해보자.
1) 소스 디렉토리 생성 & 실행파일 제거
1 2 3 | (envrust)root@localhost:~/projects/hello_world# mkdir src (envrust)root@localhost:~/projects/hello_world# mv main.rs src/main.rs (envrust)root@localhost:~/projects/hello_world# rm main | cs |
Cargo 는 소스파일이 src 디렉토리에 있다고 가정한다.
top-level 프로젝트에 해당 디렉토리를 둔다
앞서 만든 main.rs 파일을 소스 디렉토리로 옮기고 컴파일한 main 파일을 삭제한다.
2) 환경설정 파일 생성
Cargo.toml
파일을 만든다(반드시 대문자 C 로 시작해야 한다).
이 파일은 TOML (Tom's Obvious, Minimal Language) 포맷으로, INI 포맷과 유사한 것이다.
package 기본적인 구성은 아래위와 같다.
1 2 3 4 5 | [package] name = "hello_world" version = "0.0.1" authors = [ "Your name <you@example.com>" ] | cs |
프로젝트 루트 디렉토리에 있는 Cargo.toml 파일을 저장하고 Hello World program을 빌드할 준비가 된 것이다.
아래와 같이 빌드한다. Hello, world!
출력되면 정상이다.
1 2 3 4 5 6 | (envrust)root@localhost:~/projects/hello_world# cargo build Compiling hello_world v0.0.1 (file:///root/projects/hello_world) Finished debug [unoptimized + debuginfo] target(s) in 2.33 secs (envrust)root@localhost:~/projects/hello_world# ./target/debug/hello_world Hello, world! (envrust)root@localhost:~/projects/hello_world# | cs |
위에서 cargo build 로 프로젝트를 빌드하고 ./target/debug/hello_world 을 실행하였다.
하지만 cargo run
을 통하면 한 번의 명령으로 가능하다.
1 2 3 4 | (envrust)root@localhost:~/projects/hello_world# cargo run Finished debug [unoptimized + debuginfo] target(s) in 0.0 secs Running `target/debug/hello_world` Hello, world! | cs |
위의 예제에서는 프로젝트를 리빌드하지는 않았다.
Cargo는 변경사항이 없음을 알고, 단지 바이너라 파일만 실행한 것이다.
만약 소스코드를 수정했다면 Cargo는 실행 전 리빌드하고 실행을 하게 된다.
8
. Building for Release
배포준비가 끝났다면 cargo build --release 를 통해서 프로젝트를 최적화할 수 있다.
9. What Is That Cargo.lock?
cargo build 를 실행하면 아래와 같은 Cargo.lock 파일이 생성된다.
1 2 3 4 | [root] name = "hello_world" version = "0.0.1" | cs |
어플리케이션간 의존성 추적을 위해 Cargo는 Cargo.lock 파일을 이용한다.
위의 Hello World 프로젝트의 Cargo.lock 파일은 위에서 보시다시피 아무런 의존관계가 없다.
10. Making A New Cargo Project the Easy Way
새로운 프로젝트를 시작할 때마다 위와 같은 과정을 거칠 필요는 없다.
Cargo를 이용하여 새로운 프로젝트를 시작하기 위해서는 아래와 같이 입력한다.
1 2 | (envrust)root@localhost:~/projects/hello_world# cargo new hello_world --bin Created binary (application) `hello_world` project | cs |
Cargo는 이를 통해 아래와 같이 2개의 파일과 하나의 디렉토리를 생성한다.
이상이 새로운 프로젝트를 실행하는데 필요한 전부이다.
그리고 살펴보면 hello_world 디렉토리를 git 저장소로 초기화했음을 알 수 있다.
'프로그래밍 Programming' 카테고리의 다른 글
Django queryset filter datefield not empty (0) | 2016.10.15 |
---|---|
Git 설치 및 사용준비 (0) | 2016.10.13 |
Django - Error: That port is already in use. (0) | 2016.09.20 |
하스켈 리스트 (0) | 2016.07.10 |
하스켈 함수 호출하기 및 함수 정의하기 (0) | 2016.07.10 |