본문 바로가기
2. Back-end/>> Rust

C가 주옥같은 개발자들 보세요. Rust 10분 정리!

by 블록메타 2023. 1. 18.
노마드 코더 Nomad Coders

 

오늘은 모든 개발자들이 반드시 시도해봐야 하는 프로그래밍 언어를 소개할까해요. 그것은 러스트!!!

 

러스트는 스택오버플로우 설문조사에서 6년 연속!! 가장 사랑받는 프로그래밍 언어로 뽑혔어!

 

 

C, C++ 에 비교하여 상당히 신생 언어임에도 불구하고 아마존, 클라우드플레어, 마이크로소프트 같은 회사들이 C, C++ 코드를 Rust로 대체하고 있어. 

 

 

MS는 low level언어를 사용하던 윈도우 구성요소를 Rust로 대체하였어. 기존의 C, C++에서 말이지. 

 

 

구글은 리눅스 커널의 제 2 공식 언어로 Rust를 포함시키는 프로젝트를 후원하고 있지.  Rust를 포함시키는 프로젝트를 후원하고 있지. 

참고로 현재 리눅스 커널은 C로 운영되고 있어. 

 

인텔도 역시 Rust에 투자하고 있는데 인텔의 수석 엔지니어는 Rust를 "시스템 프로그래밍의 미래"라고 부르고 "C를 새로운 어셈블리"하고 부르고 있지.  여기서 '어셈블리'란, 더이상 아무도 쓰지않는 언어를 의미해.

 

Rust는 또한 친환경적이야. Rust 그리고 C는 자바보다 에너지 효률이 50% 높고 무료 파이썬보다는 에너지 효율이 98% 높아.

 

 

또한, Rust는 C, C++보다 더 안전하기도 해!

MS는 C, C++ 대신 Rust를 사용했다면 보안 취약점이 70%나 줄어들었을 것이라고 말했어. Rust는 또한 개발자 경험이 정말 최고임을 자랑해. 이는 컴파일러 덕분이지. 작업해본 컴파일러 중 가장 최고를 갖고있어. Rust의 컴파일러는 코드에 오류가 있다는 것을 알려주고, 왜 오류가 있는지 어떻게 이를 고칠 수 있는지 알려주고 고칠 수 있는 코드를 제시하기도 해!

 

자. 이제 Rust에 대한 궁금증이 생겼다면 계속 글을 읽어줘.

 

무엇때문에 C처럼 빠른 것인지. 더 안전한 이유가 무엇인지.  여기서 "안전"하다는 것이 뭔말인건지. Rust로 무엇을 만들 수 있는지

누가 Rust를 배워야하는지.

 

Rust코드와 컴파일러를 살펴보도록 할께!

 

Rust는 low level 프로그래밍 언어로 "빠르고" "안전한것"에 초점이 맞춰져 있어. 

 

Fast 

+

Safe

 

여기서 "low level"의 듯을 알아보자.

 

Low level 프로그래밍 언어는 기계와 매우 근접해. 반대로 High level 프로그래밍 언어는 개발자와 가깝지!

사람이 말하는 것과 비슷하거든

 

기계에 가장 근접한 방식은 0과 1로 작성하는 거야. 하지만 누구도 그렇게 코딩을 안하지.

어셈블리코드는 프로세서에 대한 명령이야  하지만 이 또한 더이상 하지 않아. 

 

그래서 그 보다 높은 단계인 C, C++ 언어가 존재하는 거야. 그 다음 단계가 Java 일 것이고, 아마도 가장 높은 수준이 바로 JS, Python이야. 

 

언어를 높고 낮은 수준으로 만드는 것은 개발자가 작성하는 코드와 컴퓨터가 이해하는 0과 1사이에 얼마나 많은 추상화 계층이 있는가에 따라 달라져. 예를 들어, 브라우저의 JS를 보면, 이는 컴파일된 언어가 아니고 JS 그리고 0과 1 사이에 여러 추상화 계층이 있어. 

 

왜냐면 JS는 일단 브라우저에 의해 읽고, 해석되어야 하거등. 

그리고 브라우저는 C 혹은 C++로 프로그래밍 되어있고, 따라서, 브라우저가 코드를 읽고 코드를 실행한 후 그 다음 프로세서에게 무엇을 할지 명령하지.

 

 

 

보시다시피 너가 작성한 코드와 기계 사이에 절차가 많아. 

파이썬도 마찬가지야. 

 

파이썬의 인터프리터는 C로 작성되어 있지.

파이썬으로 코딩을 하고 실행하면 이는 즉 너의 파이썬 코드를 C프로그램에게 주는 것이고 C는 이를 이해한 후 다시 C 프로그램은 프로세서에게 명령하는 것이지. 반대로 Rust, C와 같은 low level 언어는, 이와 같은 인터프리터나 중간자가 필요없어. 

 

왜냐면 C 혹은 Rust로 코딩하고 컴파일 하면 이는 프로세서가 바로 이해할 수 있거등.  즉 너의 코드와 기계사이에 중간자가 없는 것이야. 

 

따라서 기계에 더 가깝기 때문에 중간자 인터프리터가 필요없고 덕분에 우리의 프로그램은 더 빨리 실행되겠지!

즉 코드가 더 강력해짐을 의미해!

 

기계에 정말 근접했기 때문이야. 하지만, 이는 동시에 조심해야한다는 뜻도 돼.

스파이더맨에서 나오듯이 "큰 힘에는 큰 책임이 따른다" 

C와 같은 low level 언어에서는 직접 메모리를 관리해야 하는데 예를들어, 문자열을 저장할 변수를 만들려면 해당 텍스트를 넣을 공간을 메모리에 요청해야하며, 또한 필요한 작업을 마치면 해당 메모리의 공간을 다시 풀어줘야해.

이렇게 풀어주는 작업을 하지않고, 계속 차지만하면 프로그램 메모리가 꽉차서 고갈될 수 있어. 

만약 파이썬 자바스크립트만 해왔다면 이러한 개념들이 꽤나 낯설거야.  JS, 파이썬에서 변수를 만들때는 그냥 변수를 만들지 메모리에 공간을 요청한다거나 그런 것 없이 그냥 변수를 만들면 되거든. 해당 작업을 다 하고나면 뭐 그냥 냅두지.

 

메모리 공간을 비우거나 그런 작업은 안해

 

JS, Python이 마법적이여서 메모리가 고갈되지 않는 것이 아니라 뭔가 마법적인 것이 아니라 뒤에서 작업을 하고 있거든

Garbage Collector가 작업을 하고 있어. 

 

우리를 위해 뒤에서 이러한 메모리 관리를 하고 있어. Garbage Collector는 일종의 프로그램인데 프로그램이 실행되는 동안 이를 모니터링 하면서 어떤 변수를 만들고 더이상 사용하지 않는지 살펴보고 있어. 

변수가 더이상 코드에서 사용되지 않으면, 이는 '쓰레기'이므로 해당 공간이 메모리에서 제거되는 것이지.

 

프로그램밍 언어가 'Garbage Collector' 를 갖고 있으면, 개발자에게는 너무너무나 편한 부분이 있어. 메모리 할당이니 뭐니 고민을 안해도 되니까 

 

그러나! 덕분에 해당 프로그램은 빠르게 실행되지 않을 것이야. C와 같이 'Garbage Collector'가 없는 언어에 비교해서 말이지. 바로 이 이유 때문에 디스코드가 Go에서 Rust로 언어를 바꿨어!  

 

Go는 'Garbage Collector'가 있지만 Rust는 없어.

디스코드는 이 'Garbage Collector' 때문에 퍼포먼스 성능이 떨어졌다고 해. 

 

C, Rust는 'Garbage Collect' 기능이 없어서 덕분에 속도가 빠르지만, 이는 동시에, 개발자들이 메모리에 접근할때 조심해야 해

 

MS는 보안 문제의 70%가 메모리 엑세스와 관련 있다고 했어. 메모리 엑세스 버그는 할당되지 않은 메모리 장소에 접근하거나 혹은 이미 해제된 메모리 부분에 접근하려고 하거나, 또는 할당된 변수를 두번 해제하려고 할때 버그가 발생해. 

 

이러한 실수는 사실 자주 일어나고, 이는 곧 런타임 에러로 이어질 수 있지. 바로 이러한 케이스에서 Rust가 빛나지!

 

해당 이유 때문에 회사들이 Rust를 좋아해.  뭐 C보다 느릴 수 있고, C++보다 느릴 수 있지만, 하지만, 그들보다 안전하거든!

거의 비슷한 퍼포먼스를 제공하는 동시에 말이야.

 

Rust에서는 'Garbage Collect'는 없지만, 그러나 메모리를 수동으로 할당하거나, 해제할 필요가 없어. 왜냐면, Rust에서는 메모리를 다루는 방식이 다르거든. 바로 '소유권'이라는 컨셉 때문이야!

 

'소유권'은 Rust로 작업하는데 가장 중요한 컨셉이야. 프로그램의 데이터에 대한 생각과 관념이 매우 달라!
JS, Python, Go 혹은 C보다도 말이지!

 

'소유권'이라는 컨셉에서는 프로그램의 데이터는 변수에 의해 소유됨
데이터는 한번에 한 소유자에 의해서 소유될 수 있어. 소유자가 더이상 사용되지 않는다면 데이터는 메모리에서 자유로워지는 것이지.     맞아. 이해하기 어려워.

 

특히 Go, Python, JS와 같은 언어를 쓰다가 오면, 더더욱 이해하기가 어려울 것이야. 

이 영상에서 소유권을 100% 설명하진 않겠지만, 소유권이 어떻게 생겼는지 몇개 코드를 보여줄게. 

 

여기 2개의 함수를 갖고 있는 Rust 코드가 있어. 


fn say_hi(name:String) {
   println!("Hi {}!", name);
}

fn main() {
  let my_name = String::from("니꼬");
  say_hi(my_name); 
  println!("a is equals to {}", my_name);
}

 

메인함수는 'my_name'이라는 변수를 갖고 있고, 이는 '니꼬'란느 텍스트를 갖고있어.
그리고 메인함수는 'say_hi'함수를 부르고 있어. 그리고 my_name을 인수로 보내고 있어.
'say_hi' 함수에선는 "Hi" 그리고 우리가 전달한 이름을 프린트 할꺼야. 그런다음 메인 함수로 돌아가서 
my_name 변수를 한번 더 프린트 할꺼야.

 

자, 그렇다면, 코드 실행 후 결과는 어떻게 될까?

 

문자열  있는 변수가 있고, 함수는 그 변수를 콘솔에 프린트하고, 해당 작업이 끝나면, 해당 변수를 한번 더 콘솔에 프린트 할꺼야. 

 

우리가 JS, Python, Go 개발자였다면, 이와 같은 아웃풋을 기대할꺼야.

 

하지만 Rust는 세상에 그렇지 않아! 이는 아예 컴파일 되지 않을꺼야.

왜냐면, 'say_hi' 함수를 부른 후에 my_name변수를 인수로 하여 문자열이 '니꼬'인 데이터가 복사가 아니라. 이동하게 될꺼야.

my_name 변수에서 say_hi 함수로 말이지!

 

이제 'say_hi'함수는 니꼬 문자열의 소유자가 된거지.

메인 함수의 my_name변수는 다시는 사용될 수 없어. 

 

'소유권'에서 보다시피, 프로그램에서 데이터가 어떻게 움직이는지 생각해야 해. 

우리가 익숙한 방식이 아닌 다른 방식으로 말이지!

그때문에 Rust 배우는건 쉽지 않아. 

 

꽤나 배우기가 어려운 언어에 속해.

 

Go를 배울땐, 한 1주일이면, 꽤나 적응이 되었는데 Rust의 경우는 쓰고는 있어도 익숙해지는데에는 시간이 걸리는 것 같아. 

 

다행스럽게도, Rust 컴파일러느 진짜 도움이 많이 돼

실수를 하면 이를 고치는걸 도와줘.

 

어떻게 고쳐야하는지 코드를 제시해주니까! 정말 어썸해!

 

예를 들어, 소유권 오류가 있는 코드를 실행하려고 하면, 

 

 

어떻게 변수가 생성되었는지 어디로 이동했는지 어디서 실수를 했는지 등을 알려줘

또한 예를들어 Rust 초보라서 콘솔에 숫자를 찍으려고 하면, 화면과 같이 아마 에러가 뜰꺼야.

하지만 그 에러 메시지가 어떻게 고쳐야하는지 다 알려줘.

 

어디서 에러가 생겼는지, 이를 고치기 위해 필요한 코드도 딱 제시해줘!

 

자, 그렇다면, Rust로 무엇을 만들 수 있을까.

 

개인적으로 Solana, Polkadot과 같은 블록체인 프로젝트의 스마트 컨트랙 구축에 사용하고 있어. 다방면에 rust를 활용할 수 있지!

Rust를 사용하여 커맨드라인 인터페이스를 만들고 Rust로 백엔드를 만들고 Rust로 임베디드 소프트웨어를 위한 코드를 작성하고 Rust로 비디오 게임 엔진을 만들고, Rust와 WebAssembly를 사용하여 웹 애플리케이션을 만들 수도 있어~

 

물론, 할 수 있다고, 다 할 필요는 없지.

업무에 가장 적합한 도구를 사용해야해.

 

속도, 안정성, 정확도를 찾고 있다면 Rust가 좋은 선택이라고 생각해. 

특히 이미 너가 개발자이고, 배울 시간이 있다면 말이야.

 

그러나, 프로그램의 속도가 아니라 개발 속도를 찾고 있다면, 파이썬, JS보다는 빨랐으면 좋겠다면, 이 경우에는 Go가 합당한 선택이라고 생각해. 

 

Rust에서는 코드가 정말 빨리 실행되고, Go에서는 개발 속도가 빨라지지!

 

지금 당장 Rust를 배워야할 이유가 없다 하더라도 만들고싶은 백엔드나 게임이나 블록체인 등등이 없다하더라도 지금 당장 Rust를 배워야할 이유가 1도 없다하더라도 적어도 몇주는 Rust를 배워보는걸 강추할께. 왜냐면 Rust는 너를 더 좋은 개발자로 만들어줄꺼야. 일단 엄청나게 빠른 언어에 접근할 수 있고, 덕분에 겁나 빠른 소프트웨어를 제작할 스킬이 생기고, 또한 Rust를 배우면, 다른 프로그래밍 언어에도 도움이 돼

 

예를 들면, Rust에 '소유권' 개념을 배우고 난 후에 다른 프로그램밍을 할 때, 더 좋은 개발자가 되었어. 

내 코드를 좀더 정리된 방식으로 접근하게 돼.

 

데이터를 다른 방식으로 생각하게 되고 말이야. 

 

Go, JS와 같이 '소유권' 개념이 없는 곳에서도 그러한 규칙을 따르고 있는 나 자신을 발견했어. 해당 '소유권' 개념이 존재하는 것처럼 행동하게 되더라고. 

 

왜냐면 덕분에 코드를 정리하기 편하더라구. 

 

내 어플리케이션의 데이터 플로우를 좀더 체계적으로 접근하게 되었어. 

뭐 여기까지는 내 생각이구! 여러분의 생각이 궁금해!

 

 

 

 

 

 

Reference

https://www.youtube.com/watch?v=w1dlmOjDLX8

댓글