이번 시간에는 Rust라는 언어를
직접 설치하는 방법을 알아보도록 하겠습니다.
[Rust] Rust란?
러스트(Rust)라는 프로그래밍 언어는 "안전하고, 병렬적이며, 실용적인"언어로 디자인되었으며 동시에 Rust를 사용해서 효율적인 시스템 소프트웨어를 빌드할 수 있고 순수 함수형 프로그래밍,액
koras02.tistory.com
Rust는 아주 예전 포스팅에서 언급했던
안정적이고, 병렬적이며 실용적인 언어로
디자인된 언어입니다.
Rust 설치
Rust를 설치하기 위해서는 3가지
OS에 따라서 설치방법이 다릅니다.
rustupLinux 또는 macOS 설치
Linux or macOS에서 설치하기 위해서는
터미널에서 다음 명령어를 입력합니다.
$ curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh
이 명령어는 스크립트를 다운받고
rustup 안정적인 최신 버전의
Rust를 설치해줍니다.
1) Proceed with installation (default)
2) Customize installation
3) Cancel installation
>1
설치중에 해당 질문이 뜨는데
가장 기본 Rust를 설치해주면 됩니다.
Rust is installed now. Great!
또 Rust가 컴파일된 출력을 하나의
파일로 결합해 주는데 사용하는 프로그램인
링커가 필요합니다
이미 Rust를 설치했다면 가지고 있을 수
있는데 링커 오류가 발생하면
일반적으로는 링커를 포함하는
C컴파일러를 설치해줘야 합니다.
일부 Rust 패키지에서는
C코드에 의존하고 C컴파일러가
필요하기 때문에 AC컴파일러도
유용합니다.
macOS에서는 다음 명령어로
C컴파일러를 얻을 수 있습니다.
$ xcode-select --install
Linux 사용자는 일반적으로
배포하는 배포 문서에 따라서ㅓ
GCC 또는 Clang을 설치해야합니다.
예를 들어 Linux를 사용할 경우
build-essential 패키지를 사용할 수 있습니다.
rustupWindows에 설치
Windows 버전에서는 https://www.rust-lang.org/tools/install
로 이동해서 Rust를 설치해줍니다.
설치 도중 Visual studio 2013이상
MSVC 빌드 도구도 필요하다는
메시지가 뜰 것입니다.
빌드 도구를 얻으려면 Visual Studio 2022를
설치해야 합니다.
설치할 워크로드는 다음과 같습니다.
- C++로 데스크톱 개발
- Windows 10 또는 11 SDK
- 선택한 다른 언어 팩과 함께 영어 언어 팩 구성 요소
설치 확인
Rust가 올바르게 설치되었는지 확인하려면
cmd를 열고 다음 줄을 입력합니다.
$ rustc --version
릴리스된 최신 안정 버전의
버전 정보, 커밋 해시 및 커밋 날짜가
다음 형식으로 표시되면 정상입니다.
rustc x.xx.x (6959499d yyyy-mm-dd)
위 정보가 뜨게 된다면 Rust설치가
완료 된 것 입니다.
이 정보가 보이지 않는다면
시스템 변수에 Rust가 포함되 있는지
확인해야합니다.
Windows에서는 다음 명령어를 사용합니다.
> echo %PATH%
PowerSheel에서 다음 명령어를 사용합니다.
> echo $env:Path
Linux 및 MacOS에서는 다음 명령어를 사용합니다.
$ echo $PATH
위 명령어도 입력했는데도 Rust가 작동하지
않는다면 커뮤니티 페이지에서
도움을 받을 수 있습니다.
업데이트 및 제거
Rust를 새로운 버전으로 설치하려면
아래 명령어를 입력해 줍니다.
$ rustup update
Rust 를 제거하려면 아래 명령어를
입력해 줍니다.
$ rustup self uninstall
로컬 문서
Rust 설치시에는 문서의 로컬 사본도
포함되어 있어 오프라인에서도
읽어 보실 수 있습니다.
실행 시 rustup doc을 입력해
브라우저에서 로컬 문서를 실행합니다.
Hello World 띄우기
이제 Rust를 설치했기 때문에
첫번째 Rust문서를 작성해 보겠습니다.
프로 젝트 디렉토리 생성
Rust 코드를 저장할 디렉토리를 만들어 줍니다.
터미널을 열고 다음 명령어를 입력해줍니다.
$ mkdir projects
$ cd projects
$ mkdir hello_world
$ cd hello_world
Rust 프로그램 작성 및 실행
다음은 새 소스 파일을 만들고
main.rs로 파일을 생성해 줍니다.
Rust의 확장자는 항상 .rs로 끝납니다.
파일 이름에 두 개 이상의 단어를
사용할 경우 규칙은 밑줄을 사용해
구분해야 합니다.
이제 main.rs파일을 만들고
아래 명령어를 입력해 줍니다.
fn main() {
println!("Hello, world!");
}
파일을 저장하고 터미널 창에서
아래 명령어를 입력해 줍니다.
$ rustc main.rs
$ ./main
Hello, world!
Windows에서는 다음 ./main.exe대신
명령어를 입력합니다.
> rustc main.rs
> .\main.exe
Hello, world!
Rust 프로그램 분석
이 "Hello, world!"를 컴토해 보면
fn main() {
}
이 줄은 함수를 정의하는 곳입니다.
main기능은 항상 모든지 실행이
가능한 Rust 프로그램에서
실행되는 첫번째 코드로
main에서 첫 번째 줄은 매개변수가
없고 아무것도 반환하지 않는
이름의 함수를 선언합니다.
매개변수가 있다면 괄호 안에
값이 들어갑니다.
함수 본문에는 { }
Rust에서는 모든 함수 본문
주위에 중괄호가 포함되어야 합니다.
여는 중괄호를 함수 선언과
같은 줄에 배치하고
그사이 공백을 하나 추가
해주는 것이 좋습니다.
함수 본문 main에는 다음 코드가
포함 됩니다.
println!("Hello, world!");
이 줄은 프로그램의 모든 작업을 수행합니다.
화면에 텍스트를 인쇄하는 역할을 하는데
여기서 주목해야할 네가지 세부사항이 있는데
- Rust 스타일은 탭이 아닌 네 개의 공백으로 들여쓰기
하는 것. - println!은 Rust 매크로를 호출합니다.
대신 함수를 호출했다면 prinln으로 입력합니다.
! 는 일반적인 함수 대신 매크로를 호출하고 매크로가
항상 함수와 동일한 규칙을 따르지 않는다는 것을 의미 - "Hello, world!" 문자열이 보입니다.
이 문자열을 인수로 전달하면 문자열이
println! 화면에 출력 됩니다. - 세미콜론( ; )으로 행을 종료합니다. 이는 이 표현이 끝나고
다음 표현을 시작할 준비가 되었음을 나타냅니다.
대부분의 Rust 코드 줄은 세미콜론으로 끝납니다.
컴파일과 실행은 별도의 단계
방금 새로 만든 프로그램을 실행했으므로
프로세스의 각 단계를 살펴보겠습니다.
rustc로 Rust 프로그램을 실행하기 전에
다음과 같이 명령을 입력하고
소스 파일의 이름을 전달 하여
Rust 컴파일러를 사용해 컴파일해야 합니다.
$ rustc main.rs
gcc C또는 C++배경 지식이 있을 경우
이것이 또는 clang과 유사하다는 것을 알 수
있습니다.
Linux, macOS 및 Windows에서는
ls 명령어로 실행파일들을 볼 수 있습니다.
$ ls
main main.rs
Linux 및 macOS에서 두 개의 파일이 표시됩니다.
Windows에서 PowerShell을 사용할 시 CMD를 사용하여
볼 수 있는 것과 동일한 세 개의 파일이 표시됩니다.
> dir /B %= the /B option says to only show the file names =%
main.exe
main.pdb
main.rs
여기에는 확장자 .rs 인 소스 코드 파일
실행파일, Windows를 사용하는 경우
확장자가 .pdb인 디버깅 정보가 포함된
파일이 표시됩니다.
여기서 다음 명령어로 main또는 main.exe
파일을 실행합니다.
$ ./main # or .\main.exe on Windows
main.rs가 "Hello,world"일 경우 프로그램에서는
이줄을 Hello, world로 터미널에 인쇄됩니다.
Hello, Cargo!
Cargo는 Rust의 빌드 시스템이자 패키지 관리자 입니다.
대부분의 Rustaceans는 이 도구를 사용해
Rust 프로젝트를 관리합니다.
그 이유는 Cargo가 코드 빌드나 코드가 의존하는
라이브러리 다운로드, 해당 라이브러리 빌드와
같은 많은 작업을 처리하기 때문인데
우리가 지금까지 작성한 것과 같은
가장 단순한 Rust 프로그램은 종속성이 없습니다.
"Hello, world!"를 Cargo로 프로젝트를 만들면
코드 빌드를 처리하는 Cargo의 일부만 사용합니다.
더 복잡하게 Rust 프로그램을 작성하면서
종속성을 추가하게 되고 Cargo를 사용하여
프로젝트를 시작하면 종속성을 추가하는 것이
더욱 쉽게 느껴질 것입니다.
대부분 Rust 프로젝트가 Cargo를 사용하기 때문에
Cargo를 사용하고 있다고 가정합니다.
$ cargo --version
Rust를 설치하면 Cargo가 추가로 설치됩니다.
위 명령어로 cargo 버전이 뜨면
Cargo가 설치되 있는 것 입니다.
Cargo로 프로젝트 만들기
Cargo를 사용하여 새 프로젝트를 만들고
원래 "Hello, world!"와 어떻게 다른지
살펴보겠습니다.
프로젝트 디랙토리로 다시 이동해
다음 명령어를 실행해 줍니다.
$ cargo new hello_cargo
$ cd hello_cargo
첫 번째 명령어는 hello_cargo라는
새 디렉토리와 프로젝트를 만드는 명령어입니다.
우리가 프로젝트이름을 hello_cargo라 지정하고
Cargo와 같은 이름의 디렉토리에 파일을 생성해줍니다.
hello_cargo 디렉토리로 이동해 파일을 나열하고
Cargo가 두개의 파이롸 하나의 디렉토리를
생성했습니다. Caro.toml 파일과 main.rs파일이 있는
src 폴더를 생성했습니다.
또 .gitnore 파일과 함께 새로운 Git 레포지토리를
초기화 했습니다.
cargo new로 기존 git 레포지토리 내에서
실행 할 경우 Git 파일이 생성되지 않습니다.
아래 명령어를 사용해 이 동작을 재정의 할 수 있습니다.
$ cargo new --vcs=git.
선택한 텍스트 편집기에서 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(Tom's Obvious, Minimal Lanaguage) 형식입니다.
첫 번째 [package]는 다음 문이 패키지를
구성하고 있을을 나타내는 섹션 머리글 입니다.
이 파일에 더 많은 정보를 추가혀면
다른 섹션도 추가할 것입니다.
다음 세 줄은 Cargo가 프로그램을 컴파일하는 데
필요한 구성 정보를 설정합니다.
마지막 줄 [dependencies]는 프로젝트의
종속성을 나열하느 섹션의 시작 부분입니다.
Rust에서는 코드 패키지를 crates라고 합니다.
이제 src/main.rs를 열고
fn main() {
println!("Hello, world!");
}
Cargo에는 "Hello, world!" 첫번째 프로젝트
작성한 것과 같은 프로그램입니다.
지금까지 우리 프로젝트와 Cargo가 생성한
프로젝트의 차이점은 Cargo가 src 디렉토리에
코드를 배치하고 최상위 디렉토리에 Cargo.toml
구성 파일이 있다는 겁니다.
Cargo는 소스 파일이 src 디렉토리 안에 있을
것으로 예상하고, 최상위 프로젝트 디렉토리는
README 파일, 라이센스 정보,
구성 파일 및 코드와 관련되지 않은 모든 항목을
위한 것입니다. Cargo를 사용하면 프로젝트를
정리하는 데 도움이 됩니다.
모든 것을 위한 장소가 있고 모든 것이
제자리에 있습니다.
"Hello,world"에서 했던 것처럼 Cargo를
사용하지 않는 프로젝트를 시작한 경우
프로젝트에서 Cargo를 사용하는
프로젝트로 변환할 수 있습니다.
프로젝트 코드를 src 디렉토리로 이동하고
적절한 Cargo.toml 파일을 생성합니다.
Cargo 프로젝트 구축 및 실행
이제 "Hello, world!"를 빌드하고 실행할 때
무엇이 다른지 살펴보겟습니다.
Cargo 디렉토리에서 다음 명령을
입력해 프로젝트를 빌드합니다.
$ cargo build
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
이 명령어는 현재 디렉토리가 아닌
target/debug/hello_cargo(또는 Windows의 경우
traget/debug/hello_cargo.exe)에 실행 파일을
생성합니다.
기본 빌드가 디버그 빌드이기 때문에 Cargo는
debug라는 디렉토리에 바이너리를 넣습니다.
다음 명령으로 실행 파일을 실행 할 수 있습니다.
$ ./target/debug/hello_cargo or ./target/debug/hello_cargo.exe or windows
Hello, world!
모든 것이 자 되면 Hello, world!를 터미널에 인쇄합니다.
처음으로 cargo build를 하면 Cargo가 최상위 레벨에
새 파일인 Cargo.lock을 생성하게 됩니다.
이 파일은 포로젝트의 정확한 종속성 버전을
추적합니다.
이 프로젝트에는 종속성이 없으므로 파일이
약간 희박합니다. 이 파일은 수동으로
변경할 필요가 없습니다.
방그 프로젝트를 Cargo build로 실행
했지만 cargo run을 통해
코드를 컴파일한 다음
파일을 명령 하나로 실행할 수 있습니다.
$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `target/debug/hello_cargo`
Hello, world!
cargo run 바이너리에 대한 전체경로를 실행하는
cargo build을 사용하는 것보다 Cargo run 사용합니다.
이번에는 Cargo가 컴파일 중임을 나타내는 출력이
표시되지 않았는데 hello_cargo
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는 cargo check명령어를 제공합니다.
이 명령어는 코드를 신속하게 검사하여
컴파일 되지만 실행파일은 생성하지 않습니다.
$ cargo check
Checking hello_cargo v0.1.0 (/home/koras02/study/rust/projects/hello_world/hello_cargo)
Finished dev [unoptimized + debuginfo] target(s) in 0.07s
실행 파일을 원하지 않는 이유는 cargo_check이 훨씬 빠르고
cargo build가 더 느린데
그 이유는 이 커맨드가 실행파일을 생성하는
단계를 생략하기 때문입니다.
만약 코드를 작성하는 동안
작업물을 검사하는 중이라면
cargo check를 이용하는 것이
그 과정의 속도를 높여줄 것 입니다.
그런 이유로, 많은 러스트 개발자들이
자신들의 프로그램을 작성하면서
이것이 컴파일 되는지 확인 하기 위해
주기적으로 cargo check를 실행합니다.
그런 다음 실행 파일을 사용할 준비가
되었을 때 cargo build를 실행합니다.
- cargo build나 cargo check를 사용해 프로젝트를 빌드할 수 있습니다.
- cargo run을 사용해 단숨에 프로젝트를 실행할 수 있습니다.
- 우리 코드가 있는 동일한 디렉토리에 빌드의 결과물이 저장되는 대신
cargo는 이를 target/debug 디렉토리에 저장합니다.
Cargo를 사용하면 생기는 추가적인 장점은 어떠한 운영체제로
작업을 하든 상관없이 커맨드들이 동일하다는 점입니더ㅏ.
따라서 이러한 점 때문에 우리는
더 이상 Linux와 macOs 및 Windows를 위한
특정 명령을 제공하지 않을 것입니다.
릴리즈 빌드
이제 프로젝트가 마침내 배포(릴리즈)를 위한
준비가 되었다면
cargo build --release
를 사용해 최적화와 함께 이를
컴파일 할 수 있습니다.
이 커맨드는 target/debug 대신
target/release에 실행파일을 생성합니다.
최적화는 여러분의 러스트 코드를 더
빠르게 만들어주지만
최적화를 켜는 것은 여러분의
프로그램을 컴파일하는데 드는 시간을
길게 할 것입니다.
이것이 바로 두 개의 서로 다른 프로파일이
있는 이유로 하나는 여러분이
빠르게 그리고 자주 빌드하기원하는 개발용
그리고 다른 하나는 반복적으로 다시 빌드할
필요 없고 가능한 빠르게 실행되
여러분이 사용자들에게 제공할 최종 프로그램을
빌드하기 위한 용도입니다.
만일 여러분이 코드의 실행 시간을 벤치마킹 중
이라면 cargo build --release를 실행하고
target/release를 실행하고
target/release의 실행 파일을 가지고 벤치마킹을
하고 있는지 확인 해봅시다.
관계로서의 Cargo
단순한 프로젝트와 함께 Cargo를 사용하는 것은
그냥 rustc를 이용하는 것에 비해 큰 가치를
제공해주지는 못하지만, 여러분의
프로그램이 점점 더 복잡해질수록 Cargo는
자신으 가치를 증명할 것 입니다.
여러개의 크레이트들로 구성된 복잡한
프로젝트와 함께라면 Cargo가 빌드를 조직화
하도록 하느것이 훨씬 쉽습니다.
정리
이제 러스트를 배우기위한 여정을 정리해보겠습니다.
- rustup을 사용해 최신버전의 안정화된 러스트 설치
- rustc를 직접 사용해 "Hello, world" 프로그램 작성후 실행
- Cargo를 이용해 새로운 프로젝트 만들고 실행
- 로컬에 설치된 문서 열기
- Rust 최근 버전 업데이트
참고자료
GitHub - Koras02/Rust-Hello_world
Contribute to Koras02/Rust-Hello_world development by creating an account on GitHub.
github.com
시작하기 - The Rust Programming Language
여러분의 러스트 여정을 시작해봅시다! 이 장에서는 다음을 다룰 것입니다: Linux, macOS, Windows에 러스트 설치하기 "Hello, world!"를 출력하는 프로그램 작성하기 러스트의 패키지 매니저이자 빌드 시
rinthel.github.io
'백엔드 > Rust' 카테고리의 다른 글
[Rust] Rust 개념 - 1.보편적인 프로그래밍 개념 - 변수와 가변성 (0) | 2023.01.11 |
---|---|
[Rust] Rust 추리 게임 만들기 (0) | 2023.01.11 |
[Rust] Rust란? (0) | 2022.02.24 |