러스트
러스트(Rust)는 2012년 미국 모질라재단의 그레이던 호어(Graydon Hoare)가 개발한 프로그래밍 언어이다. 기존의 C/C++과 동등한 수준의 빠른 속도를 보장하면서도 메모리 오류를 완전히 없애는 것을 목표로 하는 현대적인 프로그래밍 언어이다. 즉 속도와 안정성같은 성능 부분에있어서 많이 유익한 언어인데 이는 컴파일 단계에서 메모리 참조 오류를 발견하는 부분에서 혁신적인 언어이다.[1][2]
목차
개요
러스트 프로그래밍언어는 사용자로 하여금 좀더 빠르고,더 안정적인 소프트웨어를 작성하도록 해준다. 프로그래밍 언어는 항상 저급언어와고급언어의 조화 부분에서 삐걱대지만 러스트는 속도와 안정성,편의성까지 고려하는 프로그래밍언어이며,지금까지의 언어들의 특성을 살펴보자면, 항상 이용이 쉽고 안전한 언어는 속도면에서 부족하고, 그와 반대로 컴파일 속도등 퍼포먼스를 강조하는 언어들은 이용이 어렵고 안전성이 떨어지는 현상이 있었는데 러스트언어는 놀랍게도 이를 극복한 언어이다. 러스트는 구글의고(Go)언어와 비슷한 목표를 꿈꾸며 성능면에서 앞도적인 우월을 목표로하고 있다. 필자는 요즘 화재가되고 있는 러스트 언어와 파이선(Python)을 함께 사용해서 블록체인의 증명알고리즘을 통해 이점등을 중점으로 해당언어를 서술하고자 한다.
등장배경
러스트 언어의 역사
러스트는 원래 그레이던 호어가 혼자 개발하던 언어였다. 그러던 와중에 이 언어의 발전가능성을 알게된 모질라재단의 모질라가 2009년부터 스폰싱을 시작하였고, 2012년 1월에 드디어 본격적인 합동 개발을 시작한다. 따라서 그레이던 호어가 개인적으로 개발한 기간까지 합치면 거의 8년정도의 시간을 할애하여, 본격적인 개발이 시작된 후부터 약3년이 넘는 기간 동안 개발된 언어인것이다. 참고로 모질라는 웹 기술을 주도하는 사람이며 이런 러스트의 특성을 살려 웹브라우저를 다시 개량항 비전을 가지고 실제로 이를 위한 시험 프로젝트로 'Servo'라는 브라우저 엔진이 개발되고있다.[3]
특징
러스트 언어는 시스템 수준의 빠른 소프트웨어를 제작하기 위한 언어인데, C/C++ 언어와 동일한 수준의 퍼포먼스 를 달성하면서도 메모리의 오류를 대폭 줄여주는것이 핵심적인 특징이다. 이는 함수형 프로그래밍 언어 로부터 발전된 타입 시스템 에서 발전하였고, 클래스 대신 트레이트(Trait)를 기반으로 다형성을 달성, 매크로의 활용이가능하고 크레이트(Crate)라는 단위로 라이브라리가 배포되며 Cargo라는 패키지 관리 프로그램으로 필요한 라이브러리를 자동으로 다운받을 수 있다.이는 파이선의 파이프(pip)와 비슷한기능을 한다고 말할 수있다 패키지 매니저이며 코드를 빌드하고 다운로드및 의존성 관리와각종 test등이 가능한 커맨드등을 제공한다. 이제 면밀히 해당 특징들을 분석해 본다.[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만개의 크레이트를 열거하여 사용한다.[3][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"이 출력된다.
블록체인에 적용해본 러스트 언어
파이선과 러스트의 적용
블록체인은 간단히 접근하면 모든 거래자의 전체 거래장부 공유,대조 를 통해 거래를 보다 안전하게 만드는 일종의 보안기술인데, 기존에는 은행을 통해 최소한의 인원으로 거래 내역에 접근하여 최소한만 저장하는 방식이었는데 이는 은행만등 극소수만이 거래 내역을 소유 하기 때문에 공정성이 떨어졌디, 허나 블록 체인 방식은 특정 시간 간격으로 모든 거래 기록이 모든 블록 체인창고 에 비교 하여 같을시 저장하는 원리이다. 즉 거래 의 모든 기록 장부를 모아둔것인데 블록 체인의 사용자끼리 모든 거래 내역을 암호화하여 모두 저장하고 필요한 정보를 서로 대조하여 그들사이의 금전거래가 신뢰성이 높아진다. 즉 공공 거래 장부를 사용하여 모두가 같은 거래장부를 사용하여 거래 내역의 위조가 물리적으로 어렵다. pyCon 2018의 강연 내용을 살펴보면 결국 해시(Hash) 알고리즘 를 이용하여 원하는 내용의 조회와 확인에 파이선과 러스트를 밴치마킹하는 부분을 다루었는데
파이선,러스트의 특징들을 분석하여 블록체인에 적용되는부분의 코드를 확인해보면,그냥 파이선으로 돌릴때와 러스트와 함께도릴때를비교할때 단순 반복 숫자의 탐색경우 겨우 1.9배정도의 속도차이만을 보이며 미비했지만 문자의 경우로 코드를 수정했을경우 파이선과 러스트를 공용하여 사용하였을 때문 무려 30배가까이 속도를내는 성능을 보여주었다 이러한 결과들을 보았을때 아직 신생언어이기도 하고 파이선과 사용한 사례가 적어서 많은 데이터가없지만 보다 블록 체인과 함께 사용할때 충분히 더 좋은 퍼포먼스 를 발휘함에는 의심의 여지가없다. 필자는 따라서 블록체인기술과도 잘 어울이는 언어라 생각한다.
동영상
사용 프로젝트
각주
- ↑ 〈러스트 (프로그래밍 언어)〉, 《위키백과》
- ↑ 〈Rust〉, 《나무위키》
- ↑ 3.0 3.1 3.2 3.3 3.4 3.5 , 〈러스트 프로그래밍 언어란 무엇이며, 왜 중요한가? 〉, 《PGR21》, 2015-02-14
- ↑ 4.0 4.1 Serdar Yegulalp 기자, 〈C·C++ 개발자 노린다··· ‘러스트’ 언어란? 뜨는 이유는 〉, 《CIO》, 2018-12-07