Skip to content

Latest commit

 

History

History
27 lines (15 loc) · 8.81 KB

00_intro.md

File metadata and controls

27 lines (15 loc) · 8.81 KB

Rust 언어 소개

이 책을 접하신 분들은 대부분 Rust가 높은 메모리 안전성을 가지고있으면서 동시에 높은 성능을 제공한다는 것을 들으셨기 때문에 Rust를 공부해려는 분들이실 것입니다. 이미 미국 정부나 기타 여러 기관들에서 Rust 언어를 여러 차례 추천하고 있다는 것도 들으셨을 것이고, StackOverflow등의 여러 개발자 사이트에서 매년 배우고 싶은 언어로 손꼽히고 있다는 것도 들으셨을 것입니다.

사실 제가 더 해 드릴 말은 없습니다. 말로 백번 설명하는 것보다, 조금만 공부를 해보시면 그런 말들이 모두 이해가 되실 것입니다. 혹시라도 C언어 같은 메모리 안전성을 보장하지 않는 언어로 밥벌이를 하고계시다면, Rust를 공부하시면서 등골이 오싹해지는 순간이 올거라 확신합니다. 저는 여러번 그런 순간을 겪었습니다. “세상이 이렇게 변했구나. 더 이상 내가 아는 지식으로만 먹고살 수 없는 때가 오고있구나.” 그런 생각도 들면서 겁도 나지만, 이런 좋은 해결책이 세상에 나타났다는게 흥분되고 기대되기도하는 복잡한 감정이 들었습니다.

그래도 Rust의 장점을 물어보신다면 저는 Rust 언어의 홈페이지 https://www.rust-lang.org/를 먼저 보시면 좋다고 말씀드립니다. 홈페이지의 첫 페이지를 보면 Rust의 대표적인 장점이 3가지라고 소개합니다.

  1. Performance
  2. Reliability
  3. Productivity

Rust의 성능은 런타임과 가비지 콜렉터가 없기 때문에 얻을 수 있는 것으로 프로그래밍 경험이 있으시면 충분히 이해가 될 것입니다. 그리고 Reliability는 Rust 언어 특유의 ownership 모델로 가능한 것인데, 다른 언어에는 없는 개념이지만 Rust를 조금만 공부하다보면 이해가 될 것입니다. 생소한 개념이지만 어려운 개념은 아닙니다. C++언어를 아시는 분은 move의 컨셉과 거의 같다고 생각하셔도 좋습니다. C++에서는 move가 발생할지를 선택할 수 있는 반면에 Rust에서는 기본적으로 move가 발생한다는 차이가 있습니다. ownership의 개념은 사실 간단하지만 막상 개발을 하다보면 어떻게 적용되고있는지를 이해하기 어려울 때가 있습니다. 이 책의 마지막에서 작은 프로그램을 개발해보면서 ownership 개념이 어떻게 적용되는지를 좀더 자세히 이야기하겠습니다.

그런데 많은 사람들이 Productivity에 대해서 많은 분들이 간과하거나 오해하시는 부분이 있는 것 같습니다. Rust의 소개 자료나 타 언어와의 비교자료를 보면 대부분 생산성을 높이려면 Go나 파이썬등의 고급 언어를 사용하면되고, 높은 성능이 필요하면 Rust를 선택하라는 이야기를 할 것입니다. 그런데 왜 Rust 홈페이지에서는 Productivity를 강점으로 내세우고 있을까요?

첫번째로는 컴파일러의 에러 메세지가 실질적으로 어디를 고쳐야될지 대부분 정확하게 알려준다는 것입니다. 처음 Rust를 접하는 개발자들이 자주 하는 실수들은 거의 대부분 컴파일러가 고치라고 알려주는 대로만 고쳐도 해결됩니다. 역사가 오래된 언어들, 특히 C 컴파일러의 에러 메세지와 비교해보면 컴파일러에 인공지능이 들어있나 싶을 정도입니다. 또 cargo등 개발 관련 툴들이 너무나 편리합니다. C언어는 라이브러리가 보통 운영체제에 설치되므로 apt나 yum으로 라이브러리를 설치합니다. 또 C++은 cmake나 maven등이 있고 파이썬에는 pip, Golang에는 go가 있습니다. 아무래도 가장 최신 언어인 Golang의 go가 개발에 관한 다양한 기능을 지원해 주고 있지만, 저는 그중에서 cargo가 제일 적응하기 쉬웠고 편리했다고 말씀드리고 싶습니다. 단지 컴파일에만 편리한 것뿐 아니라, 테스트와 벤치마크를 실행하고, 라이브러리의 버전을 관리하고, 코드 포맷을 고쳐주는 등 개발에 꼭 필요한 기능들을 간단하게 실행할 수도 있습니다. 다른 언어들은 개별 툴들을 버전에 맞춰서 설치하고, 각 툴의 사용법을 따로 익혀야됩니다. 하지만 러스트는 Cargo 하나만으로 모든 개발 과정을 전부 실행할 수 있습니다.

Rust 언어의 특성상 빌드 시간이 다른 언어에 비해 긴 것도 사실입니다만, vscode등 최신 IDE툴을 사용하면 실시간으로 빌드 에러를 표시해주는 등의 기능을 사용할 수 있으므로 빌드를 자주 할 필요가 없습니다. 그리고 꼭 최종 실행 파일을 만들 필요가 없다면 "cargo check" 명령으로 코드에 컴파일 에러가 없는지만 빠르게 확인할 수 있습니다.

그리고 제가 생각하기에 생산성을 높일 수 있는 또 다른 이유는 바로 컴파일이 된다면 실행 중에 에러가 날 일이 거의 없다는 것입니다. unsafe같이 예외적인 기능을 사용하거나 C나 C++같이 unmanaged언어와 결합해서 사용하지 않는 이상 컴파일러가 에러를 찾아내지 못했다면 메모리 관련 에러는 없다고 생각할 수도 있습니다. 물론 논리적으로 데드락이 일어나는 등의 상황은 방지할 수 없지만, 메모리 에러가 발생하지 않는 것만으로 얼마나 많은 디버깅 시간을 줄일 수 있을지 상상이 되실겁니다. C++의 스마트 포인터를 사용한다고해도 사실 메모리 누수나 메모리 관련 버그를 완전히 방지할 수 있으려면 굉장히 오랜 시간을 C++언어 학습에 투자한 개발자가 세심하게 코딩을 해야합니다. 디버깅 시간을 줄일 수 있다는 것은 전체적인 개발 시간을 줄일 수 있다는 것이고, 결국 엄청난 생산성 향상을 의미합니다. 파이썬이나 Golang같은 가비지 콜렉터 기반 언어에 비해서 개발 시간은 오래 걸릴 수 있지만, 높은 성능으로 사용성이 높아지는 것을 따지면 Rust로 만든 제품의 만들어내는 가치는 더 클 것입니다. 확실히 파이썬의 성능으로 충분한 제품이면 파이썬으로 개발하는게 맞지만, 좀더 성능과 안전성이 동시에 필요한 제품을 개발해야하는 경우에 Rust도 개발 생산성이 부족하지 않다는 주장으로 이해해주셨으면 합니다.

마지막으로 Rust 언어가 익숙해지는데 시간이 오래 걸린다는 의견이 많습니다. 저도 동의합니다. Rust 언어는 아무 최근에 개발되었고, 지금까지 출시된 언어들의 장점들을 모아서 다중 패러다임 언어를 지향합니다. Rust 언어의 모든 기능들을 능숙하게 활용하려면 사실 컴퓨터의 내부도 어느정도 이해해야하고 함수형 언어와 객체지향 언어에 대한 컨셉들도 이해하고 있어야합니다. 프로그래밍 언어 자체를 경험해본 적이 없는 이에게는 쉽지 않은 언어입니다. 하지만 반대로 Rust 언어를 자주 활용하다보면, 로우레벨 개발에 대한 경험과 함수형 언어에 대한 감각, 객체지향 설계에 대한 경험을 할 수 있습니다. 한꺼번에 모든 것을 하려하지말고, 당장 나한테 필요한 만큼 필요한 것을 개발하면서 조금씩 확장하다보면 어느덧 익숙해질 수 있을 것입니다. 이미 많은 분들이 좋은 책들과 참고 문서들을 만들어주고계시니 저와 여러분들도 할 수 있습니다.

이 책은 Rust라는 언어를 소개하는 책이지, 프로그래밍이라는 것을 소개하는 책은 아닙니다. 이 책은 이미 기존 프로그래밍 언어를 조금 경험해본 분들이 빠르게 Rust의 특성을 이해하고 개발을 시작할 수 있도록 돕는 것이 목표입니다. 이제 막 프로그래밍을 입문해서 if, for 등의 구문을 사용해보고 프로그래밍이라는 것이 무엇인지 경험해본 분들을 대상으로 합니다. 물론 기존 프로그래밍 언어를 능숙하게 다루고 있을 필요는 없습니다. 단지 if 조건문이나 for 루프 등 일반 프로그래밍 언어들의 기능들에 대한 설명을 프로그래밍을 접해보지 않은 대상이 필요한 만큼 세부적으로 다루고 있지는 않습니다. 빠르게 Rust 프로그래밍을 시작할 수 있도록, Rust의 기능에 집중해서 설명합니다.

이 책의 범위는 터미널에서 동작하는 간단한 single-thread 어플리케이션을 구현하는데 필요한 사항들까지입니다. 이 책으로 Rust의 기본 문법과 몇가지 자주 사용되는 라이브러리 등을 익힌 후에는 multi-thread와 관련된 자료들이나 Async 관련 자료들을 공부하시면 충분히 실무에도 적응하실 수 있을거라 생각합니다.