GN⁺: Swift는 더 편리한 Rust입니다
(blog.namangoel.com)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
vsType::Variant
- 충분히 길거나 복잡한 코드에서는 타입 이름이 가까이 있지 않으면 불편할 것임
- IDE 같은 기능이 없는 에디터에서는 특히 그렇겠음
-