Zig을 네트워크 프로그래밍에 가장 좋아하는 언어로 만든 과정

5 days ago 5

  • 저자는 Zig 언어를 학습하며 AcoustID 인덱스 재작성 프로젝트를 진행하다가, 네트워크 프로그래밍의 한계를 계기로 새로운 접근을 시도함
  • 기존 C++과 Go에서 사용하던 비동기 I/O와 동시성 모델을 Zig에서도 구현하기 위해 자체 라이브러리 개발을 결심함
  • 그 결과, Go 스타일의 동시성 모델을 Zig에 맞게 구현한 Zio 라이브러리를 제작하여, 콜백 없이 동기식처럼 보이는 비동기 코드를 작성 가능하게 함
  • Zio는 비동기 네트워크·파일 I/O, 채널, 동기화 원시, 신호 감시 등을 지원하며, 단일 스레드 모드에서 Go나 Rust의 Tokio보다 빠른 성능을 보임
  • 이 프로젝트는 Zig의 시스템 수준 성능과 현대적 동시성 모델의 결합 가능성을 보여주며, Zig 생태계 확장의 중요한 전환점으로 평가됨

Zig 언어와 초기 동기

  • 저자는 원래 오디오 소프트웨어용 저수준 언어로 설계된 Zig를 관찰해 왔으나, 실질적 필요성을 느끼지 못했음
    • Zig 창시자 Andrew Kelley가 저자의 Chromaprint 알고리듬을 Zig로 재구현한 사례를 보고 관심을 갖게 됨
  • AcoustID의 역인덱스 재작성 프로젝트를 Zig 학습 기회로 삼아 진행, 결과적으로 C++ 버전보다 더 빠르고 확장성 높은 구현을 달성함
  • 그러나 서버 인터페이스 추가 단계에서 비동기 네트워킹 지원 부족 문제에 직면함

기존 접근 방식과 한계

  • 이전 C++ 버전에서는 Qt 프레임워크를 사용해 비동기 I/O를 처리, 콜백 기반이지만 풍부한 지원 덕분에 사용 가능했음
  • 이후 프로토타입에서는 Go 언어의 네트워킹과 동시성 편의성을 활용했으나, Zig에서는 유사한 수준의 추상화가 부재함
  • Zig로 TCP 서버와 클러스터 계층을 구현하려면 스레드 다수를 생성해야 하는 비효율이 발생
    • 이를 해결하기 위해 NATS 메시징 시스템용 Zig 클라이언트(nats.zig) 를 직접 작성하며 Zig의 네트워킹 기능을 심층적으로 탐구함

Zio 라이브러리의 등장

  • 이러한 경험을 바탕으로 Zio: Zig용 비동기 I/O 및 동시성 라이브러리를 공개함
  • Zio는 콜백 없는 비동기 코드 작성을 목표로 하며, 내부적으로는 비동기 I/O가 동작하지만 외부에서는 동기식처럼 보이는 구조를 가짐
  • Go 스타일의 동시성 모델을 Zig에 맞게 제한적으로 구현
    • Zio의 태스크는 고정 크기 스택을 가진 스택풀 코루틴 형태
    • stream.read() 호출 시 I/O 작업이 백그라운드에서 수행되고, 완료 시 태스크가 재개되어 결과 반환
  • 이 방식은 상태 관리 단순화코드 가독성 향상을 동시에 제공

기능 구성과 런타임 구조

  • Zio는 완전한 비동기 네트워크 및 파일 I/O, 동기화 원시(mutex, 조건 변수 등) , Go 스타일 채널, OS 신호 감시 등을 지원
  • 태스크는 단일 스레드 또는 다중 스레드 모드에서 실행 가능
    • 다중 스레드 모드에서는 태스크가 스레드 간 이동 가능, 지연 시간 감소와 부하 균형 향상 효과
  • 표준 Reader/Writer 인터페이스를 구현해, 외부 라이브러리와의 호환성 확보

성능 및 비교

  • 저자는 아직 공식 벤치마크를 공개하지 않았으나, 단일 스레드 모드에서 Go와 Rust의 Tokio보다 빠른 성능을 확인했다고 언급
  • 컨텍스트 스위칭 비용이 함수 호출 수준으로 낮음, 사실상 무료에 가까운 전환 속도 제공
  • 다중 스레드 모드는 아직 Go/Tokio만큼 견고하지 않지만, 비슷하거나 약간 더 빠른 성능을 보임
    • 향후 공정성(fairness) 기능 추가 시 성능이 일부 감소할 가능성 있음

예시 코드와 활용

  • 문서에는 Zio 기반 HTTP 서버 예시 코드가 포함되어 있음
    • zio.net.Stream을 이용해 연결을 수락하고, 각 연결을 별도 태스크로 처리
    • zio.Runtime이 태스크 실행과 I/O 스케줄링을 관리
  • 이 구조는 비동기 I/O를 동기식 코드처럼 작성할 수 있게 하며, 명확한 흐름 제어와 자원 해제 관리를 가능하게 함

향후 계획과 의의

  • 저자는 Zio를 통해 Zig가 단순한 고성능 시스템 코드용 언어를 넘어, 완전한 네트워크 애플리케이션 개발 언어로 발전할 수 있음을 확인
  • 다음 단계로 NATS 클라이언트를 Zio 기반으로 재작성하고, Zio 기반 HTTP 클라이언트/서버 라이브러리 개발을 계획 중
  • 이 프로젝트는 Zig 생태계의 네트워킹·동시성 인프라 확장을 주도하며, Go나 Rust에 비견되는 현대적 런타임 모델 구축 시도로 평가됨

Read Entire Article