개발놀이터

Rust와 Go 본문

기타/GPT야 이것좀 알려줘

Rust와 Go

마늘냄새폴폴 2023. 5. 4. 02:01

트위터에서 개발자들의 얘기를 들어보면 Go를 사용해서 치명적인 버그가 발생했다. 그에비해 Rust는 아주 대단한 언어다. 라는 글을 몇개 본적이 있습니다. 

 

그러면서 어떤분은 운영체제만큼은 C로 개발하는 것이 일반적이었으나 마이크로소프트가 터미널 커널을 C에서 Rust로 바꾸는 작업을 진행하고 있다는 게시글을 첨부하며 Rust를 찬양(?) 하는 모습도 보여줬습니다. 

 

문득 궁금하더군요 Rust와 Go의 차이가 무엇이고 왜 Go는 멸시받고 Rust가 흥하게 되었는지말이죠. 

 

이번 카테고리는 새롭게 출범하는 "GPT야 이것좀 알려줘" 입니다. 제 블로그 주제 (자바, 스프링, CS, 알고리즘문제) 와 어긋나는 주제들 하지만 평소에 궁금했던 내용들을 GPT를 통해 더블체크없이 단순히 상식을 쌓아가는 느낌으로 공부하는 카테고리입니다. 

 

GPT로 얻게된 정보는 ~이다 체로 제 생각은 ~습니다 체로 적겠습니다. 

 

첫 주제는 Rust와 Go 그리고 프로그래밍 언어에 대한 내용입니다. 

 

Rust 넌 뭐길래 이렇게 사람들이 좋아해? (Rust의 장점)

Rust의 장점을 GPT에 물어보면 다음과 같이 말해줍니다. 

 

  • 메모리 안정성 : Rust는 흔히 발생하는 buffer overflow나 null pointer dereferencing과 같은 프로그래밍적 에러들을 보호하기위해 디자인되었다. 이는 취약점이나 충돌로부터 보호해주는 역할을 한다. Rust의 ownership과 borrowing 시스템은 메모리가 GC없이 안전하고 효율적으로 관리되는 것을 보장한다. 
  • 성능 : Rust는 C나 C++과 같이 높은 성능을 보여주는 언어이다. Rust의 zero-cost 추출과 같은 현대적인 특징들은 빠르고 유지하기 쉬운 코드를 작성하는 것을 도와준다. 
  • 동시성문제 : Rust의 ownership과 borrowing 시스템은 다른 언어에서 흔히 발생되는 데드락이나 데이터 race condition과 같은 위험 없이 동시성 코드를 작성하기 쉽게 만들어준다. Rust의 async/await syntax는 비동기 코드를 작성하기 쉽게 만들어주고 이는 특히 네트워크나 웹 프로그래밍에서 중요한 요소로 자리매김하고 있다. 
  • 안전성 : Rust의 안전한 특징들은 정확하고 신뢰성있는 코드들을 작성하기 더 쉽게 만들어준다. Rust의 컴파일러는 컴파일 때 흔히 발생하는 에러들을 체크해주고 컴파일러의 타입 시스템은 코드가 알맞은 타입인지 일관적인지를 보장해준다. 이는 그들이 무넺가 생기기 전에 버그를 캐치하는 것을 더 쉽게 만들어준다. 
  • 커뮤니티 : Rust는 최고의 언어를 만들기 위해 최선을 다하는 활발한 오픈소스 커뮤니티를 보유하고 있다. Rust의 커뮤니티는 많은 수의 높은 퀄리티의 라이브러리나 도구들이 개발되어왔다. 그러면서 Rust를 쉽게 시작할 수 있게끔 만들어준다. 

 

장점만 보면 어마어마하긴 하네요. 그럼 Rust와 Go가 이렇게까지 치고박고 싸우는 이유에 대해서 알기 위해 저는 이 둘의 차이점에 대해서 물어봤습니다. 

 

추가적으로 프롬프트는 "개발자들 사이에서 Go에 대한 인식이 Rust보다 낮다고 하더라. 어떤 부분에서 개발자들이 그렇게 말하는 건지 알고싶어. 나는 C 생태계에 대해서 잘 모르니까 디테일하고 쉽게 설명해줘" 라고 쳤습니다. 

 

Rust와 Go의 차이점

1. 메모리 관리에 대한 접근 방식

Rust와 Go의 차이점 중 하나는 그들의 메모리 관리를 위한 접근 방식이다. Rust는 메모리를 정확히 관리하는 것을 보장하는 안전한 특징을 갖지 않고서도 manual 메모리 관리를 제공한다. 반면에 Go는 메모리 관리를 자동적으로 하기 위해 GC를 도입했고 이는 높은 메모리 사용과 몇몇 케이스에서 더 낮은 성능을 보여줬다. 

 

2. 동시성문제에 접근하는 방식

Rust와 Go의 또 다른 차이점은 동시성문제를 접근하는 방식이다. Rust의 ownership과 borrowing시스템은 동시성 코드들을 작성하는 방법을 더 안전하고 효율적으로 작성할 수 있도록 제공한다. 

 

반면에 Go는 채널과 Go루틴들을 통해 동시성문제에 대해 내장된 기능을 지원한다. 두 언어 모두 동시성 코드들을 작성하는 것에 대해 잘 구현되어 있다. 하지만 Rust의 ownership 시스템은 추가적으로 몇몇 케이스에서 이득이 될 수 있는 안정성을 보장한다. 

 

3. 성능

성능에 관해서도 Rust는 일반적으로 Go보다 더 빠르다고 알려져있다. 특히 밀집된 CPU 일 처리에서 특히 그 차이가 두드러진다. Rust의 메모리 전반에 low-level 컨트롤과 GC를 채택하지 않은 선택은 높은 성능의 애플리케이션을 위해 잘 구현되어있다. 

 

그러나 Go는 더 간단한 syntax와 내장된 동시성 프록래밍 특징 덕분에 네트워크나 웹 애플리케이션을 구현하는데 탁월한 선택이 된다. 

 

4. 사용처

Go는 컨테이너화 (containerization) 와 클라우드 인프라와 종종 연관된다. 이는 애플리케이션에서 넓은 범위로 사용될 수 있는 일반적인 목적을 가진 언어라는 뜻이다. 

 

반면에 Rust는 종종 시스템 프로그래밍이나 네트워크 프로그래밍이나 다른 low-level 코딩에서 자주 사용된다. 

 

 

정리하자면 Rust는 GC없이 메모리를 관리할 수 있어서 성능적인 부분이 뛰어나지만 Go도 나름대로 다양한 syntax와 동시성 프로그래밍을 지원하면서 네트워크안 웹 애플리케이션을 구현하는데 탁월한 성능을 보여준다는 의미군요. 

 

하지만 여기서 의문이 들었습니다. Java도 GC를 가지고 있어서 느리다는 평가를 받았지만 후에 JIT 컴파일러의 도입으로 성능을 최대한으로 끌어올렸습니다. 

 

때문에 Java가 느리다 라는 말은 이제 옛말이 되었죠. 그럼 Go도 Java처럼 GC를 갖고있음에도 성능을 끌어올릴만한 요소가 있지 않았을까 궁금해졌습니다. 

 

Go와 JIT 컴파일러

Go도 Java와 비슷하게 GC를 이용해 메모리를 관리하고 있음에도 높은 성능을 끌어올렸다. Go의 GC는 GC에 의해 소모되는 시간을 최소화해주는 concurrent GC나 generational GC와 같은 기술을 사용해 성능에 영향을 최소화하도록 설계했다. 

 

Go는 또한 Java와 마찬가지로 Just-In-Time (JIT) 컴파일러를 도입했고 이는 런타임때 실행되는 코드들의 성능을 최적화함으로써 성능의 향상을 이뤄냈다. 하지만 Go의 JIT 컴파일러는 Java에서 사용되는 것과 같은 방식으로 진보되지는 않았다. 

 

 

정리하자면 Go도 Java와 마찬가지로 GC를 가지고 있음에도 성능적인 향상을 도모했지만 Java만큼 드라마틱한 성능 향상을 이끌어내지는 못했다는 말이군요. 

 

하지만 오해하실까봐 말씀드리지만 그렇다고 Java가 Go보다 빠르다는 것은 아닙니다. Java도 Go에 비하면 high-level 언어이기 때문에 속도가 느린 것은 어쩔 수 없습니다. 

 

이때 또 궁금해진 것이 있습니다. 바로 파이썬이죠. 파이썬은 왜 그렇게 느린걸까요? 제가 알고 있었던 내용은 high-level 중에서도 high-level 언어이기 때문이고 GC를 가지고 있기 때문이라고 알고 있었습니다. 제가 모르는 추가적인 내용이 있을까봐 GPT에게 물어봤습니다. 

 

 

파이썬

이번 섹션에 들어가기 앞서 low-level과 high-level에 대해서 잠깐 짚고 넘어가도록 하겠습니다. 프로그래밍 언어는 낮아지면 낮아질수록 기계언어와 비슷해지고 기계가 이해하기 쉬운 언어이기 떄문에 속도가 빠릅니다. 하지만 낮으면 낮을수록 기계언어와 가깝기 때문에 진입장벽이 매우 높죠. 

 

이와 반대로 high-level로 갈수록 사람의 언어와 비슷해지기 떄문에 이해하기가 쉽고 진입장벽이 낮지만 속도가 느리다는 단점이 있습니다. 

 

이제 파이썬이 속도가 느린 이유에 대해서 하나씩 살펴보도록 하죠. 

 

동적인 타이핑

파이썬은 동적인 타이핑을 지원한다는 것이 첫번째 이유이다. 동적인 타이핑을 지원한다는 의미는 변수의 타입이 런타임에 바뀔 수 있다는 의미이고 이는 메모리 사용과 실행시간의 관점에서 많은 오버헤드를 야기한다. 

 

인터프리터에 의한 실행

추가적으로 파이썬은 인터프리터에 의한 실행을 바탕으로 하는데 인터프리터는 바이트코드를 한줄씩 실행하는 역할을 한다. 이렇게 한줄씩 실행하다보니 컴파일때 한번에 모든 코드를 해석하는 컴파일 언어와 다르게 속도방면에서 차이가 날 수 밖에 없다. 

 

참고로 Java도 인터프리터 언어입니다. 

 

GC의 존재

또한 파이썬은 GC를 메모리 관리에 사용하는데 이는 성능에 영향을 미칠 수 있다. 파이썬의 GC가 일반적으로 효율적이지만 가끔 GC가 동작하는 시간에 프로그램이 정지하는 상황이 발생하기도 한다. 

 

 

여기서 오해하시면 안되는것이 모든 언어는 성능 즉, 속도가 모든 것을 좌지우지하지 않습니다. 파이썬은 AI와 머신러닝을 위한 가장 인기있는 언어입니다. 

 

파이썬은 NumPy, Pandas, SciPy, scidit-learn과 같은 다양한 라이브러리와 도구들로 데이터 분석, 과학적인 계산, 머신러닝을 지원합니다. 

 

 

여기까지 GPT에게 Rust와 Go 그리고 파이썬에 대해서 물어봤습니다. 

 

학교를 오고가며 지하철에서 할 거 없었는데 GPT로 평소에 몰랐던 것을 공부하니 시간도 빨리가고 유익한 시간이었습니다. 여러분들도 한번 GPT로 공부해보시는 것을 추천드릴게요. 

 

하지만 주의하셔야할 점이 영어로 질답을 하시는것이 퀄리티의 차이를 만들기 때문에 영어로 질답하시는 것을 추천드리겠습니다. 

 

긴 글 읽어주셔서 감사합니다. 오늘도 즐거운 하루 보내세요~

 

 

출처

Chat GPT - Open AI

 

 

 

'기타 > GPT야 이것좀 알려줘' 카테고리의 다른 글

JWT는 정말 stateless인가?  (0) 2024.06.10
Apache Kafka (with Chat GPT)  (0) 2023.05.11