Go vs. Rust (2)

wldbs._.·2024년 8월 5일

GoSeminar

목록 보기
2/4
post-thumbnail

출처: When to use Rust/Go

GO: 웹 API와 소규모 서비스 구축 중점 ← GOROUTINE의 힘으로 끝없이 확장 가능하게 함

  • GOROUTINE: 동시에 여러 작업을 수행할 수 있게 해주는 GO의 비동기 실행 단위

RUST: 대량의 데이터 및 알고리즘 실행과 같은 기타 CPU 집약적 작업 적합 ← RUST가 GO 우위, 고성능을 요구하는 프로젝트는 RUST가 더 적합


2-1. GO

  • C++의 대안 제공 위해 개발됨
  • 학습과 코딩이 더 쉽고 멀티 코어 CPU에서 실행할 수 있도록 최적
  • → 그 이후로 GO는 언어의 동시성을 이용하고자 하는 개발자들에게 좋은 역할, 하위 프로세스로서 기능을 실행할 수 있게 해주는 GOROUTINE 제공
  • GO의 중요 장점은 GOROUTINE을 쉽게 사용할 수 있다는 것 → 함수에 go 구문 추가하는 것만으로도 하위 프로세스로 실행

2-2. RUST

  • 고성능으로 설계됨
  • RUST가 메모리를 처리하는 방식은 GO와 달리 가비지 컬렉터가 필요하지 않다는 것
  • 엄격한 컴파일러: 가능한 데이터 race 조건(’다중 프로그래밍 시스템/다중 처리기 시스템에서 두 명령어(이상)가 동시에 같은 기억 장소를 엑세스할 때 그들 사이의 경쟁에 의해 수행 결과를 예측할 수 없게 되는 것’)을 피하기 위해 사용하는 변수와 메모리 참조를 확인
    • race 상황에 직면하지 않도록 보장
      • 데이터 경합이 발생할 수 있는 코드는 컴파일 단계에서 오류로 처리
      • (BUT 메모리의 안정성에 대한 지속적인 경계를 유지하기 어려울 수 있기 때문에 개발 과정에서 메모리 할당/할당 해제 원칙 주의)

2-3. Scalability(확장성)

  • RUST와 GO 둘 다 확장에 능함, 많은 CPU를 병렬로 처리 가능
  • GO에서는 GOROUTINE을 사용하여 각 데이터를 처리, WAITGROUP을 사용하여 데이터가 모두 끝날 때까지 기다릴 수 있다
    • WAITGROUP: 여러 GOROUTINE이 작업을 완료할 때까지 기다리는 데 사용하는 동기화 도구
      • 여러 GOROUTINE이 동시에 실행되면서 특정 작업이 모두 완료될 때까지 기다려야 할 때 유용
  • RUST에서 RAYON은 컨테이너 위에서 병렬로 쉽게 반복할 수 있는 유용한 상자 개념
    • RAYON: 멀티스레딩(’하나의 프로세스 내에서 여러 스레드(’프로세스 내에서 독립적으로 실행되는 작업 단위’)를 동시에 실행하여 작업을 병렬로 처리하는 기술’) 을 쉽게 구현할 수 있도록 도와주는 라이브러리, 데이터 병렬 처리와 작업 분할을 간편하게 수행할 수 있으며, 병렬 연산을 더 효율적으로 사용 가능

2-4. RUST 보안

  • 소유/차입/수명 개념을 통합하여 효율적인 메모리 할당/할당 해제 용이하게 한다
    let mut s = String::from("HELLO"); // 변수 s는 "HELLO" 라는 문자열을 소유하는 owner가 된다
  • 컴파일러에 내장된 빌트인 검사기 사용하여 소유권 모델 구현 → 데이터 참조가 메모리에 저장된 해당 데이터보다 오래가지 않도록 보장, 컴파일 시간 동안 메모리 취약성 방지
  • 널 참조 오류를 방지하기 위해 널 포인터를 제거하는 유형 시스템 사용
    • 널 포인터는 많은 프로그래밍 언어에서 일반적인 소스
    • 그러나 Rust는 널 포인터가 필요할 수 있는 특정 상황에서 → 안전하지 않은 원시 포인터를 사용할 수 있는 옵션을 제공 ⇒ 컴파일러는 안전하지 않은 포인터 검사 X이기에 주의!

2-5. GO 보안

  • GO의 단순성은 보안 취약점으로 이어질 수 있는 오류 줄이는 데 도움 된다 (→ 명시적인 오류 검사 사용 - 함수들이 오류를 반환 값의 하나로 반환)
  • 동시 응용 프로그램에서 race 조건을 식별하고 수정하는 데 도움이 되는 race 감지기가 내장
    • race 조건: 멀티스레딩 환경에서 여러 스레드가 동시에 공유 자원에 접근할 때 발생할 수 있는 문제. 적절한 동기화 기술이 없으면 결과를 예측할 수 없고 수정하기 어려울 수 있다
      • Rust는 컴파일 타임에 데이터 경쟁을 방지하는 반면,
        • 하나의 변수를 변경할 수 있는 권한을 한 소유자로 제한 → 메모리 안정성 보장
      • Go는 런타임에서 경합 조건 감지 및 이를 피할 수 있는 도구/기법 제공
        • -race 플래그로 데이터 경합 탐지 및 보고
        • sync 패키지를 통해 데이터 접근 제어/동기화
        • channel 사용 → 데이터를 공유하지 않고 메시지를 전달해 데이터 경합 피한다
    • GO의 race 감지기는 런타임(’응용 프로그램이 동작되어지는 때’)에 작동, race 조건을 감지하면 동기화되지 않은 액세스 위치를 포함한 상세 보고서 제공

2-6. CONCURRENCY(동시성): 개발된 소스코드 자체의 속성!

“Concurrency is about dealing with lots of things at once.” — Rob Pike (프로그래머)

  • GOROUTINE 기능은 Go의 내장 기능에 속하지만, Rust는 동시성 처리 메커니즘을 통해 동시성 프로그래밍 지원 (스레드/메시지 패싱/비동기(’동시에 일어나지 않는’) 프로그래밍/동기화 프리미티브(’여러 스레드나 고루틴이 동시에 실행될 때, 이들 간의 상호작용을 안전하게 제어하고 조정하기 위한 기본 도구’ → 데이터 경합(race condition) 방지, 일관된 상태 유지, 동시성 문제 해결)
    • Rust는 컴파일 타임에 많은 동시성 오류를 방지하는 데 중점
    • Go는 런타임에 동시성 문제를 관리하고 해결할 수 있는 강력한 도구 제공
  • → 동시성을 처리할 때 개발자 경험 측면에서 Go가 유리, 그러나 Rust는 메모리 안전성을 훨씬 더 잘 보장

2-7. RUST vs. GO Features

  • GO는 유용한 동시성 메커니즘, 즉 GOROUTINE과 채널에 대한 내장된 지원을 가지고 있다. 인터페이스와 GO 1.18을 기준으로 제네릭(’하나의 함수나 타입이 여러 타입에 대해서 동작하도록 해주는 프로그래밍 기법’)을 지원 [go 최신 버전 1.22.5]
    • 구글에서 개발되었기 때문에 HTTP 및 기타 웹 API에 대한 GO의 지원이 뛰어남
    • BUT GO는 상속/메소드 지원 X
  • Rust 언어는 Go보다 약간 더 기능이 풍부, trait(인터페이스의 더 정교한 버전)/제네릭/매크로/nullable 유형 및 오류에 대한 풍부한 내장형뿐만 아니라 쉽게 오류를 처리할 수 있는 ‘?’ 연산자도 지원
    • RUST에서 C/C++ 코드를 호출하는 것도 GO에서 호출하는 것보다 더 쉽다.

2-8. WHEN TO USE RUST/GO

  • 개발 속도를 중시하고 성능보다 구문 단순성, 코드 가독성을 선호한다면 GO가 적합
    • 동시적 프로그래밍, 네트워크 서비스, 신속한 개발, 확장성, 단순성, 가독성
  • 스레드 제어, 메모리 안전, 대용량 데이터 처리 및 성능을 중시한다면 RUST가 적합
    • 시스템 프로그래밍, 단순성을 넘어서 메모리 안전성 우선시, 세분화된 스레드 제어(스레드 동작 방식, 스레드 간 자원 공유 방식 제어)

CONCLUSION

  • GO는 내장된 동시성과 단순성을 활용한 웹 애플리케이션과 API를 만드는 데 탁월
  • RUST는 게임 개발과 같은 다른 응용 프로그램에서 코드에 대한 더 많은 제어 권한을 활용

⇒ Rust는 소유권 시스템을 통해 컴파일 타임에 데이터 경쟁을 방지하여 높은 성능과 메모리 안전성을 제공한다. 반면, Go는 가비지 콜렉터와 동기화 도구를 사용하여 런타임에서 메모리 관리를 간편하게 처리하며, 병렬 처리에 강점을 보인다.

Rust는 메모리 안전성과 성능을 우선시하고, Go는 개발의 편의성과 동시성 처리를 강조한다. Rust는 타입 시스템과 제어 흐름을 통해 안정성을 보장하는 반면, Go는 간결한 문법과 표준 라이브러리로 생산성을 높인다.

profile
공부 기록용 24.08.05~ #LLM #RAG

0개의 댓글