You are on page 1of 19

"C/C++의 현대적 대안"

러스트 언어 완벽 입문 가이드

Tech Trend __________________ 러스트를 좋아하거나 싫어하는 7가지 이유

"성능 좋지만 너무 느려" C++의 역사와 한계

Tech Guide __________________ 러스트 초보자를 위한 단계별 시작 가이드

무단 전재 본 PDF 문서는 IDG Korea의 자산으로, 저작권법의 보호를 받습니다.


재배포 금지 IDG Korea의 허락 없이 PDF 문서를 온라인 사이트 등에 무단 게재, 전재하거나 유포할 수 없습니다.
Tech Trend

“실무에 쓰이는 유일한 C++ 대체 언어”


러스트를 좋아하거나 싫어하는
7가지 이유
Martin Heller, Peter Wayner | InfoWorld

C와 C++는 프로그래밍 세계를 움직인다. 파이썬, 고(Go) 같은 신생 프로그래밍 언


어가 주목받는 상황에서 선뜻 납득하기 어려운 주장일 수 있지만, 일반적인 고성능
데스크톱 애플리케이션과 운영체제 대다수는 C++, 임베디드 애플리케이션은 주로
C로 개발된다. 스마트폰 앱이나 웹 애플리케이션 개발 이야기가 아니다. 그런 영역
은 자바, 코틀린, 오브젝티브 C, 스위프트 등 각 플랫폼에 맞는 별도의 언어를 사용
한다. C나 C++를 사용할 수도 있지만, 빠른 속도가 필요한 특정 반복문이나 여러 운
영체제에 공통으로 들어가는 라이브러리 개발에만 제한적으로 쓰인다.

C와 C++는 오랜 기간 시스템 프로그래밍을 주도했기에 이를 대체할 언어를 찾기


어렵다. 그런데도 많은 전문가가 이제 두 언어를 보내주고 더 좋은 대안을 받아들
일 때라고 지적한다. 마이크로소프트 애저 사업부 CTO 마크 러시노비치는 최근 “C
와 C++ 개발자는 러스트(Rust)로 전환해야 한다. 업계에서 C와 C++를 사라질 언어
라고 선언해야 한다”라고 주장해 큰 반향을 일으키기도 했다. 실제로 많은 개발자가
현장 제품 개발 과정에서 C와 C++를 대체할 언어로 러스트를 주목한다.

프로덕션 수준에서 사용할 수 있는 유일한 C++ 대안 언어

C++의 대안을 찾는 개발자에게 러스트, 카본, Cpp프론트 등은 모두 좋은 선택지지


만, 이 중 프로덕션 수준으로 사용할 수 있는 언어는 러스트가 유일하다. 러스트 공
식 홈페이지(https://bit.ly/3YBCOKx)를 보면 러스트의 장점으로 성능, 안정성, 생
산성을 꼽는다. 실제로 러스트는 빠르고 안전하고 사용하기 쉽도록 설계됐으며, 안
정적이고 효율적인 소프트웨어를 구축하는 것이 목표다.

성능 측면에서 러스트는 빠르고 메모리 효율성이 높다. 런타임 또는 가비지 컬렉터


가 없으므로 성능이 중요한 서비스를 구동하고 임베디드 기기에서 실행하고 다른

Deep Dive  1
Tech Trend

언어와 손쉽게 통합할 수 있다. 안정성 측면을 보면, 러스트의 풍부한 형식 시스템과
소유권 모델은 메모리 안정성과 쓰레드 안정성을 보장하며, 개발자는 이를 이용해
많은 종류의 컴파일 버그를 없앨 수 있다. 생산성의 경우 뛰어난 문서화, 오류 메시
지가 포함된 친절한 컴파일러, 그리고 통합 패키지 관리자와 빌드 툴, 자동 완성 및
형식 검사가 포함된 스마트한 다중 편집기 지원, 자동 포맷터 등 최상급 수준의 툴을
지원한다.

러스트 관련 참고 자료도 점점 많아지고 있다. 예를 들어 명령줄 툴 빌드(https://

“성능 좋지만 너무 느려”


C++의 역사와 한계 Peter Wayner | InfoWorld

C++는 비야네 스트롭스트룹이 1979년 벨 연구소에 백만 줄 분량의 프로그래밍을 해본 사람은 알 것이다.


서 개발했다. C에 객체 지향 기능을 비롯해 여러 개선 C++ 프로그램은 컴파일 과정에 유독 많은 시간이 필
사항을 추가하는 것이 목적이었으므로, 초기에는 ‘객 요하다. 구글 개발자이자 고 언어를 만든 롭 파이크는
체가 있는 C’라고 불리기도 했다. 1983년 공식 이름이 “2007년 9월경 구글에서 C++로 작성한 간단한 프로
C++로 정해지고, 1985년에는 벨 연구소뿐만 아니라 그램을 수정하고 있었는데, 강력한 분산 컴파일 클러
일반 대중에게 공개했다. 최초의 상용 C++ 컴파일러 스터 환경에서도 컴파일하는 데 45분이 걸렸다”라고
인 C프론트(Cfront)가 이때 나왔다. C프론트를 이용하 말했다. 파이크는 이 문제를 해결하는 과정에서 고 언
면 C++를 C로 변환한 후 컴파일하고 링크할 수 있다. 어를 구상하고 개발했다.
이후 C++ 컴파일러는 링커로 바로 넣을 수 있는 객체 필자 역시 200만 줄 규모의 C++ 코드를 작업한 경
코드 파일을 지원했다. 험이 있다. 이 업계에서는 짧은(?) 축에 속하는데, 8코
스트롭스트룹이 1985년 ‘C++ 프로그래밍 언어(C++ 어 컴퓨터에서 컴파일과 링크 작업을 하는 데 몇 시간
Programming Language)’ 그리고 1990년 ‘ARM 주 이 걸렸다. 비주얼 스튜디오에 로드해 모든 문자를 해
석을 곁들인 C++ 참조 설명서(The Annotated C++ 석하는 데만 10분이 걸렸다. 당시 이 문제를 해결하기
Reference Manual)’라는 책을 출판한 이후부터 C++ 위해 필자가 사용한 방법은 자동화였다. 스크립트를
표준화 노력도 본격화됐다. 그 결과 1998년, 2003년, 만들어 야간에 공유 리포지토리에서 코드의 새 복사
2011년, 2014년, 2017년, 2020년 ANSI/ISO C++ 표준 본을 가져온 다음 처음부터 전체를 컴파일했다. 느린
이 나왔고, 2023년에도 새로운 표준이 나올 예정이다. 로딩 문제는 매일 아침 비주얼 스튜디오를 연 다음 팀
C++ 표준이 새로 업데이트될 때마다 기능이 추가 원들과 함께 물을 끓이고 차를 우려내 마시며 ‘시간을
됐지만, 아직 C++의 학습 난이도를 줄이거나 컴파일 죽이는’ 방법으로 해결했다. 단, 비주얼 스튜디오의 느
속도를 더 빠르게 해주는 기능은 없다. 특히 C++로 수 린 로딩 문제는 이후 개선됐다.

2
Tech Trend

bit.ly/3Kbb9M4), 웹어셈블리 컴파일(자바스크립트를 강화하는 방법, https://bit.


ly/3I5BqbX), 네트워크 서비스 구축(https://bit.ly/3XtZY4c), 리소스가 적은 임베디
드 시스템을 위한 소프트웨어 만들기(https://bit.ly/3YQGF6e) 등이 있다. 프로덕션
에서 러스트를 도입한 사례도 많다. 파이어폭스(https://mzl.la/3XE1r82), 드롭박스
(https://bit.ly/3I69dSm), 클라우드플레어(https://bit.ly/3xppcGb), 옐프(https://
bit.ly/3xoedNt), 인플럭스DB(InfluxDB) IOx(https://bit.ly/3Iu6K5U)에서 러스트
를 이용해 제품을 만들고 있다. 인플럭스DB의 경우, 아파치 애로우(Apache Arrow)
에서 사용할 수 있는 러스트 네이티브 기반 SQL 쿼리 엔진 데이터퓨전(DataFusion,
https://bit.ly/3jYR2pV)을 개발하는 데도 러스트를 사용하고 있다.

러스트는 C++만큼은 아니지만, 배우기가 어렵다는 평이 있다. 그러나 안정성의 장


점이 이런 단점을 상쇄하고도 남는다. 즉, 세이프 러스트(Safe Rust, https://bit.
ly/3jXlbpE)에서는 형식 안정성이나 메모리 안정성에 대해 걱정할 필요가 없다. 또
한 필요한 경우 unsafe 속성을 사용해 안전하지 않은 코딩 방식을 쓸 수도 있다.

러스트는 확실히 틈새 언어지만, 목표가 뚜렷하다. 시스템 개발자를 비롯해 수십, 수


천, 심지어 수십만 건의 이벤트를 동시에 처리하는 코드를 만들 때 가장 먼저 꼽히는
언어가 되는 것이다. 이와 같은 시스템은 만드는 것 자체도 어렵고 버그를 찾아 수정
하기는 더 힘든데, 러스트는 이런 시스템을 만드는 최선의 방법에 관한 심층적이고
이론적인 온갖 아이디어를 살아 숨 쉬는 실제 언어로 바꿔준다.

러스트 코어팀은 매년 개발자 설문을 실시한다. 2021년에는 모든 러스트 개발자의


절반 이상이 실무에서 러스트를 사용한다는 결과가 나왔다. 더 이상 취미가 아니라
실제 서비스되는 전문적인 코드를 만드는 데 러스트를 쓰고 있다는 의미다. 개발자
가 러스트를 사용하면서 느끼는 좋은 점과 싫은 점을 통해 러스트 언어를 집중 해부
해 보자.

좋아하는 이유 1. 규모와 동시성이 뛰어나다

그동안 규모와 동시성 문제, 즉 많은 소스로부터 동시에 들어오는 입력을 처리하기


위한 요구사항에 대처하는 과정에서 소프트웨어 복잡성이 높아졌다. 이 때문에 강
력한 확장성을 지원하는 언어에 대한 요구가 높았다. 대표적인 사례가 웹 브라우저
다. 모질라 개발자들은 당시 사용하던 코드에서 발생하는 문제를 연구하면서 더 나
은 해결책을 모색했다. 파이어폭스를 개발한 모질라에서 러스트를 만든 것은 우연

Deep Dive  3
Tech Trend

이 아니다.

싫어하는 이유 1. 동시성 모델이 너무 복잡하다

멀티쓰레드 시스템은 갈수록 인기를 얻고 있지만, 사실 많은 개발자에겐 필요가 없


다. 웹 개발자는 웹사이트를 만들기 위한 단순하고 선언적인 접근 방식을 제공하는
PHP 코드를 쓰면 되고, 서버리스 개발자는 하나의 함수를 만들고 어려운 부분은 다
른 사람에게 맡기면 된다. 더 정교한 웹 애플리케이션을 만드는 경우에도 멀티쓰레
드 애플리케이션을 다루는 Node.js를 선택하면 된다. Node.js의 이벤트 기반 모델과
프레미스 기반 코드를 이용하면 단순명료한 결과를 낼 수 있다.

결국 이 모든 이야기는 러스트의 멀티쓰레드 프로그래밍 모델이 개발자에게 필요


이상의 정교함을 제공한다는 의미다. 부가적인 기능을 무시하고 러스트를 사용할
수도 있지만, 처음부터 복잡성을 아예 배제하는 편을 선호하는 개발자도 있다. 이들
에게 러스트는 문자 그대로 필요가 없다.

좋아하는 이유 2. 러스트는 현대적 언어다

오늘날 프로그래밍 언어는 분석이 더 용이하도록 함수형 언어로 소프트웨어를 만들


도록 권장한다. 러스트도 다르지 않다. 중첩된 함수 호출 시퀀스로 코드를 설계하도
록 하는데, 많은 개발자가 러스트의 이런 논리적이고 함수적인 구문을 좋아한다. 또
한 러스트 언어를 만든 사람들은 사물인터넷(IoT)의 기능을 유지하는 데 필요한 저
수준 비트뱅잉(bit-banging) 프로그래밍을 지원하고자 했다. 러스트는 극히 현실적
인 이와 같은 과제를 현대적인 스타일로 해결할 방법을 모색하는 개발자에게 안성
맞춤이다.

싫어하는 이유 2. 배우기 어렵다

어떤 면에서 러스트를 배운다는 것은 프로그래밍을 처음 직업으로 삼은 시점부터


추종해 온 개념과 기법을 잊어버리는 과정이다. 예를 들어 자바스크립트, 자바와 같
은 더 오래된 언어에서 필수 요소인 범위와 소유권 개념을 러스트에서는 버려야 한
다. 버그로 이어질 수 있는, 익숙한 몇 가지 기능을 기꺼이 포기해야 러스트의 장점
을 활용할 수 있다. 러스트는 언어 구문도 단순하지 않다. 지나치게 복잡하다고 말하
기도 한다. 중괄호를 쓰느냐 마느냐의 문제가 아니라 대괄호, 수직선, 부등호까지 사

4
Tech Trend

용한다. 콜론 하나로는 충분하지 않은지 이중 콜론도 쓴다.

복잡한 멀티쓰레드 툴을 만드는 러스트 개발자라면 러스트의 구문 복잡성이 ‘감수


할 가치가 있는’ 단점일 수 있다. 더 나아가 함수적 흐름을 훤히 읽는 진정한 러스트
팬이라면 이런 복잡성을 즐길 수도 있을 것이다. 그러나 그 외의 사람들에겐 어려울
뿐이다. 러스트의 모든 의미론적 규칙을 배우는 것은 일반적인 사용자에게 엄두가
나지 않는 일이다.

좋아하는 이유 3. 러스트 컴파일러에 지시할 수 있다

어떤 개발자는 러스트가 지원하는 온갖 부가적인 세부 요소와 형식을 장점으로 본


다. 덕분에 힌트를 넣어서 어떤 작업이 진행되는지 컴파일러가 더 쉽게 이해하고 잠
재적인 버그를 잡을 수 있기 때문이다. 상세한 코드는 개발자가 하고자 하는 일을 더
세밀하게 지정할 수 있게 하고, 이는 컴파일러 오류를 방지하는 데 도움이 된다. 러
스트를 사용하는 개발자는 코드가 할 일에 관한 힌트를 추가해 더 이해하기 쉬우면
서 더 빠른 코드를 쓸 수 있다.

싫어하는 이유 3. 컴파일러에 지시하는 것은 쓸데없는 짓이다

반면 그냥 루프를 만들면 아무 충돌 없이 실행되는 언어를 원하는 개발자도 있다. 이


들은 개발자가 신경을 쓸 필요 없이 백그라운드 작업을 알아서 처리하는 언어를 선
호한다. 간혹 컴파일러가 생산하는 코드가 조금 느리거나 버그가 있더라도 상관없

Deep Dive  5
Tech Trend

다. 많은 경우 별로 복잡하지 않고 디버그가 어려운 작업도 아니기 때문이다. 러스트


컴파일러의 온갖 부가적인 세부 사항을 힘들여 채우는 것보다 그냥 하드웨어를 늘
리는 편이 더 값싼 해결 방법일 수 있다.

좋아하는 이유 4. 하위 호환성이 뛰어나다

러스트 개발팀은 새로운 버전을 내놓아도 기존 코드를 계속해서 문제없이 실행되도


록 하는 데 상당히 공을 들인다. 새로운 버전이 나와도 이전 코드를 계속 컴파일해
실행할 수 있도록 노력한다. 다른 언어는 이런 부분을 무시하는 경우도 있으므로, 러
스트의 열렬한 추종자들은 끊임없이 다시 쓸 필요 없이 코드베이스를 그대로 유지
할 수 있다는 점을 러스트의 주요 장점으로 강조한다. 러스트는 '자신의 역사를 존중
하는' 언어라는 것이다.

싫어하는 이유 4. 러스트는 엄밀히 말해 객체 지향이 아니다

일부 개발자는 러스트가 객체 지향 프로그래밍(OOP) 원칙을 따르지 않는다고 지적


한다. 러스트에서도 객체 지향 프로그래밍의 몇 가지 측면을 모방할 수는 있다. 실제
로 러스트 숙련자라면 러스트 구성자로 객체 지향 프로그래밍을 구현하는 방법을
알고 있을 것이다. 그러나 정교한 형식 계층 구조를 만들려고 하면 러스트에 좌절감
을 느끼게 된다.

좋아하는 이유 5. 러스트의 비동기 처리 모델이 더 안전하다

러스트의 비동기 프로그래밍 모델을 이용하면 개발자가 상호 독립적으로 실행되는


개별 함수를 만든 후 결과를 조인할 수 있다. 많은 개발자는 이 구조가 더 빠르면서
버그도 적은 코드라고 말한다.

싫어하는 이유 5. 비동기 코딩은 어렵다

러스트라고 해서 코드를 세심하게 고려하지 않아도 되는 것은 아니다. 교착이나 지


연으로부터 코드를 보호하지는 못한다. 단지 더 나은 조언과 버그가 적은 구조를 제
공할 뿐이다. 좋은 애플리케이션을 설계하고 깔끔한 코드를 작성하는 것은 여전히
개발자의 책임이다. 러스트가 마술봉이면 좋겠지만, 현실은 그렇지 않다. 러스트는
문제를 최소화하고 명확한 위험을 줄여줄 뿐이다.

6
Tech Trend

좋아하는 이유 6. 추상화 없는 프로그래밍이다

러스트는 바이트를 다루는 저수준 코드를 작성하는 시스템 수준 프로그래밍을 지원


한다. 원시 비트에 액세스할 수 있는 툴을 제공하고 개발자가 이를 사용하도록 장려
한다. 러스트 언어는 운영체제와 네트워크 스택의 하위에 속하는 오래된 C 또는 어
셈블리 언어 코드와 대부분 공존한다. 따라서 숙련된 개발자는 러스트를 이용해 최
상의 응답성을 가진 최선의 스택을 구축할 수 있다.

싫어하는 이유 6. 바이트 수준 액세스는 위험하다

하지만 많은 언어가 러스트와 달리 바이트 수준 액세스를 피하는 방향으로 발전한


데는 다 이유가 있다. 바이트 수준 액세스는 개발자를 새로운 문제의 늪으로 끌어들
이기 때문이다. 많은 개발자가 백엔드에서 메모리 할당과 데이터 표현의 세부 사항
을 알아서 처리하는 언어를 선호하는 것도 이 때문이다.

좋아하는 이유 7. 더 좋은 가비지 컬렉션 방법을 지원한다

많은 인기 언어가 내부 메모리 할당과 가비지 컬렉션을 알아서 해주는데, 이는 가비


지 컬렉터가 모든 작업을 멈추게 하는 전까지만 좋은 서비스다. 가비지 컬렉션으로
금요일 밤 컴퓨터에서 재생 중인 영화가 멈추는 정도야 견딜 수 있겠지만, 의료 기기
에서 이런 일이 발생한다면 치명적이다.

그래서 러스트 언어는 독자적인 메모리 관리 방법을 사용한다. 전통적인 가비지 컬


렉터만큼 포괄적이지는 않지만, 때로는 더 강력하다. 유능한 개발자는 러스트의 메
모리 모델을 사용해 뛰어난 성능을 얻을 수 있는데, 단 이를 위해서는 형식 시스템과
원자적 참조 카운팅을 마스터해야 한다.

골수 러스트 팬은 직접 메모리를 관리하는 방식을 좋아한다. 수많은 쓰레드를 어지


럽게 다루면서 코드의 응답성을 보장해야 하는 일이라 해도 직접 하는 편을 더 선호
한다. 어떤 의미로든 러스트는 개발자의 손에 힘을 쥐여 준다.

싫어하는 이유 7. 메모리 관리가 골칫거리다

자바와 같은 인기 많은 프로그래밍 언어가 내부 메모리 관리 기능을 지원하는 이유


는 메모리 누출은 물론 이와 관련된 다양한 버그를 방지할 수 있기 때문이다. 대부분

Deep Dive  7
Tech Trend

프로그램에서 가비지 컬렉션으로 인해 이따금 발생하는 불편함은 별문제가 되지 않


는다. 개발자라면 메모리에 대해 신경을 쓰지 않는 편을 선호할 것이다.

또한 러스트가 전통적인 가비지 컬렉션의 대안을 제시하는 유일한 언어도 아니다.


예를 들어 Node.js는 멀티쓰레드 코딩을 간소화하면서도 자바스크립트의 런타임
메모리 관리 기능을 사용할 수 있다. 가끔 멈추지만 사용자가 문제 삼지 않는다면 굳
이 러스트를 쓸 필요가 없다.

러스트는 여전히 새롭게 발전하는 언어

러스트가 비동기 코딩을 위한 최선의 모델인지, 가비지 컬렉션을 없애는 것이 정말


개발자에게 도움이 되는지 등은 논쟁거리다. 그러나 러스트는 여전히 매우 새로운
언어다. 러스트 개발자는 러스트의 세부 사항을 적극적으로 연구하면서 러스트를
다루는 최선의 방법을 새롭게 발견하고 있다. 러스트를 이용해 프로그램을 만드는
방법에 정답은 없으며 전 세계 개발자는 계속해서 배우고 실험하는 중이다.

러스트는 개발자나 프로젝트에 따라 최선의 언어일 수도 있고 아닐 수도 있다. 또 일


반적으로 소프트웨어를 만들기 위한 최선의 솔루션일 수도 있고 아닐 수도 있다. 그
러나 탐구할 기회가 풍부한 재미있는 선택지인 것은 분명하다. 러스트는 참신한 언
어이고 배우기 위해 상당한 노력을 해야 한다. 개발자에게 러스트는 직면한 과제를
다시 생각하고 목표를 재구성하고 현대적인 소프트웨어를 작성하기 위한 최선의 방
법을 찾아 나설 동기를 부여한다. 사실 이것만으로도 꽤 흥미롭지 않은가?

8
Tech Guide

러스트 초보자를 위한
단계별 시작 가이드
Serdar Yegulalp | InfoWorld

러스트(Rust)는 모질라 사내에서 호기심으로 시작됐지만, 지난 몇 년 사이 차세대


네이티브 애플리케이션 및 베어메탈 솔루션으로 급부상했다. 이처럼 발전한 원동력
은 인기 있는 몇 가지 기능과 특징, 그리고 자체 툴체인과 구성요소 관리 시스템 등
여러 가지다.

이 글은 러스트를 처음 접하거나 향후 프로젝트에서 러스트를 고려 중인 개발자를


대상으로 한다. 러스트에서 작업 환경을 설정하고 IDE를 구성하고 러스트의 뛰어난
애플리케이션 개발 툴셋을 최대한 활용하는 방법을 살펴보자.

러스트 릴리스의 기본 구성

러스트 툴체인의 핵심은 러스트 컴파일러인 rustc와 러스트 설치를 관리하는 툴이


다. 러스트는 계속해서 발전하고 있으므로 툴체인도 지속해서 업데이트되고 있다.
소프트웨어 프로젝트는 코드의 안정화 버전과 베타 버전을 분리하기 위해 복수의
채널을 통해 제공하는 경우가 많다. 러스트 역시 다음과 같은 3가지 툴체인 업데이
트 채널을 제공한다.

•스테이블(stable) : 주 포인트 릴리스로, 대략 6주 단위로 나온다.


•베타(beta) : 다음 포인트 릴리스 후보이며 자주 나온다.
•나이틀리(nightly) : 가장 최신 빌드로, 실험적 신기능을 제공하지만 안정성은 보장하지
않는다.

개발자 캐롤 쿠츠마스키가 지적(https://bit.ly/3E4rFtl)한 것처럼 나이틀리 러스트


채널은 그 자체가 별개의 언어라고 생각하는 편이 좋다. 일부 러스트 기능은 나이틀
리 채널로만 제공되며 특수한 컴파일러 지시어를 통해서만 활성화된다. 즉, 베타 또
는 스테이블 채널에서는 컴파일조차 되지 않는다.

Deep Dive  9
Tech Guide

나이틀리 기능을 다른 채널에서 지원한다는 보장이 없으므로 의도적으로 이렇게


만들어졌지만, 그 기능 중 상당수는 나이틀리 채널에서 나와 최종적으로 베타와
스테이블 릴리스에 포함된다. 예를 들어 웹어셈블리로 컴파일하는 기능은 러스트
1.30부터 스테이블 버전에서 지원한다.

러스트 업데이트 채널과 관련해 개발자가 유의해야 할 점은 다음 3가지다.

1. 실제 프로덕션 작업에는 스테이블 버전을 사용하라.


2. 현재 소프트웨어를 앞으로 나올 버전에서 테스트하면서 업그레이드 시 문제가 생길 수
있는 부분을 확인하려면 베타 버전을 사용하라.
3. 나
 이틀리 버전은 샌드박스된 환경에서 러스트의 최신 기능을 실험하는 용도로만 사용
하라.

러스트 개발을 위한 운영체제 선택하기

러스트는 주요 플랫폼인 윈도우, 리눅스, 맥OS의 32비트와 64비트를 모두 지원하


며 각각을 위한 공식 바이너리(https://bit.ly/3xldVXw)가 있다. 그 외에 iOS, 안드
로이드, 리눅스용 ARMv6 및 ARMv7, MIPS 리눅스와 MIPS64 리눅스, x86 iOS,
윈도우 및 리눅스의 32비트 에디션, 웸어셈블리 등 다른 많은 플랫폼에도 공식 바이
너리가 있다. 그러나 자동화된 테스트 커버리지는 윈도우, 리눅스, 맥OS에 미치지
못한다. 윈도우 XP 또는 실험적인 하이쿠OS(HaikuOS)를 비롯한 다른 플랫폼은 비
공식 빌드를 통해 지원한다.

러스트 개발팀은 폭넓은 이식성이 러스트의 핵심 목표가 아니라고 밝힌 바 있다. 예


를 들어 러스트는 많은 ARM 아키텍처에서 사용할 수 있지만, 러스트가 로우엔드
하드웨어 플랫폼에서 공식적으로 지원된다는 보장은 없다. 그렇다고 해도 32비트
및 64비트 윈도우, 리눅스, 맥OS 등 일반적인 사용환경에서는 대부분 지원하는 러
스트 빌드를 찾을 수 있다.

윈도우에서 러스트로 개발할 계획(https://bit.ly/3lBouDk)이라면 툴체인을 고려해


야 한다. 러스트는 다음 2가지 윈도우 툴체인을 지원한다.

•네이티브 마이크로소프트 비주얼 C(MSVC) ABI


•GCC 링커에 사용하는 Gnu ABI

10
Tech Guide

윈도우에서 빌드되는 거의 모든 C/C++ 소프트웨어는 MSVC를 사용하므로 대부분


은 MSVC 툴체인을 선택하는 것이 좋다. GCC가 필요한 경우는 윈도우에서 GCC
로 빌드된 서드파티 라이브러리와의 상호운용성을 위한 경우가 대부분이다. 다행히
러스트의 툴체인 관리 시스템을 사용하면 MSVC와 GCC 툴체인을 모두 설치한 상
태로 두고 프로젝트별로 바꿔가며 쓸 수 있다.

러스트의 컴파일 타깃 중 하나는 웹어셈블리다. 즉, 러스트로 만들어 웹 브라우저


에 배포할 수 있다. 웹어셈블리 자체는 아직 완전히 다듬어지지 않았고 러스트의
웹어셈블리 지원도 마찬가지다. 그러나 나름의 계획이 있고 고생할 각오가 있다
면 웹어셈블리를 러스트로 컴파일하는 과정을 세부적으로 다룬 '러스트와 웹어셈
블리'(https://bit.ly/3Yw2597)를 참고하자. 러스트 및 웹어셈블리 엔지니어가 쓴
이 책에는 러스트로 작성해 웹어셈블리로 배포한 콘웨이(Conway)의 라이프 게임
(Game of Life) 구현 사례가 자세히 설명돼 있다.

rustup으로 러스트 설정 시작하기

러스트는 올인원 설치 프로그램과 툴체인 유지보수 시스템인 rustup을 제공한다. 이


를 다운로드(https://bit.ly/3jWxGl5)하고 실행하면 최신 버전의 러스트 툴체인을
자동으로 설치한다.

rustup이 유지관리하는 주요 툴은 다음과 같다.

•rustup 자체 : 새 버전의 rustup 또는 다른 툴이 게시될 때마다 rustup 업데이트를 실행


하면 모든 부분이 자동으로 업데이트된다.
•rustc : 러스트 컴파일러
•카고(Cargo) : 러스트의 패키지 및 작업 공간 관리자

기본적으로 rustup은 스테이블 채널의 러스트를 설치한다. 베타 또는 나이틀리 버전


을 사용하려면 rustup install nightly라고 입력해 수동으로 설치하고, rustup default
nightly라고 입력해 해당 버전을 기본값으로 사용하도록 러스트를 설정해야 한다.
또한 러스트 애플리케이션을 컴파일할 때 어느 채널을 사용할지 수동으로 지정
(https://bit.ly/3I5ak4O)할 수도 있으므로 프로젝트를 전환할 때마다 기본값을 설
정하고 재설정할 필요가 없다.

Deep Dive  11
Tech Guide

<화면 1> rustup은 러스트 툴체인의 모든 부분을 업데이트해 최신 버전으로 유지한다. 최신 기능이 포함되지만
불안정할 수 있는 구성요소가 포함된 나이틀리 툴체인이 안정화 버전과 별도로 업데이트된다.

rustup을 사용해 맞춤형 툴체인을 설치 및 유지할 수도 있다. 일반적으로 이런 툴체


인은 지원되지 않는 플랫폼을 위한 비공식적인 서드파티 러스트 빌드에 사용된다.
이때는 보통 자체 링커 또는 기타 플랫폼 전용 툴이 필요하다.

러스트의 또 다른 기본 전제는 다운로드된 패키지와 구성 정보인 카고 파일을 사용


자 프로필 하위 디렉터리에 저장한다는 것이다. 이것이 항상 좋은 것은 아니다. 여유
공간이 더 있거나 접근성이 더 높은 다른 드라이브에 이 데이터를 두고 싶은 사용자
도 있기 때문이다. 카고를 다른 곳에 저장하려면 설정이 끝난 뒤 수동으로 옮길 수
있다. 구체적인 방법은 다음과 같다.

1. 카고를 사용 중인 모든 프로그램을 종료한다.


2. 사용자 디렉터리의 .cargo 디렉터리를 원하는 곳에 복사한다.
3. 새 디렉터리를 가리키도록 CARGO_HOME, RUSTUP_HOME 환경 변수를 설정한다.
4. 새 디렉터리의 bin 하위 디렉터리를 가리키도록 PATH를 설정한다.
5. cargo를 입력해서 카고가 올바르게 실행 중인지 확인한다.

12
Tech Guide

러스트에 맞게 IDE 구성하기

러스트는 비교적 새로운 언어지만, 다수의 주류 IDE에서 이미 충실하게 지원한다.


개발자 마누엘 호프만이 areweideyet.com 웹사이트에서 이와 같은 지원 상태를 추
적하는 프로젝트를 운영하니 참고하면 된다.

러스트 개발팀은 러스트가 IDE에서 원활하게 작동하는 것을 명시적인 목표로 두고


있으며, 이를 위해 러스트 언어 서버(Rust Language Server, RLS)라는 기능을 사용
한다. RLS는 서드파티 파서가 아닌 러스트 자체 컴파일러에서 코드에 대한 라이브
피드백을 제공한다.

러스트를 지원하는 IDE는 다음과 같다.

•마이크로소프트 비주얼 스튜디오 코드는 러스트의 자체 개발자 툴팀에서 만든 러스트 언


어 지원 확장 기능(https://bit.ly/3lAe5HV)을 제공한다. 그만큼 통합 수준이 높고, 덕분에
러스트를 가장 잘 지원하는 IDE 중 하나다.
•이클립스(Eclipse) 사용자는 사전 패키징된 러스트 개발용 이클립스 에디션(https://
bit.ly/3k2dxKv)을 다운로드하거나, 이클립스 포톤(Eclipse Photon)용 독립형 코로전
(Corrosion) 플러그인(https://bit.ly/3HUnOQI)을 사용할 수 있다.
•이맥스(Emacs) 또는 빔(Vim)을 애용한다면 두 편집기를 위한 러스트 전용 애드온이 있
다. 이맥스에는 러스트 전용 모드(https://bit.ly/3In9tOo)가 있고, 빔에는 구문 하이라
이트 및 서식 지정을 위한 플러그인(https://bit.ly/3YAfz3y)이 있다. 이맥스(https://bit.

<화면 2> 러스트의 언어 서버 프로젝트는 작업 중인 코드에 대해 러스트 컴파일러에서 IDE로 라이브 피드백을 제
공한다. 이 사례는 비주얼 스튜디오 코드인데, 여러 면에서 러스트 언어 서버를 가장 완벽하게 지원한다.

Deep Dive  13
Tech Guide

ly/3KdLaUx)와 빔(https://bit.ly/40UgLQT) 모두 RLS를 지원하지만, 수동으로 추가하고


구성해야 한다.
•인텔리J(intelliJ) IDEA(https://bit.ly/3I1qZGD) 및 아톰(Atom) 사용자(https://bit.
ly/3XB4lue)는 러스트를 지원하는 플러그인을 추가할 수 있다.
•서브라임 텍스트(Sublime Text)는 기본적으로 러스트 구문을 지원하며, 플러그인
(https://bit.ly/3lEGBbi)을 통해 다른 고급 기능도 사용할 수 있다.

첫 러스트 프로젝트 생성하기

러스트 프로젝트는 일관된 디렉터리 구조를 갖고 코드 및 프로젝트 메타데이터는


그 안에 특정한 방식으로 저장된다. 코드는 src 하위 디렉터리에 저장되며 프로젝트
에 대한 세부 정보는 프로젝트 루트 디렉터리의 Cargo.toml(프로젝트의 기본 정보)
과 Cargo.lock(자동으로 생성된 종속 항목 목록), 두 파일에 저장된다. 이 디렉터리
구조와 메타데이터를 수동으로 만들 수 있지만, 러스트의 자체 툴을 사용하는 편이
더 쉽다.

참고로, 러스트를 배우기 위한 ‘예제로 배우는 러스트(Rust By Example)’ 온라인 가


이드(https://bit.ly/3IlQuDL)는 브라우저에서 바로 편집, 실행이 가능한 대화형 코
드 샘플을 제공한다. 러스트의 거의 모든 개념을 다루는데, 대여(borrowing), 라이
프타임(lifetime)과 같은 핵심적인 개념은 비교적 뒷부분에 나온다.

러스트의 카고 툴(https://bit.ly/3S1Xqch)은 러스트 프로젝트와 라이브러리, 또는 '


크레이트(crate)'를 관리한다. my_project라는 이름의 새 러스트 프로젝트를 자체 디
렉터리에서 생성하려면 cargo new my_project를 입력한다. 닷넷 코어로 작업하는
C# 개발자라면 dotnet new 명령을 생각하면 된다. 이 이름의 하위 디렉터리에 새
프로젝트가 기본 프로젝트 매니페스트(Cargo.toml 파일)와 함께 표시되고 src 하위
디렉터리에는 프로젝트의 소스 코드에 대한 스텁이 생성된다.

새 프로젝트를 만들면 main.rs 파일이 프로젝트의 src 디렉터리에 자동으로 생성된


다. 이 파일에는 기본적인 'hello world' 애플리케이션이 포함돼 있으므로 이를 컴파
일하고 실행해서 러스트 툴체인을 바로 테스트할 수 있다.

기본 'hello world' 애플리케이션의 소스 코드는 다음과 같다.

14
Tech Guide

<화면 3> 러스트 프로젝트가 컴파일되면 모든 종속 항목이 자동으로 포함된다. 경고 또는 오류를 유발하는 모든
요소에 대해 세부적인 라인별 피드백이 표시된다.

fn main() {
println!(“Hello World!”);
}

애플리케이션을 빌드하고 실행하려면 프로젝트 디렉터리의 루트로 이동해 cargo


run을 입력한다. 참고로, 카고는 기본적으로 디버그 모드로 프로젝트를 빌드한다.
릴리스 모드로 실행하려면 cargo run –release를 사용한다. 바이너리는 사용 중인 컴
파일 프로필에 따라 프로젝트의 target/debug 또는 target/release 하위 디렉터리에
빌드된다.

러스트 크레이트 사용하기

패키지 관리는 모든 현대 프로그래밍 환경의 핵심 요소다. 러스트는 러스트 툴로 배


포하도록 패키징된 서드파티 라이브러리인 '크레이트(crates)'를 제공한다. 크레이
트는 공식 러스트 패키지 레지스트리인 Crates.io에서 찾을 수 있다.

프로젝트가 특정 크레이트에 대해 종속성이 있는 경우 프로젝트의 Cargo.toml 파일


을 편집해 해당 크레이트를 지정해야 한다. 이렇게 지정하는 일반적인 방법은 수동
으로, 즉 텍스트 편집기를 사용해 직접 Cargo.toml을 편집(https://bit.ly/40Vdhxy)
하는 것이다. 다음번에 프로젝트가 다시 빌드될 때 필요한 모든 종속 항목을 러스트
가 자동으로 가져온다.

Deep Dive  15
Tech Guide

참고로, cargo-edit(https://bit.ly/3Iq7Ak4)와 cargo-edit-locally(https://bit.


ly/3jUqNRw), 두 개의 툴은 비공식적인 서드파티 프로젝트지만, 명령줄에서 종속
항목을 업데이트할 수 있다. 단, cargo-edit-locally는 2017년 이후 업데이트되지 않
았다.

외부 크레이트에 의존하는 러스트 프로젝트를 빌드하면 카고는 기본적으로 Crates.


io에서 이런 크레이트를 찾으므로 수동으로 가져올 필요가 없다. 비공개 리포지토
리와 같이 레지스트리에 호스팅되지 않는 크레이트가 필요한 경우 크레이트 이름이
아닌 URL로 프로젝트의 크레이트를 참조할 수도 있다.

다른 채널에서는 제공되지 않는 실험적인 기능을 사용하는 일부 크레이트는 러스트


의 나이틀리 채널에서만 설치, 빌드할 수 있다. 나이틀리 릴리스 채널에서 이런 크레
이트를 설치하는 경우 컴파일 자체가 실패하지 않는 한 어떠한 경고도 표시되지 않
는다. 일반적으로 크레이트 문서에는 나이틀리 채널이 필요한지 표기돼 있으므로
컴파일이 아니라 크레이트를 포함하기 전에 문서를 꼭 확인해야 한다.

한편 크레이트에는 바이너리가 포함돼 함께 제공되기도 한다. 러스트 개발에 사용


하는 명령줄 툴도 있고 ripgrep(https://bit.ly/3lsGtvs) 같은 범용 툴도 있다. 이런
크레이트를 설치하려면 cargo install <크레이트 이름> 형식으로 입력하면 된다. 러스
트로 생성한 바이너리를 배포하는 방법은 여러 가지가 있지만, 러스트 개발자가 러
스트 툴을 사용하는 워크플로우에서 크레이트를 가져오는 방식이 가장 편리하다.

러스트 크로스 컴파일하기

러스트는 여러 툴 체인을 지원하므로 하나의 러스트 설치 환경에서 현재 컴파일하


는 것과 다른 타깃 운영체제 및 환경으로 러스트 애플리케이션을 컴파일할 수 있다.

이런 크로스 컴파일을 위해서는 현재 작업 중인 플랫폼에서 타깃 플랫폼과 일치


하는 툴체인이 필요하다. 윈도우에서 리눅스를 대상으로 하는 크로스 컴파일이나
그 반대의 크로스 컴파일에서는 GCC 링커만 있으면 되지만, 때로는 더 복잡할 수
있다. 예를 들어 맥OS로 크로스 컴파일(https://bit.ly/3Yx12pk)하려면 엑스코드
(Xcode) IDE 라이브러리인 binutils에 해당하는 애플 라이브러리인 cctools와 맥OS
SDK가 필요하다.

16
Tech Guide

다음과 같은 서드파티 툴을 이용하면 이런 번거로움을 없앨 수 있다. 참고로, 이 툴


중에서 최근 업데이트된 툴은 크로스 뿐이다.

•크로스(Cross, https://bit.ly/3EctkgD) 툴은 64비트 x86 리눅스 호스트에서 바로 실행된


다. 제작자에 따르면, 64비트 윈도우와 MIPS를 포함한 광범위한 타깃으로의 '무설정' 크
로스 컴파일을 지원한다.
•트 러스트(Trust, https://bit.ly/3YQq0jf) 툴은 트래비스(Travis) CI 및 앱베이어
(AppVeyor) 템플릿으로, 러스트 프로젝트의 바이너리 릴리스를 자동으로 게시한다. 트러
스트는 리눅스, 윈도우, 맥OS용으로 빌드할 수 있는데 2가지 조건이 있다. 하나는 트래비
스 CI 및 앱베이어 서비스를 사용할 것, 다른 하나는 프로젝트가 깃허브에 호스팅돼야 한
다는 것이다.
•크로스빌드(crossbuild, https://bit.ly/3XBcZJc) 프로젝트는 3가지 주요 플랫폼 사이의
크로스 빌드에 사용할 수 있는 다중 아키텍처 도커 이미지를 제공한다.

러스트를 배울 수 있는 흥미로운 프로젝트들

러스트를 익히는 좋은 방법 중 하나는 서드파티 프로젝트를 체크아웃해 로컬로 사


용해보는 것이다. 쉽게 하려면 러스트 프로젝트 리포지토리의 깃 복제본을 만들면
된다. 리포지토리의 루트에 Cargo.toml 파일이 있으면 카고에서 인식된다.

현재까지 카고가 지원하지 않는 한 가지 기능은 자체적으로 크레이트의 로컬 복제


본을 만드는 것이다. 이 때는 깃을 사용하면 되는데, 러스트를 본격적으로 사용하
는 사람이라면 어차피 깃을 설치해야 한다. 서드파티 카고 하위 명령인 cargo-clone
(https://bit.ly/40TMRfA), cargo-clone-crate(https://bit.ly/3S25kCt)를 통해 직접
카고에 이 기능을 추가할 수 있다.

이제 만지작거리면서 러스트를 배울 만한 프로젝트를 찾아보자. 우선 깃허브의 어


썸 러스트(Awesome Rust, https://bit.ly/3xrqi4t) 리포지토리로 가보자. 러스트의
최초 실제 애플리케이션 구현 사례 중 하나인 서보(Servo) 웹 브라우저 엔진 프로젝
트(https://bit.ly/3E7pGol)가 있다. 마크다운 문서에서 온라인 책과 e북을 만드는
mdBook 프로젝트(https://bit.ly/3K9wJAS)도 흥미롭다.

이밖에 트러스트-DNS(DNS 서버와 클라이언트, https://bit.ly/3I1srsr), 알라크리


티(Alacritty: GPU 강화 터미널 에뮬레이터, https://bit.ly/3I59FjO), 메이드세이프

Deep Dive  17
Tech Guide

(MaidSafe, https://maidsafe.net) 탈중앙화 데이터 플랫폼 등도 살펴볼 만하다. 로


그(Rogue)와 비슷한 게임인 마고그(Magog, https://bit.ly/3jRd8L2)도 꽤 재밌다.
이처럼 어썸 러스트에는 배우고 사용할 만한 좋은 크레이트와 서드파티 툴이 있다.

정식 개발자로 참여할 프로젝트를 찾고 있다면 깃허브에서 'good-first-issue' 태그


가 붙은 미결 문제가 있는 러스트 기반 프로젝트를 검색하면 된다. 이 태그는 신규
개발자가 비교적 쉽게 도움을 줄 수 있는 문제를 보여준다. 프로젝트에 도움을 주면
서 동시에 러스트를 배울 수 있는 좋은 방법이다.

테크놀로지 및 비즈니스 의사 결정을 위한


최적의 미디어 파트너
기업 IT 책임자를 위한 글로벌 IT 트렌드와 깊이 있는 정보

ITWorld의 주 독자층인 기업 IT 책임자들이 원하는 정보는


보다 효과적으로 IT 환경을 구축하고 IT 서비스를 제공하여
기업의 비즈니스 경쟁력을 높일 수 있는 실질적인 정보입니다.

ITWorld는 단편적인 뉴스를 전달하는 데 그치지 않고 업계


전문가들의 분석과 실제 사용자들의 평가를 기반으로 한 깊이
있는 정보를 전달하는 데 주력하고 있습니다. 이를 위해 다양한
설문조사와 사례 분석을 진행하고 있으며, 실무에 활용할
수 있고 자료로서의 가치가 있는 내용과 형식을 지향하고
있습니다.

특히 IDG의 글로벌 네트워크를 통해 확보된 방대한 정보와


전 세계 IT 리더들의 경험 및 의견을 통해 글로벌 IT의 표준
패러다임을 제시하고자 합니다.

18

You might also like