4P by neo 13일전 | favorite | 댓글 1개

Rust

  • Rust는 매우 사랑받는 언어로, 빠르고 훌륭한 커뮤니티를 가지고 있음
  • Rust는 소유권 개념을 도입하여 메모리 관리 문제를 해결함
  • Rc, Arc, Cow와 같은 유틸리티를 제공하여 참조 카운팅 및 "clone-on-write"를 지원함
  • 더 낮은 수준의 작업이 필요할 때는 unsafe 시스템을 사용하여 raw C 포인터에 접근할 수 있음
  • Rust는 태그된 열거형, 매치 표현식, 일급 함수, 강력한 타입 시스템 등 여러 기능적 언어의 특징을 가지고 있음
  • LLVM 기반 컴파일러를 사용하여 네이티브 코드와 WASM으로 컴파일 가능

Swift

  • Swift도 몇 년간 사용해왔으며, Rust를 배우면서 Swift와의 유사성을 발견함
  • Swift도 태그된 열거형, 매치 표현식, 일급 함수 등 기능적 언어의 특징을 가지고 있음
  • Swift는 기본적으로 값 타입을 사용하며 "copy-on-write" 의미론을 가짐
  • 더 빠른 성능이 필요할 때 소유권 시스템을 선택하여 값을 "move"할 수 있음
  • 더 낮은 수준의 작업이 필요할 때 unsafe 시스템을 사용하여 raw C 포인터에 접근할 수 있음
  • Swift도 LLVM 기반 컴파일러를 사용하여 네이티브 코드와 WASM으로 컴파일 가능

데자뷰?

  • Swift와 Rust는 매우 유사한 기능 세트를 가지고 있음
  • 큰 차이점은 관점에 있음
  • 기본 메모리 모델을 고려하면 차이점이 명확해짐

Rust는 하향식, Swift는 상향식

  • Rust는 저수준 시스템 언어로 시작하여 고수준으로 올라갈 수 있는 도구를 제공함
  • Swift는 고수준 언어로 시작하여 저수준으로 내려갈 수 있는 도구를 제공함
  • 메모리 관리 모델이 가장 명확한 예시임
  • Swift는 기본적으로 값 타입을 사용하며 "copy-on-write" 의미론을 가짐
  • Rust는 "moved"와 "borrowed" 값을 쉽게 사용하게 하지만 Cow 값을 사용하려면 추가 작업이 필요함
  • Swift는 "copy-on-write" 값을 쉽게 사용하게 하고, 대신 차용과 이동을 사용할 때 추가 작업이 필요함
  • Rust는 기본적으로 더 빠르고, Swift는 기본적으로 더 간단하고 쉬움

Swift는 Rust의 아이디어를 C-유사한 문법에 숨김

  • Swift의 문법은 기능적 언어의 개념을 C-유사한 문법에 숨겨 개발자들이 쉽게 받아들이게 함
  • Rust의 match 문과 Swift의 switch 문 비교
  • Swift의 switch 문은 사실 match 표현식과 동일하지만 다른 이름과 문법을 가짐
  • Swift는 enum에 메서드를 직접 추가할 수 있음

선택적 타입

  • Rust는 null이 없지만 None이 있음
  • Swift는 nil이 있지만 사실 None과 동일함
  • Swift는 Option 대신 T?를 사용하며, 컴파일러가 nil이 아닌지 확인하도록 강제함
  • Swift에서는 선택적 타입을 쉽게 사용할 수 있음

에러 처리

  • Rust는 try-catch가 없지만 Result 타입을 사용함
  • Swift는 try-catch 대신 do-catch를 사용하며, 함수 호출 전에 try를 사용해야 함
  • Swift의 에러 처리는 Rust와 비슷하지만 더 친숙한 문법으로 숨겨져 있음

Rust의 컴파일러는 문제를 잡고, Swift의 컴파일러는 일부 문제를 해결함

  • Rust의 컴파일러는 많은 일반적인 문제를 컴파일 시간에 잡아내고 해결책을 제안함
  • 자기 참조 열거형 예시
  • Swift는 indirect 키워드를 사용하여 재귀 타입을 표시하고, 컴파일러가 나머지를 처리함

Swift는 덜 "순수함"

  • Swift는 Objective-C를 대체하기 위해 설계되었으며, 기존 코드와 인터페이스할 수 있어야 했음
  • Swift는 많은 실용적인 선택을 했으며, Rust보다 더 큰 언어임
  • Swift는 "점진적 공개"를 염두에 두고 설계되어, 언어를 더 배울수록 더 많은 기능이 드러남
  • Swift의 일부 언어 기능:
    • 클래스 / 상속
    • async-await
    • async-sequences
    • actors
    • getter와 setter
    • lazy properties
    • property wrappers
    • Result Builders (예: HTML / SwiftUI)

편리함의 대가

  • Swift는 시작하고 생산성을 높이기 더 쉬운 언어임
  • 문법이 더 친숙하고 많은 작업이 자동으로 처리됨
  • Swift는 더 고수준 언어이며, 이는 동일한 트레이드오프를 가짐
  • 기본적으로 Rust 프로그램은 Swift 프로그램보다 훨씬 빠름
  • Rust는 기본적으로 빠르고, 느리게 할 수 있게 해주며, Swift는 기본적으로 쉽고, 빠르게 할 수 있게 해줌
  • 두 언어는 각각의 용도가 있음
    • Rust는 시스템 및 임베디드 프로그래밍에 더 적합함
    • Swift는 UI 및 서버 작성에 더 적합함
  • 시간이 지나면서 두 언어의 겹치는 부분이 더 커질 것으로 예상됨

GN⁺의 정리

  • 이 글은 Swift와 Rust의 유사성과 차이점을 비교하여 설명함
  • Swift는 Rust의 많은 아이디어를 차용하여 더 친숙한 문법으로 제공함
  • 두 언어는 각각의 강점과 용도가 있으며, 시간이 지나면서 더 많은 겹치는 부분이 생길 것으로 예상됨
  • Swift와 Rust의 메모리 관리 모델, 에러 처리, 선택적 타입 등 다양한 측면에서의 차이점을 이해하는 데 도움이 됨
  • 비슷한 기능을 가진 언어로는 Kotlin, TypeScript 등이 있음
Hacker News 의견
  • Rust를 처음 사용하는 사람들이 Rust를 좋아하는 이유는 ML 계열 언어를 처음 접했기 때문임

    • Rust는 Unix 해커들에게 친숙한 커뮤니티를 제공함
  • Rust는 비-GC 자동 메모리 관리를 주류로 가져온 첫 언어임

    • Swift, OCaml, Scala 같은 대안들도 존재함
  • Smalltalk의 시대는 끝났고, 이제는 ML의 시대임

    • 2000년대의 언어들은 Smalltalk에서 파생됨
    • 새로운 언어들은 ML 계열 언어임
    • Scala를 배우면 Rust나 Swift도 쉽게 배울 수 있음
  • Rust를 iOS Swift 앱에 통합하는 작업을 하면서 Swift를 더 사용하고 싶어짐

    • Swift는 크로스 플랫폼으로 사용할 수 있지만, 주로 Apple 플랫폼을 목표로 함
    • Rust는 다양한 패키지 시스템을 가지고 있음
    • Swift 패키지는 OS API에 의존하는 경우가 많아 Linux나 WASM에서 작동하지 않음
    • IBM이 서버에서 Swift를 포기한 사례가 있음
  • Rust는 메모리 관리 문제를 해결하기 위해 소유권 개념을 도입했지만, 이를 발명한 것은 아님

    • Cyclone 같은 언어들이 영향을 줌
  • Rust와 Swift는 각각의 강점을 가지고 있음

    • Swift는 더 간결한 문법을 가지고 있지만, 일부 영역은 컴파일러 전용임
    • Swift는 Apple 생태계 밖에서는 두 번째 또는 세 번째로 중요한 언어임
    • 이 문제가 해결되지 않으면 Swift는 주로 Apple 전용 언어로 남을 것임
  • Swift의 도구는 Rust보다 불편함

    • macOS 12를 사용하는 2018 MacBook Air에서 Xcode가 지원되지 않음
    • SourceKit-LSP는 두 번째로 중요한 도구로 취급됨
    • Rust 1.81과 rust-analyzer는 잘 작동함
  • Rust를 배우려고 시도했지만 예제가 너무 복잡해서 어려움을 겪음

    • Rust 웹사이트의 예제 코드가 복잡함
  • Swift는 열거형에 메서드를 직접 추가할 수 있음

    • Rust에서도 동일한 작업을 할 수 있음
  • Swift는 기본적으로 값 타입을 사용하며, 복사-쓰기 시멘틱스를 사용함

    • 이는 배열, 딕셔너리, 문자열에만 적용됨
    • Swift 값 타입은 즉시 복사됨
  • Swift를 칭찬하는 글을 읽을 때마다 Apple/MacOS 생태계를 사용하지 않는 개발자들의 경험이 궁금함

    • MacOS를 사용하지 않는 Swift 개발자를 만나본 적이 없음
    • 표준 라이브러리뿐만 아니라 도구, LSP, 라이브러리, 튜토리얼 등도 중요함
    • Swift가 좋은 언어라는 것은 믿지만, MacOS에서만 좋은 것 같음
  • Zig와 Swift의 점 문법을 싫어하는 유일한 사람인지 궁금함

    • .variant vs Type::Variant
    • 충분히 길거나 복잡한 코드에서는 타입 이름이 가까이 있지 않으면 불편할 것임
    • IDE 같은 기능이 없는 에디터에서는 특히 그렇겠음