솜사탕맛 사과
49
2022-07-26 03:07:58 작성 2022-07-26 14:33:19 수정됨
4
843

Rust 언어에 대해 알아보았다. (노마드코더 영상 내용 정리)


🟪 C와 C++의 대체 언어로 각광 받고 있다.

다른 언어와 비교하여 최고 수준으로 편리한 컴파일러와 소유권 개념 도입으로 보장되는 강력한 안전성과 빠른 속도 덕분에 C와 C++을 대체하는 언어로 각광 받고 있다.

예시로 아마존, 클라우드플레어, 마이크로소프트 같은 회사들이 C와 C++로 된 코드들을 Rust로 대체하고 있다.


🟪 Row level language , System programming

RUST는 row level language로서 system programming에 가깝다.
assembly language 바로 그 다음의 단계에 있는 저수준 언어이다.
java 그리고 특히 js와 python와 비교하면 아주 저수준 언어인 것이다.

rust의 강점은 fast와 safe이다.


🟪 fast

🔶 중간단계가 없다

java는 class파일로 변환 후 컴퓨터가 기계어로 읽을 수 있게 된다.
(더 많은 단계가 있겠지만 아주 간단하게 설명하자면 말이다.)
python언어는 C언어로 이해된 후에 컴퓨터가 기계어로 읽을 수 있게 되는 것이다.

Rust는 java, python, js와 같이 컴퓨터가 기계어로 읽기 전에 거치게 되는 중간 단계가 없기 때문에 속도가 빠른 것이다.

🔶 garbage collector가 없다

그리고 또한 garbage collector가 없기 때문에 빠르다.
c언어와 같은 저수준 언어는 변수를 만들 때 메모리 할당을 요청하고 더이상 쓰이지 않을 때는 메모리 공간 해제를 해야한다.
그러나 java, js, python같은 고수준 언어에서는 이렇게 할 필요가 없는 데 이는 garbage collector가 있기 때문이다. garbage collector는 쓰이지 않는 데이터가 메모리 공간에 있는지 늘 탐색하고 있다. 그리고 해당 공간을 발견하면 삭제한다. garbage collector가 이러한 일을 하기 때문에 개발자에게는 편리함을 주는 반면 프로그램의 성능은 느려지게 만드는 것이다.
그래서 garbage collector가 없는 언어들이 있는 언어들보다 빠른 것이다.

🟪 safe

Ownership 개념 덕분에 Memory Access Bug로부터 안전하다!

보안 문제의 70%가 메모리 엑세스와 관련이 있다. ➡️ 그렇게 때문에 Rust가 안전하다는 것이다.

Memory Access Bug는 할당되지 않은 메모리 장소에 접근하거나, 이미 해제된 메모리 부분에 접근하려고 하거나, 또는 할당된 변수를 두 번 해제할려고 할 때 발생한다. 이는 곧 Runtime Error로 이어질 수 있다.

이 문제 때문에 Rust가 인기가 많은 것이다.
Rust는 C와 C++보다 느리더라도 거의 비슷한 퍼포먼스를 제공할 뿐만 아니라 더욱 안전하다.

그 이유는 Rust는 프로그램의 데이타에 대한 관념이 다르기 때문이다.
그것이 바로 소유권 Ownership이라는 개념이다.


소유권 [ Ownership ] 이라는 개념에서는 프로그램의 데이터는 변수에 의해 소유된다. 그리고 데이터는 한번에 한 owner에게만 소유된다. Owner가 더이상 사용되지 않는다면, 데이터는 메모리에서 제거된다.


Ownership
Owner = 변수
하나의 Owner( 변수 )에게 한번만 사용된다.
그리고 바로 메모리에서 제거된다.
with the concept of ownership , the data of your program is owned by variables.
the data can only be owned by one owner at a time.
if the owner is not is scope or used anymore the data in dropped from memory.

🌟 예시 코드 🌟



main함수는 my_name 이라는 변수를 갖고 있다.
그리고 main함수는 say_hi라는 함수를 부르는데 my_name 변수를 인수로 보낸다.

그리고 say_hi함수에서 인수로 받은 my_name 변수를 프린트한다.

모든 걸 완료한 후 main함수로 돌아와서 my_name변수를 한번더 프린트 한다.

❓❔ 결과는 어떻게 될까

java, python 같은 언어를 하는 사람들은
🧔🏻‍♀️ : "만약 my_name변수에 니꼬라는 문자열 값이 할당되어 있다면
『hi 니꼬!
a is equals to 니꼬』 이렇게 출력이 되는 결과가 나타나겠지!!"

Rust에선 어림도 없다구❗❕

➡️ 실제 결과로는 이렇게 나온다 ❗


🙀 : 앵?? 왜 두번째 print함수는 출력되지 않은거야??!!!

my_name에 니꼬가 할당되었고, data 니꼬가 my_name 변수에서 say_hi함수로 이동함으로서 say_hi함수는 data 니꼬의 owner가 된다. 이 순간 부터 main함수의 my_name변수는 사용할 수 없게 된다.


🟪 어디에 쓰일 수 있을까?

  • 블록체인 프로젝트의 스마트 컨트랙 구축
  • 커맨드라인 인터페이스
  • 백엔드
  • 임베디드 소프트웨어
  • 비디오 게임 엔진
  • 웹 애플리케이션
    등등등



✍🏻 이 글의 모든 내용과 사진들의 출처

노마드 코더의 Rust 설명영상

0
  • 댓글 4

  • 인그니야
    1k
    2022-07-26 10:00:03

    Ownership 예시는 Rust가 C/C++보다 더 Memory safe하다는 걸 설명하긴 부적절해보여요.

    저 예시는 C/C++에서는 당연한건데....

  • 솜사탕맛 사과
    49
    2022-07-26 14:30:58

    @인그니야

    지식을 가르쳐 주셔서 감사합니다!!

    이 글은 유투브 영상 보고 그것을 정리한 글이라서 부족한 점이 많습니다

    알려주신 거를 좀 더 찾아봐야겠어요 ㅎㅎ

  • Minsu Chae
    511
    2022-07-26 16:23:03

    결과적으론 맞지만 잘못된 부분이 있어 지적합니다.

    🔶 중간단계가 없다

    => 프로그래밍 언어는 크게 분류하면 인터프리터 형식과 컴파일 형식이 있습니다.

    대표적인 컴파일 언어가 C, C++, Java, C# 등이 있습니다. 대부분의 컴파일 언어는 기본적으로 빌드된 결과물이 어셈블러나 기계어로 변환되지만, Java, C# 등과 같이 크로스 플랫폼을 고려한 언어의 경우에는 중간 언어로 변환되기도 합니다. Java나 C#은 컴파일이라는 과정을 함에도 불구하고 다시 JVM과 같이 다시 인터프리터 형식으로 수행되므로 수행시간이 느려집니다. 자연스럽게 그에 따라서 JIT(Just in Time) 과 같이 다시 인터프리터 하는 방식이 느리니 이를 개선할 방안이 연구가 되었습니다. 그에 따라서 중간 언어로 컴파일된걸 수행시키면 다시 JVM 등을 통해 어셈블러나 기계어로 대응하여 컴파일을 수행합니다.

    인터프리터 언어는 Python, Javascript 등이 존재합니다. 인터프리터는 수행할 때 라인별로 실시간으로 변환됩니다. 그렇기 때문에 오래 걸린다는 단점이 있습니다. 성능 면에서 보면 안좋을 것 같은 인터프리터 언어들이 존재하는 이유는 컴파일하는 언어들은 프로그램 수정 후 반드시 컴파일이라는 과정을 거쳐야지만 수정사항이 반영되는데, 인터프리터는 소스 코드만 변경되면 알아서 변경된 것으로 수행하기 때문입니다.

    🔶 garbage collector가 없다

    =>garbage collector 가 있다고 프로그래밍 언어가 느린 것이 아닙니다. 대부분 느려지는 현상이 발생하는 건 사용가능한 메모리가 꽉차서 이를 해결하기 위할 때 느려지는 것입니다. C나 C++처럼 Rust가 성능이 좋은 것은 이러한 low level 언어이기 때문입니다. 직접 개발자가 메모리를 관리할 수 있다는 점때문에 효과적으로 삭제할 수 있죠. C++ 에서는 스마트 포인터를 통해 동적 할당하는 것을 만약에 다른 객체가 사용하지 않으면 동적 할당 해제할 수 있게끔 제공하는데 이를 쓰더라도 급격하게 느려지지 않습니다. garbage collection이 오래 걸리는 이유는 모든 객체에 대해 실제로 사용하고 있는지 검사를 하기 때문입니다. 그리고 garbage collector는 매번 수행중이 아니고, 메모리 부족하거나 강제로 호출할 때 수행됩니다.

    Java 등이 느린 이유는 garbage collector를 쓰기 때문이 아닙니다. Java의 경우 컴파일을 하지만 중간 단계로 치환되고 이를 다시 컴파일 하기 때문입니다.

    그리고 프로그래밍 수행 속도 측면에서 더 언급하자면 50ms 이하로 수행시간이 매우 중요한 업무도 있겠지만, 많은 프로그램들이 모두 그 정도로 요구되는 것은 아닙니다. 각 상황에 맞게 필요한 것입니다.

    프로그램 수행 속도가 중요한 지표로 사용되는 곳은 여전히 어셈블러나 C와 같은 저수준 언어를 다루고 있고, 그러니 Rust라는 것도 고려대상에 속할 수 있는겁니다. 모든 곳을 Rust가 대체하진 못합니다.

    프로그래밍 언어 하나보다 거기서 사용할 수 있는 프레임워크나 라이브러리가 무엇이 있는지가 더 중요합니다.

    그리고 전통적으로 C언어가 빠르고 Python과 같이 인터프리터 언어들은 느리다고 하는데 사람의 눈으로 인지하는데 큰 차이 안납니다. 늦든 빠르든 사람의 사고보다는 빠르니, 특수한 환경이 아니라면 수행시간에 목메이지 않아도 됩니다.

  • 솜사탕맛 사과
    49
    2022-07-26 17:49:25

    @Minsu Cha

    우와 이렇게 많이 알려주셔서 정말 감사드립니다

    알려주신 것 토대로 더 알아보고 공부하겠습니다

    처음으로 오키에 글 써본 건데 많은 도움을 주셔서 쓰길 잘했다는 생각이 듭니다

  • 로그인을 하시면 댓글을 등록할 수 있습니다.