검수요청.png검수요청.png

러스트

위키원
some0410 (토론 | 기여)님의 2019년 6월 28일 (금) 17:17 판
이동: 둘러보기, 검색
러스트 로고 LUST 로고

러스트(Rust)는 2012년 미국모질라재단그레이던 호어(Graydon Hoare)가 개발한 프로그래밍 언어 이다. 기존의 C/C++과 동등한 수준의 빠른 속도를 보장하면서도 메모리 오류를 완전히 없애는 것을 목표로 하는 현대적인 프로그래밍 언어이다. 즉 속도와 안정성같은 성능 부분에있어서 많이 유익한 언어인데 이는 컴파일 단계에서 메모리 참조 오류를 발견하는 부분에서 혁신적인 언어이다.[1][2]

러스트와파이선

개요

러스트 프로그래밍언어는 사용자로 하여금 좀 더 빠르고, 더 안정적인 소프트웨어를 작성하도록 해준다. 프로그래밍 언어는 항상 저급언어고급언어 의 조화 부분에서 삐걱대지만 러스트는 속도와 안정성, 편의성까지 고려하는 프로그래밍언어이며, 지금까지의 언어들의 특성을 살펴보자면, 항상 이용이 쉽고 안전한 언어는 속도 면에서 부족하고, 그와 반대로 컴파일 속도 등 퍼포먼스를 강조하는 언어들은 이용이 어렵고 안전성이 떨어지는 현상이 있었는데 러스트언어는 놀랍게도 이를 극복한 언어이다. 러스트는 구글의(Go) 언어와 비슷한 목표를 꿈꾸며 성능 면에서 압도적인 우월을 목표로 하고 있다. 필자는 요즘 화제가 되고 있는 러스트 언어와 파이선(Python)을 함께 사용해서 블록체인의 증명알고리즘을 통해 이점 등을 중점으로 해당 언어를 서술하고자 한다.

등장배경

러스트 언어의 역사

러스트는 원래 그레이던 호어가 혼자 개발하던 언어였다. 그러던 와중에 이 언어의 발전가능성을 알게된 모질라재단의 모질라가 2009년부터 스폰싱을 시작하였고, 2012년 1월에 드디어 본격적인 합동 개발을 시작한다. 따라서 그레이던 호어가 개인적으로 개발한 기간까지 합치면 거의 8년정도의 시간을 할애하여, 본격적인 개발이 시작된 후부터 약3년이 넘는 기간 동안 개발된 언어인것이다. 참고로 모질라는 웹 기술을 주도하는 사람이며 이런 러스트의 특성을 살려 웹브라우저를 다시 개량항 비전을 가지고 실제로 이를 위한 시험 프로젝트로 'Servo'라는 브라우저 엔진이 개발되고있다.[3]

특징

러스트 언어는 시스템 수준의 빠른 소프트웨어를 제작하기 위한 언어인데, C/C++ 언어와 동일한 수준의 퍼포먼스를 달성하면서도 메모리의 오류를 대폭 줄여주는 것이 핵심적인 특징이다. 이는 함수형 프로그래밍 언어로부터 발전된 타입 시스템에서 발전하였고, 클래스 대신 트레이트(Trait)를 기반으로 다형성을 달성, 매크로의 활용이 가능하고 크레이트(Crate)라는 단위로 라이브러리가 배포되며 Cargo라는 패키지 관리 프로그램으로 필요한 라이브러리를 자동으로 다운받을 수 있다. 이는 파이선의 파이프(pip)와 비슷한 기능을 한다고 말할 수 있다 패키지 매니저이며 코드를 빌드하고 다운로드 및 의존성 관리와 각종 테스트가 가능한 커맨드 등을 제공한다. 이제 면밀히 해당 특징들을 분석해 본다.[3]

보다 안정적인 메모리의 관리

이는 러스트 언어만의 독자적이면서도 상당한 상용성을 기대할 수 있는 언어적 특징이기도 하다. 기존의 언어는 메모리 안전성이 떨어지거나 개발자의 실수 등을 통해서, 쓰레기 수집기(garbage collection)을 사용하여야만 한다. 하지만 러스트는 이러한 작업이 필요가 없다. 그 이유는 러스트에는 '소유권'(ownership)이라는 개념을 적용하는데 어떤 객체를 가리키는 포인터는 여러 개가 있을 수 있지만, 그중 오직 하나만 소유권을 갖게 되고 그 소유권이 있는 포인터만으로 해당 객체의 내용을 바꿀 수 있다. 여기서 핵심은 그 소유권을 가진 포인터가 사라질 때, 자동을 메모리가 해제(free)되는데, 기존의언어는 쓰레기 수집기를 통해 작업할시 반드시 cup와 메모리를 사용하고 따라서 전체 프로그램 수행 속도가 느려지며, 쓰레기 수집이 동반하는 런타임 오버헤드가 러스트에는 없다. 이 규칙에 어긋나는 코드가 발견되면(즉, 메모리 안전성을 침해할 만한 코드가 발견되면), 컴파일 오류가 나고 이는 모든 변수가 초깃값을 가지고 할당되며, 해제된 포인터에 접근하는 코드는 컴파일러가 사전에 감지 후 파일 오류를 일으키는 방식이며 특히 쓰레기 수집기가 작동 시 사실상 프로그램의 실행은 잠시 멈추게 되는데 찰나의 순간이지만 상상해보면 만약 자율주행이나 공장의 위험한 장비를 다루는 기계의 순간 오작동이나 멈칫거림은 치명적인 사고로 이어질 가능성이 있기 때문에 안 정성이 떨어지게 되며 메모리의 수명과 자원의 수명을 일치시키려는 'RAII'라는 원칙이 있는데, 일부 쓰레기 수집 알고리즘에서는 메모리가 해제되는 시점이 불명확하기에 이들 언어에서는 반드시. close()를 호출하여야 다. 라서 성능이 위주의 분야에서는 여전히 메모리 안전성이 떨어지는 C/C++를 사용할 수밖에 없었습니다. 대표적인 분야가 게임이나 운영체제인데, C/C++에서 발생하는 보안 버그들 중 절대다수는, 알고리즘에 근본적인 문제보다 순전히 프로그래머가 해제할 메모리를 잊어버리는 실수로 발생하기도 하니, 쓰레기 수집기능이 없으나, 성능 때문에 C/C++를 포기할 수도 없었으나 이제 러스트로 그러한 문제들을 해결할 수 있다.[3]

장점

러스트는 위에서 언급했듯이 쓰레기 수집기가 없어 C나 C+ 프로그램에서 자주 발생하는 잘못된 연산을 수행'(segmentation fault)하는 오류의 발생이 없다. 더불어 파이선 이상의 높은 수준의 C++와 동일하게 Rust는 비용 없는 추상화(zero-cost abstractions)가 제공되고 메모리 안정성도 뛰어나며 빠르다. 또한 C++과 유사하게 extern "C"를 써서 c와의 호환이 용이하며, 문법 자체도 c 계열이기에 {, }, <, > 같은 기호들을 사용하여 배우기 좋고, 여러 플랫폼에 걸쳐 기본 시스템 코드로 컴파일 되는 구조이기 때문에 바이너리 자체를 포함하여 런타임도 없고, 러스트를 사용한 파이선과 순수 파이선을 비교할 때 러스트와 함께 사용한 경우가 3배 정도 더 빠르다. 러스트는 필요하다면 c나 c++의 raw pointer와 같이 메모리를 직접적으로 조작해야 하는 경우 부분적으로 이를 비활성 하여 안정성의 측면에서 볼 때 좀 더 안전의 기본값을 더 높은 수준의 소프트웨어로 개발할 수 있다. 러스트언어는 리눅스, 윈도우, 맥os주요 3가지 주 된 플랫폼에서 모두 작동하니 개발자 사이의 의견교류와 이들 운영체제 사이의 변환 과정에서 드는 노력을 줄여준다. 프로그래밍언어의 유용성과 가치를 평가할 때 서드 파티를 사용해 얼마나 라이브러리를 풍부히 하는지 확인하는데 러스트의 카고는 약 1만개의 크레이트를 열거하여 사용한다.<ef name="러스트 "></ref>[4]

단점

러스트의 단점으로는 현실적으로 봤을 때 신생언어 이기 때문에 이러한 메타포를 배우기 어려울 수 있고 소유권, 대여와 같은 러스트만의 메모리 관리 시스템의 사용이 익숙하지 않다. 러스트가 C++ 언어보다 쉬운 건 사실이지만 여전히 자바나, 파이선 같은 쓰레기 수집을 사용하는 자동 관리되는 언어들과 비교했을 때 친밀성이 낮아 사용이 여전히 난해하며, 메모리 관리에 관하여 개발 효율이 떨어질 수도 있습니다.[3][4]

소유권

소유권(ownership)은 Rust의 특유한 개념이며, 쓰레기 수집기 없이도 메모리를 안전하게 사용할 수 있도록 보장한다. 따라서 그동작기능을 살펴본다. 프로그램 사용자라면 어떤 언어를 실행 할 때 반드시 실행 중에 컴퓨터 메모리를 관리 해주어야 하는데 기존의 언어들은 쓰레기 수집기를 이용하여 관리하거나, 직접 할당 및 해제 작업을 통해서 반드시 메모리를 관리해 주었다. 러스트는 컴파일 시점에서 메모리를 관리한다. 이는 런타임 성능 저하를 방지한다. 소유권의 규칙으로는 어떤 객체, 변수를 가리키는 포인터는 여러 개가 있을 수 있지만, 그중 오직 하나만 소유권을 가지며 또한 소유권이 있는 포인터만 객체의 내용을 바꿀 수 있고 마지막에 접근하여 소유권을 가진 그 포인터가 사라질 때 메모리도 자동으로 해제된다. 러스트 컴파일러는 컴파일단계에서 해당 소유권의 이동을 모두 추적할 수 있고 필요한 메모리 할당 및 해제 코드를 정확히 관리한다.[3]

문법

러스트 맛보기

순서대로 참조한 코딩들을 보면 먼저 간단한 문자열의 출력으로 'hello world bro'를 간단히 메인 함수를 호출하여 출력하는데 이때 파이선과 다른 점이 (세미콜론 ;)을 허용한다는 것인데 이는 러스트가 c의 기반으로 문법을 구동하기 때문이다. 다음으로 변수의 선언과 값을 출력인데 러스트만의 독특한 점을 이야기하자면 c의 경우 지역변수의 선언 후 그 함수 블록 내부에서 변숫값의 변경이 바로 이루어지는 반면 러스트의 경우에서는 let으로 선언한 변수에 반드시 키워드 mut과 함께 let mut으로 값을 선언해주어야 한다. 만약 mut 키워드 없이 사용할 경우 2번 배정 됐다며 에러가 발생하게 된다. 또한 Match 키워드 또한 러스트의 매력적인 키워드 중 하나기에 소개해보자면 일종의 switch 같은 분 기문으로 다음 x에 4는 없기 때문에 match 함수 내부의 순환을 거쳐 마지막 "no answer"가 출력된다.

맛보기1 간단한 문자열 출력
맛보기2 변수 출력
맛보기3 Match 키워드

블록체인에 적용해본 러스트 언어

파이선과 러스트의 적용

블록체인 은 간단히 접근하면 모든 거래자의 전체 거래장부 공유, 대조 를 통해 거래를 보다 안전하게 만드는 일종의 보안기술인데, 기존에는 은행을 통해 최소한의 인원으로 거래 내역에 접근하여 최소한만 저장하는 방식이었는데, 이는 은행과 극소수만이 거래 내역을 소유하기 때문에 공정성이 떨어졌다, 하지만 블록체인 방식은 특정 시간 간격으로 모든 거래 기록이 모든 블록 체인 창고 에 비교하여 같을 시 저장하는 원리이다. 즉 거래의 모든 기록 장부를 모아둔 것인데 블록체인의 사용자끼리 모든 거래 내역을 암호화하여 모두 저장하고 필요한 정보를 서로 대조하여 그들 사이의 금전거래가 신뢰성이 높아진다. 즉 공공 거래 장부를 사용하여 모두가 같은 거래장부를 사용하여 거래 내역의 위조가 물리적으로 어렵다. pyCon 2018의 강연 내용을 살펴보면 결국 해시(Hash) 알고리즘 을 이용하여 원하는 내용의 조회와 확인에 파이선과 러스트를 벤치마킹하는 부분을 다루었는데, 파이선, 러스트의 특징들을 분석하여 블록체인에 적용되는부분의 코드를 확인해보면,그냥 파이선으로 돌릴때와 러스트와 함께 돌릴때를 비교하면 단순 반복 숫자의 탐색경우 겨우 1.9배 정도의 속도 차이만을 보이며 미비했지만 문자의 경우로 코드를 수정 했을 경우 파이선과 러스트를 공용하여 사용 하였을 때보다 무려 30배 가까이 속도를 내는 성능을 보여주었다. 이러한 결과들을 보았을때 아직 신생 언어 이기도 하고 파이선과 사용한 사례가 적어서 많은 데이터가 없지만 보다 블록 체인과 함께 사용할때 충분히 더 좋은 퍼포먼스 를 발휘함에는 의심의 여지가 없다. 필자는 따라서 블록체인기술과도 잘 어울리는 언어라 생각한다.[5]


동영상

사용 프로젝트

  • 파이어폭스는 러스트를사용한 자유 소프트웨어 웹 브라우저이다.
  • [서보]는 러스트를 이용한 브라우저 엔진이다.
  • 레독스 OS는 러스트 프로그래밍언어로 작성된 운영체제이다.

각주

참고자료

같이 보기

  검수요청.png검수요청.png 이 러스트 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.