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

"러스트"의 두 판 사이의 차이

해시넷
이동: 둘러보기, 검색
잔글
 
(사용자 6명의 중간 판 37개는 보이지 않습니다)
1번째 줄: 1번째 줄:
[[파일:LUST.PNG|700픽셀|썸네일|오른쪽|'''러스트 로고''' LUST 로고]]
+
[[파일:러스트 로고.png|썸네일|200픽셀|'''러스트'''(Rust)]]
'''러스트'''(Rust)는 2012년 미국 [[모질라재단]]의 [[그레이던 호어]](Graydon Hoare)가 개발한 [[프로그래밍 언어]]이다. 기존의 [[C 언어|C]]/[[C++]]과 동등한 수준의 빠른 속도를 보장하면서도 메모리 오류를 완전히 없애는 것을 목표로 하는 현대적인 프로그래밍 언어이다. 즉 속도와 안정성같은 성능 부분에있어서 많이 유익한 언어인데 이는 컴파일 단계에서 메모리 참조 오류를 발견하는 부분에서 혁신적인 언어이다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%9F%AC%EC%8A%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) 러스트 (프로그래밍 언어)]〉, 《위키백과》</ref><ref>〈[https://namu.wiki/w/Rust Rust]〉, 《나무위키》</ref>
+
[[파일:러스트 글자.png|썸네일|300픽셀|'''러스트'''(Rust)]]
 +
 
 +
'''러스트'''(Rust)는 2012년 미국 [[모질라재단]]의 [[그레이던 호어]](Graydon Hoare)가 개발한 [[프로그래밍 언어]]이다. 기존의 [[C 언어|C]]/[[C++]]과 동등한 수준의 빠른 속도를 보장하면서도 메모리 오류를 완전히 없애는 것을 목표로 하는 현대적인 프로그래밍 언어이다. 즉 속도와 안정성같은 성능 부분에 있어서 많이 유익한 언어인데 이는 컴파일 단계에서 메모리 참조 오류를 발견하는 부분에서 혁신적인 언어이기 때문이다.<ref>〈[https://ko.wikipedia.org/wiki/%EB%9F%AC%EC%8A%A4%ED%8A%B8_(%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D_%EC%96%B8%EC%96%B4) 러스트 (프로그래밍 언어)]〉, 《위키백과》</ref><ref>〈[https://namu.wiki/w/Rust Rust]〉, 《나무위키》</ref>
 +
 
 +
[[파일:러스트와파이선.PNG|썸네일|400픽셀|[[러스트]]와 [[파이썬]]]]
  
 
==개요==
 
==개요==
러스트 프로그래밍언어는 사용자로 하여금 좀더 빠르고,더 안정적인 소프트웨어를 작성하도록 해준다. 프로그래밍 언어는 항상 [[저급언어]]와[[고급언어]]의 조화 부분에서 삐걱대지만 러스트는
+
러스트 [[프로그래밍언어]]는 사용자로 하여금 좀 더 빠르고, 더 안정적인 소프트웨어를 작성하도록 해준다. 프로그래밍 언어는 항상 [[저급언어]]와 [[고급언어]] 의 조화 부분에서 삐걱대지만 러스트는 속도와 안정성, 편의성까지 고려하는 프로그래밍언어이며, 지금까지의 언어들의 특성을 살펴보자면, 항상 이용이 쉽고 안전한 언어는 속도 면에서 부족하고, 그와 반대로 컴파일 속도 등 퍼포먼스를 강조하는 언어들은 이용이 어렵고 안전성이 떨어지는 현상이 있었는데 러스트언어는 놀랍게도 이를 극복한 언어이다. 러스트는 구글의 [[고]](Go) 언어와 비슷한 목표를 꿈꾸며 성능 면에서 압도적인 우월을 목표로 하고 있다. 필자는 요즘 화제가 되고 있는 러스트 언어와 [[파이썬]](Python)을 함께 사용해서 블록체인의 증명 알고리즘을 통해 이점 등을 중점으로 해당 언어를 서술하고자 한다.
속도와 안정성,편의성까지 고려하는 프로그래밍언어이며,지금까지의 언어들의 특성을 살펴보자면, 항상 이용이 쉽고 안전한 언어는 속도면에서 부족하고, 그와 반대로 컴파일 속도등 퍼포먼스를 강조하는 언어들은 이용이 어렵고 안전성이 떨어지는 현상이 있었는데 러스트언어는 놀랍게도 이를 극복한 언어이다. 러스트는 구글의[[고]](Go)언어와 비슷한 목표를 꿈꾸며 성능면에서 앞도적인 우월을 목표로하고 있다. 필자는 요즘 화재가되고 있는 러스트 언어와 [[파이선]](Python)을 함께 사용해서 블록체인의 증명알고리즘을 통해 이점등을 중점으로 해당언어를 서술하고자 한다.
 
  
==등장배경==
+
==등장 배경==
  
 
===러스트 언어의 역사===
 
===러스트 언어의 역사===
러스트는 원래 그레이던 호어가 혼자 개발하던 언어였다. 그러던 와중에 이 언어의 발전가능성을 알게된  모질라재단의 모질라가 2009년부터 스폰싱을 시작하였고, 2012년 1월에 드디어 본격적인 합동 개발을 시작한다. 따라서  그레이던 호어가 개인적으로 개발한 기간까지 합치면 거의 8년정도의 시간을 할애하여, 본격적인 개발이 시작된 후부터 약3년이 넘는 기간 동안 개발된 언어인것이다. 참고로 모질라는 웹 기술을 주도하는 사람이며 이런 러스트의 특성을 살려 웹브라우저를 다시 개량항 비전을 가지고 실제로 이를 위한 시험 프로젝트로 [['Servo']]라는 브라우저 엔진이 개발되고있다.<ref name="러스트"> , 〈[https://pgr21.com/pb/pb.php?id=freedom&no=56557 러스트 프로그래밍 언어란 무엇이며, 왜 중요한가? ]〉, 《PGR21》, 2015-02-14</ref>
+
러스트는 원래 [[그레이던 호어]]가 혼자 개발하던 언어였다. 그러던 와중에 이 언어의 발전 가능성을 알게 된 [[모질라재단]]의 [[모질라]]가 2009년부터 스폰싱을 시작하였고, 2012년 1월에 드디어 본격적인 합동 개발을 시작한다. 따라서  그레이던 호어가 개인적으로 개발한 기간까지 합치면 거의 8년 정도의 시간을 할애하여, 본격적인 개발이 시작된 후부터 약 3년이 넘는 기간 동안 개발된 언어인 것이다. 참고로 모질라는 웹 기술을 주도하는 사람이며 이런 러스트의 특성을 살려 웹브라우저를 다시 개량한 비전을 가지고 실제로 이를 위한 시험 프로젝트로 [['Servo']]라는 브라우저 엔진이 개발되고있다.<ref name="러스트"> , 〈[https://pgr21.com/pb/pb.php?id=freedom&no=56557 러스트 프로그래밍 언어란 무엇이며, 왜 중요한가? ]〉, 《PGR21》, 2015-02-14</ref>
  
 
==특징==
 
==특징==
러스트 언어는 시스템 수준의 빠른 소프트웨어를 제작하기 위한 언어인데, C/C++ 언어와 동일한 수준의 퍼포먼스 를 달성하면서도 메모리의 오류를 대폭 줄여주는것이 핵심적인 특징이다. 이는 함수형 프로그래밍 언어 로부터 발전된 타입 시스템 에서 발전하였고,  클래스 대신 트레이트(Trait)를 기반으로 다형성을 달성, 매크로의 활용이가능하고 크레이트(Crate)라는 단위로 라이브라리가 배포되며 Cargo라는 패키지 관리 프로그램으로 필요한 라이브러리를 자동으로 다운받을 수 있다. 이제 면밀히 해당 특징들을 분석해 본다.<ref name="러스트 "></ref>  
+
러스트 언어는 시스템 수준의 빠른 소프트웨어를 제작하기 위한 언어인데, [[C]]/[[C++]] 언어와 동일한 수준의 퍼포먼스를 달성하면서도 메모리의 오류를 대폭 줄여주는 것이 핵심적인 특징이다. 이는 함수형 프로그래밍 언어로부터 발전된 타입 시스템에서 발전하였고,  클래스 대신 트레이트(Trait)를 기반으로 다형성을 달성, 매크로의 활용이 가능하고 크레이트(Crate)라는 단위로 라이브러리가 배포되며 Cargo라는 패키지 관리 프로그램으로 필요한 라이브러리를 자동으로 다운받을 수 있다. 이는 파이썬의 [[파이프]](pip)와 비슷한 기능을 한다고 말할 수 있다 패키지 매니저이며 코드를 빌드하고 다운로드 및 의존성 관리와 각종 테스트가 가능한 커맨드 등을 제공한다. 이제 면밀히 해당 특징들을 분석해 본다.<ref name="러스트 "></ref>  
  
 
===보다 안정적인 메모리의 관리===
 
===보다 안정적인 메모리의 관리===
이는 러스트 언어만의 독자적이면서도 상당한 상용성을 기대할 수 있는 언어적 특징이기도하다. 기존의 언어는 메모리 안전성이 떨어지거나 개발자의 실수등을 통해서(사람이라면 실수를 한다.), [[쓰레기 수집기]](garbage collection)을 사용 하여야만 한다. 하지만 러스트는 이러한 작업이 필요가 없다. 그이유는 러스트에는 '소유권'(ownership)이라는 개념을 적용하는데 어떤 객체를 가리키는 포인터는 여러 개가 있을 수 있지만, 그 중 오직 하나만 소유권을 갖게되고 소유권이있는 포인터만으로 해당 객체의 내용을 바꿀수 있다. 여기서 핵심은 그 소유권을 가진 포인터가 사라질때, 자동을 메모리가 해제(free) 되는데, 기존의언어는  쓰레기 수집기를통해 작업할시 반듯시 cup와 메모리를 사용하고 따라서 전체 프로그램 수행 속도가 느려지며, 쓰레기 수집이 동반하는 런타임 오버헤드가 러스트에는 없다. 이 규칙에 어긋나는 코드가 발견되면(즉, 메모리 안전성을 침해할 만한 코드가 발견되면), 컴파일 오류가 나고 이는 모든 변수가 초기값을 가지고 할당되며, 해제된 포인터에 접근하는 코드는 컴파일러가 사전에 미리 감지후 파일 오류를 일으키는 방식이며 특히 쓰레기 수집기가 작동시 사실상 프로그램의 실행은 잠시 멈추게 되는데 찰라의 순간이지만 상상해보면 만약 자율주행이나 공장의 위험한 장비를 다루는 기계의 순간의 오작동이나 멈칫거림은 치명적인 사고로 이어질 가능성이있기 때문에 안정성이떨어지게되며 메모리의 수명과 자원의 수명을 일치시키려는 'RAII'라는 원칙이 있는데,  일부 쓰레기 수집 알고리즘에서는 메모리가 해제되는 시점이 불명확하기에 이들 언어에서는 반드시 .close()를 호출하여야한다.
+
이는 러스트 언어만의 독자적이면서도 상당한 상용성을 기대할 수 있는 언어적 특징이기도 하다. 기존의 언어는 메모리 안전성이 떨어지거나 개발자의 실수 등을 통해서, 쓰레기 수집기(garbage collection)을 사용하여야만 한다. 하지만 러스트는 이러한 작업이 필요가 없다. 그 이유는 러스트에는 '소유권'(ownership)이라는 개념을 적용하는데 어떤 객체를 가리키는 포인터는 여러 개가 있을 수 있지만, 그중 오직 하나만 소유권을 갖게 되고 소유권이 있는 포인터만으로 해당 객체의 내용을 바꿀 수 있다. 여기서 핵심은 그 소유권을 가진 포인터가 사라질 때, 자동을 메모리가 해제(free)되는데, 기존의 언어는 쓰레기 수집기를 통해 작업할시 반드시 [[cup]]와 메모리를 사용하고 따라서 전체 프로그램 수행 속도가 느려지며, 쓰레기 수집이 동반하는 런타임 오버헤드가 러스트에는 없다. 이 규칙에 어긋나는 코드가 발견되면(즉, 메모리 안전성을 침해할 만한 코드가 발견되면), 컴파일 오류가 나고 이는 모든 변수가 초깃값을 가지고 할당되며, 해제된 포인터에 접근하는 코드는 컴파일러가 사전에 감지 후 파일 오류를 일으키는 방식이며 특히 쓰레기 수집기가 작동 시 사실상 프로그램의 실행은 잠시 멈추게 되는데 찰나의 순간이지만 상상해보면 만약 자율주행이나 공장의 위험한 장비를 다루는 기계의 순간 오작동이나 멈칫거림은 치명적인 사고로 이어질 가능성이 있기 때문에 안정성이 떨어지게 되며 메모리의 수명과 자원의 수명을 일치시키려는 'RAII'라는 원칙이 있는데,  일부 쓰레기 수집 알고리즘에서는 메모리가 해제되는 시점이 불명확하기에 이들 언어에서는 반드시. close()를 호출하여야 해서 성능 위주의 분야에서는 여전히 메모리 안전성이 떨어지는 C/C++를 사용할 수밖에 없었습니다. 대표적인 분야가 게임이나 운영체제인데, C/C++에서 발생하는 보안 버그들 중 절대다수는, 알고리즘에 근본적인 문제보다 순전히 프로그래머가 해제할 메모리를 잊어버리는 실수로 발생하기도 하니, 쓰레기 수집기능이 없으나, 성능 때문에 C/C++를 포기할 수도 없었으나 이제 러스트로 그러한 문제들을 해결할 수 있다.<ref name="러스트 "></ref>  
따라서 성능이 위주의 분야에서는 여전히 메모리 안전성이 떨어지는 C/C++를 사용할 수밖에 없었습니다. 대표적인 분야가 게임이나 운영체제 인데, C/C++에서 발생하는 보안 버그들 중 절대 다수는, 알고리즘에 근본적인 문제보다 순전히 프로그래머가 해제할 메모리를 잊어버리는 실수로 발생하기도하니 쓰레기 수집기능이없으나, 성능 때문에 C/C++를 포기할 수도 없었으나 이제 러스트로 그러한 문제들을 해결할수있다.<ref name="러스트 "></ref>  
+
 
 
===장점===
 
===장점===
러스트는 위에서 언급했듯이 쓰레기 수집기가 없어 C나 C+ 프로그램에서 자주 발생하는 잘못된 연산을 수행'(segmentation fault)하는 오류의 발생이없다. 더불어 파이선 이상의 높은 수준의C++와 동일하게 Rust는 비용 없는 추상화(zero-cost abstractions) 가 제공되고 메모리 안정성도 뛰어나며 빠르다. 또한 C++유사하게 extern "C" 를 써서 c와의 호환이 용이하며, 문법 자체도 c계열이기에 {, }, <, > 같은 기호들을 사용하여 배우기 좋고, 여러플랫폼에 걸쳐 기본 시스템 코드로 컴파일 되는구조이기 때문에 바이너리자체를 포함하여 런타임도 없고, 러스트를 사용한 파이선과 순수 파이선을 비교할때 러스트와 함께 사용한경우가 3배정도더빠르다. 러스트는 필요하다면 c나c++의 raw pointer 와 같이 메모리를 직접적으로 조작해야 하는 경우 부분적으로 이를 비활성하여 안정성의 측면에서볼떄 좀더 안전의 기본값을 더 높은 수준의 소프트웨어로 개발할수 있다. 러스트언어는 리눅스,윈도우,맥os주요 3가지 주된 플랫폼에서 모두 작동하니 개발자사이의 의견교류와 이들 운영체제사이의 변환 과정에서 드는 노력을 줄여준다. 프로그래밍언어의 유용성과 가치를 평가할때 서드 파티를 사용해 얼마나 라이브러리를 풍부히 하는지 확인하는데 러스트의 카고는 약1만개의 크레이트를 열거하여 사용한다.<ref name="러스트 "></ref><ref name="러스트 기사">Serdar Yegulalp 기자, 〈[http://www.ciokorea.com/news/112731 C·C++ 개발자 노린다··· ‘러스트’ 언어란? 뜨는 이유는 ]〉, 《CIO》, 2018-12-07</ref>
+
러스트는 위에서 언급했듯이 쓰레기 수집기가 없어 C나 C+ 프로그램에서 자주 발생하는 잘못된 연산을 수행'(segmentation fault)하는 오류의 발생이 없다. 더불어 파이썬 이상의 높은 수준의 C++와 동일하게 Rust는 비용 없는 추상화(zero-cost abstractions)가 제공되고 메모리 안정성도 뛰어나며 빠르다. 또한 C++유사하게 extern "C"를 써서 c와의 호환이 용이하며, 문법 자체도 c 계열이기에 {, }, <, > 같은 기호들을 사용하여 배우기 좋고, 여러 플랫폼에 걸쳐 기본 시스템 코드로 컴파일 되는 구조이기 때문에 바이너리 자체를 포함하여 런타임도 없고, 러스트를 사용한 파이썬과 순수 파이썬을 비교할 때 러스트와 함께 사용한 경우가 3배 정도 더 빠르다. 러스트는 필요하다면 c나 c++의 raw pointer와 같이 메모리를 직접적으로 조작해야 하는 경우 부분적으로 이를 비활성 하여 안정성의 측면에서 볼 때 좀 더 안전의 기본값을 더 높은 수준의 소프트웨어로 개발할 수 있다. 러스트언어는 [[리눅스]], [[윈도우]], [[맥]]os주요 3가지 주 된 플랫폼에서 모두 작동하니 개발자 사이의 의견교류와 이들 운영체제 사이의 변환 과정에서 드는 노력을 줄여준다. 프로그래밍언어의 유용성과 가치를 평가할 때 서드 파티를 사용해 얼마나 라이브러리를 풍부히 하는지 확인하는데 러스트의 카고는 약 1만개의 크레이트를 열거하여 사용한다.<ref name="러스트 "></ref><ref name="러스트 기사">Serdar Yegulalp 기자, 〈[http://www.ciokorea.com/news/112731 C·C++ 개발자 노린다··· ‘러스트’ 언어란? 뜨는 이유는 ]〉, 《CIO》, 2018-12-07</ref>
  
 
===단점===
 
===단점===
러스트의 단점으로는 현실적으로 봤을 때 신생언어 이기때문에 이러한 메타포를 배우기 어려울수 있고 소유권,대여와 같은 러스트만의 메모리 관리 시스템의 사용이 익숙하지않다. 러스트가 C++언어보다 쉬운건 사실이지만 여전히 자바나, 파이선 같은 쓰레기 수집을 사용하는 자동 관리되는 언어들과 비교했을때 친밀성이낮아 사용이 여전히 난해하며 메모리관리에 관하여 개발 효율이 떨어질수도있습니다.<ref name="러스트 "></ref><ref name="러스트 기사"></ref>
+
러스트의 단점으로는 현실적으로 봤을 때 신생언어 이기 때문에 이러한 메타포를 배우기 어려울 수 있고 소유권, 대여와 같은 러스트만의 메모리 관리 시스템의 사용이 익숙하지 않다. 러스트가 C++ 언어보다 쉬운 건 사실이지만 여전히 자바나, 파이썬 같은 쓰레기 수집을 사용하는 자동 관리되는 언어들과 비교했을 때 친밀성이 낮아 사용이 여전히 난해하며, 메모리 관리에 관하여 개발 효율이 떨어질 수도 있습니다.<ref name="러스트 "></ref><ref name="러스트 기사"></ref>
  
===러스트의 소유권===
+
==소유권==
소유권(ownership)은 Rust의 특유한 개념이며, 쓰레기 수집기 없이도 메모리를 안전하게 사용할 수 있도록 보장한다. 따라서 그작성기능을 알아본다. 프로그램사용자라면 어떤 언어를 실행 할때 반드시 실행중에 컴퓨터 메모리를 관리해주어야하는데 기종의 언어들은 쓰레기 수집기를 이용하여 관리하고 할당및 풀기를 해주나 러스트는 컴파일시점에서 메모리를 관리한다. 이는 런타임 성능 저하를 방지한다. 소유권의 규칙으로는  어떤 객체,변수를 가리키는 포인터는 여러 개가 있을 수 있지만, 그 중 오직 하나만 소유권을 가지며 또한 소유권이 있는 포인터만 객체의 내용을 바꿀 수 있고 마지막에 접근하여 소유권을 가진 그 포인터가 사라질 때 메모리도 자동으로 해제된다.<ref name="러스트 "></ref>
+
소유권(ownership)은 Rust의 특유한 개념이며, 쓰레기 수집기 없이도 메모리를 안전하게 사용할 수 있도록 보장한다. 따라서 그 동작기능을 살펴본다. 프로그램 사용자라면 어떤 언어를 실행 할 때 반드시 실행 중에 컴퓨터 메모리를 관리 해주어야 하는데 기존의 언어들은 쓰레기 수집기를 이용하여 관리하거나, 직접 할당 및 해제 작업을 통해서 반드시 메모리를 관리해 주었다. 러스트는 컴파일 시점에서 메모리를 관리한다. 이는 런타임 성능 저하를 방지한다. 소유권의 규칙으로는  어떤 객체, 변수를 가리키는 포인터는 여러 개가 있을 수 있지만, 그중 오직 하나만 소유권을 가지며 또한 소유권이 있는 포인터만 객체의 내용을 바꿀 수 있고 마지막에 접근하여 소유권을 가진 그 포인터가 사라질 때 메모리도 자동으로 해제된다. 러스트 [[컴파일러]]는 컴파일단계에서 해당 소유권의 이동을 모두 추적할 수 있고 필요한 메모리 할당 및 해제 코드를 정확히 관리한다.<ref name="러스트 "></ref>
  
 
==문법==
 
==문법==
 +
[[파일:Hello.PNG|300픽셀|썸네일|오른쪽|'''맛보기1''' 간단한 문자열 출력]]
 +
[[파일:변수.PNG|300픽셀|썸네일|오른쪽|'''맛보기2''' 변수 출력]]
 +
[[파일:Match.PNG|300픽셀|썸네일|오른쪽|'''맛보기3''' Match 키워드]]
 +
 
===러스트 맛보기===
 
===러스트 맛보기===
먼저 간단한 문자열의 출력 'hello world'이다 간단히 메인 함수 를 호출하여 출력하는데 이때 파이선과 다른점이 (세미콜론 ;)을 하용한다는 것인데 이는 러스트가 c의 기반으로 문법을 구동하기 때문이다.
+
순서대로 참조한 코딩들을 보면 먼저 간단한 문자열의 출력으로 'hello world bro'간단히 메인 함수를 호출하여 출력하는데 이때 파이썬과 다른 점이 세미콜론(;)을 허용한다는 것인데 이는 러스트가 c의 기반으로 문법을 구동하기 때문이다.
[[파일:Hello.PNG|500픽셀|썸네일|왼쪽|'''맛보기1'''간단한 문자열 출력]]
+
다음으로 변수의 선언과 값을 출력인데 러스트만의 독특한 점을 이야기하자면 c의 경우 지역변수의 선언 후 그 함수 블록 내부에서 변숫값의 변경이 바로 이루어지는 반면 러스트의 경우에서는 let으로 선언한 변수에 반드시 키워드 mut과 함께 let mut으로 값을 선언해주어야 한다. 만약 mut 키워드 없이 사용할 경우 2번 배정 됐다며 에러가 발생하게 된다.
 +
또한 Match 키워드 또한 러스트의 매력적인 키워드 중 하나기에 소개해보자면 일종의 switch 같은 분기문으로 다음 x에 4는 없기 때문에 match 함수 내부의 순환을 거쳐 마지막  "no answer"가 출력된다.
  
변수의 선언과 활용은 let을 이용하고 println!으로 출력하는데 일반적인 프로그램과는 달리  변수 값을 바꾸는 부분에있어서  러스트는 let mut를 통해서 다시 저장해주어야 값을 바꾸어 출력할수 있다 만약 mut키워드 없이 사용할경우 2번 벙됬다며 에러가 발생하게된다.
+
==블록체인에 적용해본 러스트 언어==
[[파일:변수.PNG|500픽셀|썸네일|왼쪽|'''맛보기2'''변수 출력]]
 
  
match 키워드또한 러스트의 매력적인 키워드중하나인데 분기문인 switch의 기능과 유사하다. 다음 을보면 4가 없기때문에 match 함수내부에순환을 거쳐 "no answer"이 출력된다.
+
===파이썬과 러스트의 적용===
[[파일:Match.PNG|500픽셀|썸네일|왼쪽|'''맛보기3'''간단한 문자열 출력]]
+
[[블록체인]] 은 간단히 접근하면 모든 거래자의 전체 거래장부 공유, 대조 를 통해 거래를 보다 안전하게 만드는 일종의 보안기술인데, 기존에는 은행을 통해 최소한의 인원으로 거래 내역에 접근하여 최소한만 저장하는 방식이었는데, 이는 은행과 극소수만이 거래 내역을 소유하기 때문에 공정성이 떨어졌다, 하지만 블록체인 방식은 특정 시간 간격으로 모든 거래 기록이 모든 블록체인 창고에 비교하여 같을 시 저장하는 원리이다. 즉 거래의 모든 기록 장부를 모아둔 것인데 블록체인의 사용자끼리 모든 거래 내역을 암호화하여 모두 저장하고 필요한 정보를 서로 대조하여 그들 사이의 금전거래가 신뢰성이 높아진다. 즉 공공 거래 장부를 사용하여 모두가 같은 거래장부를 사용하여 거래 내역의 위조가 물리적으로 어렵다. pyCon 2018의 강연 내용을 살펴보면 결국 [[해시]](Hash) 알고리즘 을 이용하여 원하는 내용의 조회와 확인에 파이썬과 러스트를 벤치마킹하는 부분을 다루었는데, 파이썬, 러스트의 특징들을 분석하여 블록체인에 적용되는부분의 코드를 확인해보면,그냥 파이썬으로 돌릴때와 러스트와 함께 돌릴때를 비교하면 단순 반복 숫자의 탐색경우 겨우 1.9배 정도의 속도 차이만을 보이며 미비했지만 문자의 경우로 코드를 수정했을 경우 [[파이썬]]과 러스트를 공용하여 사용하였을 때보다 무려 30배 가까이 속도를 내는 성능을 보여주었다. 이러한 결과들을 보았을때 아직 신생 언어 이기도 하고 파이썬과 사용한 사례가 적어서 많은 데이터가 없지만 보다 블록체인과 함께 사용할 때 충분히 더 좋은 퍼포먼스를 발휘함에는 의심의 여지가 없다. 필자는 따라서 블록체인기술과도 잘 어울리는 언어라 생각한다.<ref name="파이콘"> , 〈[https://medium.com/@elastic7327/pycon2018-rust-and-python-%ED%8C%8C%EC%9D%B4%EC%BD%98%EC%97%90%EC%84%9C-%EB%B0%9C%ED%91%9C%ED%95%A0-%EB%82%B4%EC%9A%A9%EB%93%A4-%EA%B0%84%EB%9E%B5%ED%95%98%EA%B2%8C-%EC%A0%95%EB%A6%AC%ED%95%9C%EA%B2%83-%EC%88%98%EC%A0%95%EC%A4%91-5703651706b9 Pycon2018 rust and python 파이콘에서 발표할 내용들 간략하게 정리 ]〉, 《미디엄》, 2015-01-10</ref>
 
 
 
 
==블록체인에 적용해본 러스트 언어==
 
===파이선과 러스트의 적용===
 
pyCon의 강연 내용과 파이선,러스트의 특징들을 분석하여 블록체인에 적용되는부분을 확인한다.
 
  
 +
==동영상==
 +
<youtube>ySrtA5vVrVQ</youtube>
  
 
==사용 프로젝트==
 
==사용 프로젝트==
*[[파이어폭스]]
+
* [[파이어폭스]]는 러스트를 사용한 자유 소프트웨어 웹브라우저이다.
*[서보]
+
* [[서보]]는 러스트를 이용한 브라우저 엔진이다.
*[[레독스 OS]]
+
* [[레독스 OS]]는 러스트 프로그래밍 언어로 작성된 운영체제이다.
*[[카고]]
 
 
 
==동영상==
 
<youtube> ySrtA5vVrVQ <youtube/>
 
  
 
{{각주}}
 
{{각주}}
  
==참고자료==
+
== 참고자료 ==
 +
* 러스트 프로그래밍 홈페이지 - https://prev.rust-lang.org/ko-KR/index.html
 +
* 박병화 기자, 〈[https://www.codingworldnews.com/224 러스트(Rust) 언어, 올해 배워야 하는 7가지 이유]〉, 《코딩월드뉴스》, 2019-01-23
 +
* 이지현 기자, 〈[http://www.bloter.net/archives/230851 “요즘 뜨는 4대 프로그래밍 언어, 이렇게 배워보세요”]〉, 《블로터》, 2015-06-25
  
 
== 같이 보기 ==
 
== 같이 보기 ==
62번째 줄: 65번째 줄:
 
* [[모질라재단]]
 
* [[모질라재단]]
 
* [[그레이던 호어]]
 
* [[그레이던 호어]]
 +
* [[해시]]
 +
* [[블록체인]]
 +
* [[파이썬]]
 +
* [[비트코인]]
  
[[분류:프로그래밍 언어]]
+
{{프로그래밍 언어|검토 필요}}

2021년 1월 5일 (화) 21:35 기준 최신판

러스트(Rust)
러스트(Rust)

러스트(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만개의 크레이트를 열거하여 사용한다.[3][4]

단점[편집]

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

소유권[편집]

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

문법[편집]

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

러스트 맛보기[편집]

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

블록체인에 적용해본 러스트 언어[편집]

파이썬과 러스트의 적용[편집]

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

동영상[편집]

사용 프로젝트[편집]

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

각주[편집]

  1. 러스트 (프로그래밍 언어)〉, 《위키백과》
  2. Rust〉, 《나무위키》
  3. 3.0 3.1 3.2 3.3 3.4 3.5 , 〈러스트 프로그래밍 언어란 무엇이며, 왜 중요한가? 〉, 《PGR21》, 2015-02-14
  4. 4.0 4.1 Serdar Yegulalp 기자, 〈C·C++ 개발자 노린다··· ‘러스트’ 언어란? 뜨는 이유는 〉, 《CIO》, 2018-12-07
  5. , 〈Pycon2018 rust and python 파이콘에서 발표할 내용들 간략하게 정리 〉, 《미디엄》, 2015-01-10

참고자료[편집]

같이 보기[편집]


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