이 블로그는 러스트(Rust)와 고(Go)를 비교한 영상을 보고 번역했다.
러스트와 고의 가장 큰 차이점은 단순함이다. 단순함은 고의 가장 큰 장점이다. 필요하다면 몇 시간 혹은 며칠 안에 배워서 사용할 수 있다. 팀 단위에서 사용할 때 생산성이 높고 관리하기 쉽다는 장점이 있다. 뿐만 아니라 가독성이 좋고 코드를 쓰기도 편리하다. 그러나 러스트는 배우는 데 몇 주가 걸리고 복잡하다.
고는 장점도 많지만 단점도 있다. 현대 프로그래밍 언어에서 볼 수 있는 제네릭이나 함수형 프로그래밍이 부족하다. 예제를 살펴보자.
let list = [1, 2, 3, 4, 5, 6];
서브 리스트를 다음과 같이 추출하고 싶다.
let sublist = [2, 4, 6];
여기서 해야 할 일은 정수 서브 리스트를 만들고 리스트에서 짝수를 추출하면 된다.
JS에서 리스트의 원소 중 짝수를 추출하기
let list = [1, 2, 3, 4, 5, 6];
let sublist.filter(x -> x % 2 == 0)
자바스크립트에서는 필터 함수를 이용해서 두 줄로 간단히 사용할 수 있다. 그렇다면 고는 어떻게 할까?
list := []int{1, 2, 3, 4, 5, 6}
sublist := []int{}
for i := range list {
if list[i] % 2 == 0 {
sublist = append(sublist, arr[i])
}
}
고는 반복문을 이용해서 구현할 수 밖에 없다. 러스트는 동일한 작업을 어떻게 쓸 수 있을까?
let list = vec![1, 2, 3, 4, 5, 6];
let sublist: Vec<i32> = list.into_iter().filter(|x| *x % 2 == 0).collect()
고보다 간단해 보이지만 장황한 면이 있다. 그래서 배우는 데 오래 걸린다.
고와 러스트의 가장 큰 차이점은 메모리 관리다. 고는 자바나 파이썬 그리고 자바스크립트처럼 가비지 콜렉터가 있다. 그러나 러스트는 수동 메모리 관리 시스템이다. 러스트는 소유와 빌림 개념을 기반으로 한다. 높은 자유도를 이용해서 좋은 성능을 내는 코드를 작성할 수 있지만 동시에 많은 비용(시간과 노력)이 발생한다. 피터 파커(Peter Parker) 이론에 따르면 높은 권력은 큰 책임감이 따른다고 했다. 추가적으로 러스트는 컴파일 시간에 많은 에러를 잡아내기도 한다. 그래서 신중히 다뤄야 하지만 잘만 다룬다면 매우 좋은 녀석이다.
고의 동시성을 가능하게 하는 두 가지 기능은 고루틴과 채널이다. 러스트도 이 기능을 갖고 있다. 기본 라이브러리를 사용하거나 tokio 같은 서드 파티 라이브러리를 사용하면 된다.
고가 더 성숙하다. 특히 웹 개발에 있어서 라이브러리와 커뮤니티가 고에서 훨씬 더 풍부하다.
러스트가 컴파일 시간이 훨씬 더 오래 걸린다. 그 이유는 컴파일 동안 최적화와 확인하는 체크 포인트의 갯수가 훨씬 많기 때문이다.
둘 다 컴파일러를 이용해서 바이너리 파일을 생성하는 점은 같다. 파이썬의 인터프리터나 자바를 위한 가상 머신이 필요하지 않다.
고는 서비스나 간단한 어플리케이션을 구현할 때 유용하다. 고는 자바나 C#을 대체할 용도로 만들어졌기 때문에 웹의 REST API를 구현하려고 한다면 아주 좋은 선택지다.
만약 성능과 효율을 중요하게 생각한다면 러스트가 적합하다. 펀더먼털한 이해가 필요하다면 러스트를 이용해서 전반적인 이해를 높일 수 있다. 러스트는 데이터베이스나 웹 브라우저 혹은 성능이 중요한 어플리케이션을 구현할 때 매우 유용하다.
러스트는 현재까지 웹 개발에 있어서 유용하진 않다. 커뮤니티에서도 고가 웹 개발에 있어 더욱 성숙하다. 러스트는 성능과 효율을 중요하게 생각하는 언어다. 웹 개발에 있어서 중요한 것은 CPU와 컴퓨팅 능력이 아니다. 오히려 인풋과 아웃풋의 속도가 더욱 중요하다. 따라서 데이터베이스의 응답을 기다리거나 파일을 얼마나 빨리 읽느냐의 문제에 있어서 러스터 기반의 프로그램은 비효율적이다. 물론 예외도 있다. 실시간 스트림 데이터를 처리하거나 높은 CPU의 성능을 필요로 할 때에는 러스트는 고려할 수 있는 좋은 옵션이다.
피터파커 이론 ㅋㅋㅋ 잘 보고 갑니다.