지난 2월 백악관 국가사이버책임자실은 26일 발표 보고서에서 메모리 안전 취약점 없는 프로그래밍언어를 사용하여 사이버 공격의 위험을 줄여야 한다고 주문했다. 메모리 취약점이 있는 프로그래밍 언어의 두 가지 예로 C와 C++를 제시했고, 2022년 11월에 NSA 사이버 보안 정보 시트는 메모리 안전성을 고려하 프로그래밍 언어로 러스트와 함께 C#, 고 자바, 루비, 스위프트를 명시했었다.
올 3월 경 이런 기사를 보며 잠시 러스트에 대해 살펴보기도 했었는데 당장 새로운 플랫폼으로 어쩔 수 없이 개발해야 하는 경우가 아니기에 그저 고개만 끄덕인다.
그렇게 잠시 살펴본바 로우레벨 언어에 가깝다고 판단했던 나로선 쉽게 친해질 수 없을 것만 같아 잊고 지내고 있었다.
그러던 중 제이펍에서 ‘파이썬과 비교하며 배우는 러스트 프로그래밍’이란 책이 출간되어 관심을 주지 않을 수 없었다.
취미이지만 파이썬을 기반으로 개발생활을 하고 있는 나로선 ‘파이썬과 비교하며 배우는’ 문장을 놓칠 순 없었다.
현재도 python으로 개발할 때 아주 가끔 C로 라이브러리를 만들어 함께 사용하기도 한다. 처음 사회에 발을 딛을 무렵 전공과 무관한 개발에 관심을 가지며 결국 십수년을 개발자 생활을 걷는다. 지금은 손 놓은지 오래 되었지만 그래도 조금은 몸이 기억하고 있다. 그나마 오랜 공백을 Chat GPT가 메워주고 있지만 이도 알아야 제대로 부려먹는다고 학습량은 더 늘어만 간다.
생활밀접형 프로그램을 만들어내며 빠르게 쉽게 접근 가능한 파이썬을 주력으로 하고 있다. 가끔 단순한 프로그램도 로딩 시 하세월인 경우 C를 꺼내 들어 리이브러리를 만들어 보곤 하는데 배보디 배꼽이 더 커진다.
이런 내게 시스템 프로그래밍이 가능한 로우레벨급 언어를 파이썬과 비교하며 배울 수 있다는 제목은 한순간 내 시선을 사로잡았다.
러스트로 할 수 있는 것?
나에게 러스트가 필요할까? 이 질문을 먼저 해보는 것이 좋을 것 같다.
우리는 어딘가 이동해야 할 때 적은 비용으로 효율적인 이동을 하고 싶어 한다. 늘 다니던 곳이라면 문제가 안되지만 해외여행이나 출장을 나간다고 가정하면 그때부턴 상황이 달라진다. 늘 그렇듯 안전하고 편안한 최적의 방법을 선택하게 된다.
역시 프로그래밍에 있어서도 파이썬만으로도 충분한 사용자가 있겠지만 그 이상의 상황이 발생했을 때는 새로운 무언가를 강구해야 한다.
개인적으론 CLI 도구나 네트워크 프로그래밍에 러스트를 사용하면 좋겠단 생각과 궁긍적으론 내가 만들고 있는 파이썬 GUI 프로그램의 실행 속도 개선에 러스트를 사용해 효과를 보고 싶다.
이는 이미 유사한 방법을 통해 그 단맛을 보았기에 러스트 또한 그 달달함을 맛보게 해주지 않을까 생각이 든다.
이 책의 대상은?
- 댜른 언어를 배운 적이 있는 초보 프로그래머
- 파이썬 전문가
- 협업 러스트를 사용하는 프로그래머
책의 서론에 대상 독자에 대해 저자는 위와 같이 세 분류로 나누고 있다. 개인적으로 막연한 언어에 대한 동경심으로 접근하기 보다는 최소한 파이썬은 이해하며 기본적인 프로그래밍에 대한 기초지식이 필요하지 않을까 생각한다.
이는 책 전반적으로 파이썬과의 비교를 통해 유사성과 차이점을 다루고 있기에 자칫 파이썬을 모르는 경우 두 가지 언어를 이해야는 어려움에 직면하지않을까 싶었다. 고로 파이썬을 다뤄본 사용자들이 위에선 해외여행으로 비유하였지만 안정적이고 규모 있는 프로젝트를 준비하기 위한 수단으로 배우는 것이 맞지 않나 생각된다.
책의 구성
책은 총 1장에서 15장으로 구성되어 있다.
이 책을 외국어 학습서와 비교하자면 영문법책에 해당하지 않나 생각된다. 자세한 책의 구성은 아래 각 장별 구성내용을 확인하면 된다.
책에는 ‘책의 구성’이란 제목으로 한 페이지로 소개하고 있다.
1장: 러스트를 배워야 하는 이유와 실무에서 러스트를 적극적으로 활용한 사례를 알아봅니다. 책의 코드를 함께 실행할 수 있는 환경을 차근차근 구축해봅니다.
2장: 변수를 선언하는 방법과 타입 시스템을 알아봅니다.
3장: 함수와 클로저를 정의하는 방법과 매크로는 무엇인지를 학습합니다.
4장: 논리적 분기를 만들거나 특정 코드를 반복하는 if, for와 같은 흐름 제어문을 배웁니다.
5장: 러스트에서 가장 중요한 개념 중 하나인 소유권을 배웁니다.
6장: 러스트 내장 자료형과 함수를 활용해 프로그래밍에서 중요한 요소인 이터레이터를 배웁니다.
7장: 파이썬에서 클래스를 사용한 객체 지향 방식과 러스트에서 구조체를 사용한 방식을 비교해봅니다.
8장: 코드가 길어지고 복잡해질 때 프로젝트를 모듈화하는 방법을 학습합니다.
9장: 제네릭과 트레이트로 코드를 추상화하는 방법과 러스트에서 라이프타임을 사용해 변수의 범위를 제한하는 방법을 살펴봅니다.
10장: 안정적인 프로그램을 만들기 위한 필수 요소인 에러 처리 방법과 대게을 위한 필수 요소인 로그 방법을 알아봅니다.
11장: 스마트 포인터를 통해 힙 메모리 공간을 안전하게 사용할 수 있는 방법을 살펴봅니다.
12장: 저수준 프로그래밍에서 가장 어려운 문제 중 하나인 멀티스레딩을 효율적이고 안전하게 수행하는 방법을 살펴봅니다.
13장: 모던 컴퓨팅에서 중요한 주제 중 하나인 비동기 프로그래밍을 알아봅니다.
14장: 단위 테스트와 문서 테스트를 수행하는 방법을 살펴봅니다.
15장: 러스트 코드를 파이썬에서 실행해서 GIL을 우회하고 빠른 연산 속도를 얻는 방법을 설명합니다.
온라인 서점 책 소개 내용에는 주요 내용으로 아래와 같이 소개하고 있다.
ㆍ소유권으로 메모리 관리하기
ㆍ파이썬의 객체 지향과 러스트의 구조체 비교하기
ㆍ제네릭과 트레이트로 코드 추상화하기
ㆍ에러 처리와 로깅 방법
ㆍ스마트 포인터로 힙 메모리 공간 안전하게 사용하기
ㆍ효율적이고 안전하게 멀티스레딩 수행하기
ㆍ비동기 프로그래밍과 테스트
ㆍ러스트의 파이썬 바인딩
위의 주요 내용을 보면 뭔가 상당히 어렵고 복잡해 보이지만, 위의 1장~15장 내용 소개를 보면 딱 감이 오며 실제 각장의 소개 내용으로 감을 잡고 시작해서인지 이질감은 느끼지 못했다.
어떤 기술을 습득함에 있어 책 한 권으로 모든 걸 다 표현할 순 없다. 나 또한 이 책을 통해 러스트와 파이썬을 차이점을 어느 정도 알게 되었고, 방향성을 잡을 순 있었지만 도입하기까지는 꽤 시간이 걸릴 것 같다. 익숙하지 않을 것을 익숙하게 만드는 데는 분명 시간과 노력이 필요하기 때문이다.
주요 특징
책의 주요 특징은 역시 제목에도 드러나 있듯이 ‘파이썬’을 다뤄본 독자들을 대상으로 하고 있다는 점이 특징이자 큰 장점으로 느껴졌다.
하지만, 파이썬엔 없는 소유권 개념등은 자칫 새로운 언어를 습득함에 큰 장벽이 될 수도 있겠지만 각 장 끝 부분에 제시하는 연습문제는 내게 큰 도움이 되었다.
개인적으로 소유권을 이해하기 위해 책에서 제공한 연습 문제를 토대로 추가 프로그램을 만들어보기도 했다. 이는 연습문제 제공이 이런 다양한 시도를 유도한 것 같다.
use std::io; // 모듈을 사용하여 입출력 관련 기능 사용 선언
fn main() {
let mut input = String::new(); // 0. 가변 변수 선언
println!("Enter a string:"); // 1. 사용자로부터 문자열 입력 받기
io::stdin() // 표준 입력 핸들 반환, 키보드 입력에서 데이터 읽기 가능
.read_line(&mut input) // 키보드에 입력한 한 줄의 문자열 읽기
.expect("Failed to read line"); // 에러처리
input = input.trim().to_string(); // 문자열 끝의 개행 문자를 제거
let length = calculate_length(&input); // 2. 문자열 길이 계산
change_string(&mut input); // 3. 문자열 변경
// 4. 결과 출력
println!("Modified string: '{}'", input);
println!("Length of the modified string: {}", length);
}
// 불변 참조를 사용하여 문자열 길이 계산
fn calculate_length(s: &String) -> usize {
s.len()
}
// 가변 참조를 사용하여 문자열 변경
fn change_string(s: &mut String) {
s.push_str(", world!");
}
러스트 학습의 길라잡이
위에도 이 책의 주요 특징에 소개 했듯이 파이썬과의 비교를 통해 하나 씩 배워가는 책의 구성은 중요한 핵심을 아주 잘 정리 해놓아 마치 몇몇 영문법 책들이 떠오르기도 했다. 성문 영문법이나 수학의 정석 느낌 아닌 내가 알아아 할 핵심을 아주 잘 정리해 놓고 있다.
300페이지 미만의 부담 스럽지 않은 않은 두께로 근래 꽤나 모아온 컴퓨터 서적들 대비 비교적 두께면에서는 중 하위 권에 속하지만 곰곰히 생각해보면 두껍다고 완독하며 옥이야 금이야 하지 않는 걸 보면 이 책 정도의 두께의 책들이 더 오래보고 옆에 두게 되지 않아 생각된다.
추가로, 책의 분량상 일일이 다 상세히 설명하지 못하기에 파이썬 경험이 있는 나로서도 생소한 부분이 꽤 있었다. 이럴땐 한 단원을 끝내며 연습문제를 풀때 Chat GPT와 함께 학습한 내용을 주거니 받거니 하며 보강 학습을 했었다. 아울러 제공된 연습 문제를 풀며 이를 응용한 다양한 연습문제를 만들어 학습하는 방법도 꽤나 유용했다. 즉, 책이 제공하는 방법이 아주 잘 정리 되어 있어 이를 바탕으로 살을 붙여 나갈 수 있었다.
이 책을 100%이해 하기 까지는 아직 많은 시간이 필요하다. 하지만, 넘사벽이라 생각하여 처다도 안보았기에 이 책은 나에게 친절한 길라잡이가 되어 주고 지름길을 안내해주는 느낌마저든다.
마지막으로 언어 학습(랭귀지 포함)할 때 항상 실전을 염두해 두고 학습을 하고 있어 내 실력 범위 안에서는 꼭 시도를 해보곤 한다.
아래는 러스트에 대한 개념을 잡기 위해 숫자 맞추기 게임을 만들어 보았다.
이런식으로 시도 하다 보면 파이썬 못지않게 러스트와 친숙해지지 않을까 생각된다.
파이썬 개발자라면 접근성을 배경으로 러스트의 안정성을 추가한다면 보다 효을적이고 안정성 있는 프로그램 개발과 함께 규모 있는 프로젝트도 자신감이 생기지 않을까 생각되었다.
앞으로 꾸준히 학습하며 접목시켜가는 막중한 임무가 남았지만 책을 통해 그 방향성을 잡을 수 있었기에 나를 비롯하여 파이썬 개발자들에게 큰 도움될 책임에는 분명하다.