Rust

2

Rust Language

러스트(Rust)는 C, C++, Go 언어와 같은 컴파일 기반의 언어이자 시스템 프로그래밍 언어에 속하며, Go와 비슷한 시기에 등장하면서 두 언어 모두 C, C++을 서로 다른 방향에서 대체하려 한다는 점 때문에 라이벌 관계로 엮이기도 한다. 멀티코어 프로세싱이 중요시되는 현 추세에 따라 동시성 프로그래밍 및 병렬 프로그래밍에도 강점을 가지고 있다. Rust는 현대적인 시스템 프로그래밍 언어로 C, C++와 동등한 수준의 속도를 달성하면서 메모리 오류를 완전히 없애는 것을 목표로 한다. 또한 함수형 프로그래밍 언어로부터 발전된 타입 시스템을 도입하였으며, 클래스 대신 트레이트(Trait)를 기반으로 다형성을 달성한다. 매크로를 사용해 언어를 확장하는 것이 가능하며, 이 모든 것이 현대적인 모듈 시스템을 통해 쉽게 모듈화될 수 있다. 모듈들은 크레이트(Crate)라고 하는 단위로 묶여서 실행 파일이나 라이브러리로 배포될 수 있으며, Cargo라는 패키지 관리 프로그램을 통해 빌드 및 패키지 배포를 자동화하고 필요한 라이브러리를 Cargo를 통해 자동으로 다운로드받을 수 있다.

러스트가 사랑받는 이유

러스트는 배우기 어려운 언어이지만, 최근 인기가 급상승하면서 사랑받고 있다. 그 이유는 무엇일까? 대부분의 개발자는 보통 시스템 프로그래밍 영역에는 발을 들이지 않는다. 예를 들어, 애플리케이션 개발자는 기반 하드웨어에 접근할 필요가 없는 것이 일반적이다. 다른 소프트웨어를 구동하는 플랫폼을 구축하는 일도 거의 없다. 하지만 C나 C++ 같은 저수준 프로그램 언어를 사용하는 개발자에게 러스트는 묵시록과 같다. C++에서나 하던 수동 메모리 관리를 하면서 마치 고수준 개발 언어 같은 느낌을 준다. 성능면에서 러스트는 C나 C++가 번창했던 영역에서 이들 언어를 대체할 수 있다. 지연에 민감한 네트워크 서비스용으로 가비지 컬렉션이 없는 러스트의 런타임은 거의 없는 듯한 지연 시간을 낳는다. 안정성 면에서는 러스트의 입력 시스템과 바로우 체커(borrow Checker)는 파이썬이나 자바, C++에서 정상으로 받아들여지는 모든 등급의 버그를 방지해 준다. 또한 생산성 면에서는 최고의 빌드 시스템 및 패키지 관리자 중 하나로, 탁월한 내장 문서화 툴도 제공한다.

러스트의 기능들

러스트는 빠르고 안전하며, 무엇보다 합리적인 수준의 프로그래밍 난이도를 보장한다. 러스트는 또한 널리 사용되도록 설계되어 있으며 승자 독식의 프로그래밍 언어 경쟁에서 참가에 의의를 두는 낙오된 언어가 되지 않도록 신경 썼다. 안전을 속도, 개발 역량 등과 동등한 위치에 두어야 하는 이유는 많다. 실제로 우리 주변에는 안전을 최우선으로 여기지 않는 언어를 사용하여 제작된 소프트웨어들이 무척 많으며 심지어 그 중 일부는 중요 인프라스트럭처를 구성하고 있기도 하다. 러스트는 파이어폭스 브라우저의 주요 구성요소를 부분적으로 재확보하기 위한 모질라 연구 프로젝트로 시작됐다. 파이어폭스가 현대식 멀티코어 프로세서를 더 잘 사용할 수 있도록 해야 했으며, 웹 브라우저의 보편성은 그만큼 브라우저가 안전해야 함을 의미하기 때문이었다. 이러한 장점들은 브라우저뿐만 아니라 모든 소프트웨어에 필요하기 때문에 브라우저 프로젝트로 시작한 러스트는 프로그래밍 언어 프로젝트로 진화했다.

장점 Pros

▶ 빠르다 : 러스트 코드는 여러 플랫폼에 걸쳐 기본 시스템 코드로 컴파일된다. 바이너리는 자체 포함되며 런타임이 없고, 생성된 코드는 C 또는 C++로 작성된 코드와 함께 기능한다.

▶ 안전하다 : 러스트는 안전하지 않은 메모리 사용을 시도하는 프로그램을 컴파일링 하지 않는다. 대부분의 메모리 오류는 프로그램이 실행 중일 때
발견된다. 러스트의 구문과 언어 은유는 다른 언어에서 흔히 나타나는 메모리 관련 문제(null 또는 댕글링 포인터, 데이터 레이스 등)가 절대 생산까지 영향을 미치지 않도록 보장한다. 컴파일러는 이러한 이슈에 플래그를 지정하고 프로그램이 실행되기 전에 수정하도록 강제한다.

▶ 간접 비용이 적게 발생한다 : 러스트는 엄격한 규칙을 통해 메모리 관리를 통제한다. 러스트의 메모리 관리 시스템은 '소유'라고 불리는 메타포를 통해 언어 구문으로 표현된다. 러스트 언어에서 주어진 가치는 한 번에 하나의 변수에 의해서만 소유되거나 유지, 조작될 수 있다. 러스트 프로그램의 모든 메모리는 소유권 메타포를 통해 추적되고 자동으로 방출된다.

▶ 융통성이 있다 : 러스트는 필요하다면 어느 정도의 위험도 감수할 수 있도록 되어 있다. 러스트의 안전 장치는 C, C++의 'raw pointer'와 같이 메모리를 직접적으로 조작해야 하는 경우 부분적으로 비활성화 시키는 것이 가능하다. 러스트의 메모리 안전 오퍼레이션은 절대로 완전히 비활성화 될 수 없다. 안전 오퍼레이션을 부분적으로 비활성화 한다고 해도 일반적인 사용 사례에서는 '안전벨트'를 풀을 필요가 거의 없으므로, 결과적으로는 안전의 기본 값이 훨씬 높은 소프트웨어가 탄생하게 된다.

▶ 사용하기 쉽다 : 러스트 바이너리를 생산하는 데 필요한 모든 것은 같은 패키지에 담겨 있다. GCC와 같은 외부 컴파일러는 러스트 생태계(소스로부터 컴파일하는 C 라이브러리 등) 밖에서 다른 구성요소를 컴파일하는 경우에만 필요하다. 마이크로소프트 윈도우 사용자들 역시 이등 시민 취급을 받지 않아도 된다. 러스트 툴 체인은 윈도우에서도 리눅스 및 맥OS에서와 같은 기능을 한다.

▶ 크로스-플랫폼 언어다 : 러스트는 리눅스, 윈도우 및 맥OS의 세 가지 주요 플랫폼에서 모두 작동한다. 만약 개발자가 교차 컴파일하거나, 현재 실행하고 있는 것과 다른 아키텍처나 플랫폼에 대한 바이너리를 생산하고 싶다면 조금 더 많은 작업이 수반되지만, 러스트의 일반적인 임무 중 하나는 그러한 작업에 필요한 무거운 짐을 덜어 주는 것이다.

▶ 강력한 언어 기능을 제공한다 : 기존 사용하던 익숙한 언어보다 더 적은, 혹은 빈약한 기능을 가진 새로운 언어를 가지고 작업하고 싶어 하는 개발자는 거의 없을 것이다. C++ 같은 언어와 비교했을 때, 러스트가 지닌 기능들은 훨씬 개발자의 구미를 당기게 할 만하다. 매크로(Macros), 일반론(generics), 패턴 매칭(patternmatching) 및 구성은 러스트의 중요 기능들이다.

▶ 유용한 표준 라이브러리를 가지고 있다 : 러스트의 주요 목표 중 하나는 C와 C++ 개발자들이 가능하면 러스트를 사용하도록 장려하는 것이다. 그러나 C와 C++ 사용자는 컨테이너, 컬렉션 및 반복기를 사용하고, 문자열 조작을 수행하고, 프로세스와 스레딩을 관리하고, 네트워크 및 파일 I/O를 수행하는 등 적절한 표준 라이브러리를 원하고 있다. 러스트는 그 모든 것, 그리고 그 이상을 표준 라이브러리 안에서 할 수 있다. 크로스-플랫폼 언어인 러스트의 표준 라이브러리는 플랫폼 간에 신뢰성 있게 포팅할 수 있는 것들만 포함할 수 있다. 리눅스의 epoll과 같은 플랫폼별 기능은 libc, mio 또는 Tokio와 같은 타사 라이브러리의 기능을 통해 지원될 수 밖에 없다.

▶ 다양한 서드파티 라이브러리 : 프로그래밍 언어의 유용성을 평가하는 한 가지 척도는 서드파티를 사용해 얼마나 많은 것을 할 수 있느냐이다.'크레이트'를 가지고 있다 러스트 라이브러리의 공식 저장소인 카고(Cargo)는 약 1만 개의 크레이트를 열거하고 있다. 이들 중 상당수가 공통 라이브러리 및 프레임워크에 API 결합하고 있기 때문에 러스트는 그러한 프레임워크와 함께 하나의 언어 옵션으로 사용될 수 있다. 그러나 러스트 커뮤니티에서는 아직까지 전체적인 품질 및 효용성에 기초한 상세한 소개나 크레이트 순위를 공개하고 있지 않기 때문에, 직접 사용해 보거나 커뮤니티에서 설문조사를 해 보지 않고는 어떤 크레이트가 최선인지 선택할 방법이 없다.

▶ IDE 지원이 훌륭하다 : 러스트 컴파일러로부터 마이크로소프트 비주얼 스튜디오 코드와 같은 IDE에 실시간 피드백을 제공하는 러스트 랭기지서버(Rust Language Server)를 도입했다. 러스트 랭기지 서버는 기본 구문 체킹 이상의 피드백을 제공한다.

출처

왜 러스트인가

profile
🇰🇷🇺🇸 #Back-End Engineer

0개의 댓글