업무에서의 Zig vs. Rust : 우리의 선택은 Zig
(ludwigabap.bearblog.dev)- 수억 명의 사용자를 대상으로 서비스를 제공하는 회사(비공개)로, 핵심 시스템에 C와 C++ 사용 중
- 2023년 한해 동안 Rust와 Zig 중 어떤 언어를 채택할지에 대한 논의 진행
- 주요 고려 사항:
- C 언어와의 상호 운용성
- 엔지니어 확장성 (채용, 유지보수 등)
- 최종 선택: Zig
- 이 선택 과정은 대규모 회사에서 "코드가 다양한 대상에서 실행되고 수억 명의 사용자에게 영향을 미칠 때 고려하는 요소"들을 잘 보여준다고 생각해서 공유함
C 상호 운용성의 중요성
- 재작성하려는 라이브러리는 모든 플랫폼(웹, 모바일, VR 헤드셋, 게임 콘솔, 데스크톱 등)에서 사용될 가능성이 있음
- 따라서 C API 제공과 FFI를 통한 사용이 모든 플랫폼에서의 실행을 보장하는 유일한 방법
주요 토론 이슈
Rust
- 당시 Zig보다 25배 이상 인기 있음 (설문 조사 및 서브레딧 기준)
- 더 오랜 기간 안정적인 상태 유지
- Rust Foundation의 산업계 후원이 안정적으로 보임
- 우수한 LSP와 개발자 경험
- Cargo: 업계 최고 수준의 패키지 관리자
- 메모리 안전성과 "정의되지 않은 동작 없음" (완전히 사실은 아니지만 논의 중 언급됨)
- C++에서 벗어나려면 메모리 오류와 정의되지 않은 동작 가능성이 없는 Rust가 더 적합
-
nightly
버전에서 SIMD 지원 - WASM 지원이 Zig만큼 원활
- 성능면에서 Zig와 대등하거나 일부 경우 "상당히 빠름"
Rust의 C 상호 운용성:
- Rust는 자체 생태계가 풍부하여 C 상호 운용성의 중요성이 상대적으로 낮음
- Python 바인딩 등 고수준 언어와의 연동 가능성 우수
- Rust 사용의 이점이 C 바인딩 제공의 단점을 상쇄한다는 주장
Zig
- C/C++ 또는 TypeScript 배경 개발자가 쉽게 학습 가능
- C 배경 개발자에게 즐거운 코딩 경험 제공
- Zig 컴파일러가 C와 C++ 컴파일도 가능하여 의존성 관리와 C ABI 라이브러리 구축에 유리
- 다양한 대상 플랫폼 지원이 매우 용이 (
zig targets
명령어 호평) - 빠른 소프트웨어 작성이 쉬움 (네이티브
Vector
지원, SIMD 활용 등) - 기존 디버거와 호환
- 우수한 빌드 시스템 (기존 Makefile보다 100배 개선)
- Zig Software Foundation의 높은 재정 투명성
- 기존 C++ 코드의 점진적 포팅 및 "Zig화" 가능
- 모든 대상 플랫폼에 대한 링킹/컴파일 문제 해결 확실
결론
- Zig가 기존 코드베이스 포팅 및 모든 플랫폼 호환성 보장에 필요한 시간과 노력을 크게 감소시킴
- 예상 외 결정 요인들:
- 학습 용이성과 채용이 예상보다 큰 영향을 미침 (Zig에 유리)
- 툴체인 관련 개발자 경험이 중요한 역할
- Zig 컴파일러와 빌드 시스템이 기존 코드베이스와의 호환성으로 인해 크게 도움됨
- Rust의 생태계, 커뮤니티, 메모리 안전성 보장은 예상보다 영향력이 적음
고려사항과 토론 이슈, 결론 등을 읽어보니 애초에 Rust가 필요한 환경이 아니었던 것 같네요. 음식 배달하는데 오프로더 몰고 다니는 배달원 본 적 있나요?
네이티브 언어로 개발을 해야하긴 하지만 memory-critical한 작업이 아닌거면 개발하기 편한 쪽을 고르는게 맞죠. 이걸 뭐 한 해 동안 토론할 것 까지야...
일년에 한번씩은 zig를 둘러보곤 하는데, 거의 매년 breaking change가 있었던 것 같습니다;;
게다가 언어 자체적으로는 큐나 쓰레드간 메시지 전달 라이브러리가 준비되어 있지 않아서, 러스트의 성숙도에 비하면 아직은 갈길이 먼것 같습니다.
물론 사용자가 OS API들에 빠삭하면 큰 문제가 아닐 수 있겠습니다만…
C 배경 개발자에게 즐거운 코딩 경험 제공
빠른 소프트웨어 작성이 쉬움 (네이티브 Vector 지원, SIMD 활용 등)
파이썬을 처음 배울 때의 느낌이네요