Zig 빌드 시스템, 속도와 효율을 잡다!
Zig 빌드 시스템이 속도 향상을 위해 대대적으로 개편되었으며, 빌드 그래프(Build Graph)를 활용하여 빌드 과정을 최적화함
패키지 관리 워크플로우(Package Management Workflow) 개선을 통해 오프라인 빌드 지원 및 의존성 관리(Dependency Management)가 용이해짐
윈도우 API(Windows API) 호출 시 커널32.dll 우회를 통해 성능 및 안정성을 개선하고, Zig 표준 라이브러리(Standard Library)의 C 코드 의존성을 줄임
커뮤니티에서는 빌드 시스템 개편으로 인한 기존 프로젝트 호환성 문제와 빌드 시스템 통합의 어려움을 지적함
Zig 빌드 시스템의 성능 개선
Zig 빌드 시스템은 configurer와 maker 프로세스 분리를 통해 빌드 속도를 향상시켰다. 특히, build.zig 로직 변경 시 configurer만 재컴파일하고, maker는 릴리즈 모드로 최적화하여 실행한다. 벤치마크 결과, --help 옵션 실행 시 90% 이상의 시간 단축을 보였다. 또한, 캐싱(Caching)을 통해 불필요한 build.zig 로직 실행을 방지하여 빌드 시간을 더욱 단축했다.
패키지 관리 워크플로우 개선
Zig 프로젝트의 의존성 패키지는 프로젝트 루트의 zig-pkg 디렉토리에 저장되며, .gitignore에 추가하여 관리한다. 이를 통해 오프라인 빌드 및 소스 코드 배포가 용이해진다. 또한, --fork 플래그를 사용하여 특정 패키지를 오버라이드(Override)하여, 의존성 문제 해결 및 패치 적용을 간편하게 할 수 있다. 향후에는 P2P 기술을 활용한 패키지 공유도 계획하고 있다.
윈도우 API 호출 최적화
Zig 표준 라이브러리는 윈도우 API 호출 시 kernel32.dll 대신 ntdll.dll의 네이티브 API를 선호한다. 이는 kernel32.dll의 불필요한 힙 할당(Heap Allocation), 추가적인 오류 발생 가능성(Additional Failure Modes), 그리고 성능 저하(Performance Degradation)를 방지하기 위함이다. 특히, 랜덤 바이트 생성 및 파일 I/O 작업에서 이러한 최적화가 이루어졌다. NtReadFile 및 NtWriteFile 사용을 통해 비동기 파일 I/O의 효율성을 높였다.
Zig libc 프로젝트의 진행 상황
Zig libc 프로젝트는 Zig 표준 라이브러리 내에서 C 표준 라이브러리 함수를 Zig 래퍼로 대체하는 작업을 진행 중이다. 현재까지 약 250개의 C 소스 파일이 제거되었으며, 이를 통해 Zig의 컴파일 속도 향상, 설치 크기 감소, 그리고 C 언어 의존성 감소를 기대할 수 있다. 또한, Zig 컴파일 유닛(Compilation Unit)을 공유하여 LTO(Link-Time Optimization)와 유사한 효과를 얻을 수 있다.
커뮤니티의 반응 및 문제점
커뮤니티에서는 빌드 시스템 개편으로 인해 기존 프로젝트와의 호환성 문제가 발생할 수 있다는 우려를 표명했다. 특히, pico-zdk 프로젝트와 같이 빌드 시스템에 깊이 의존하는 경우, 새로운 maker 코드에서 필요한 정보를 얻기 어려워 빌드 시스템 통합의 어려움을 겪을 수 있다는 지적이 있었다. 또한, Bazel과 같은 다른 빌드 시스템에 비해 Zig의 빌드 시스템이 원시적(Primitive)이라는 의견도 제기되었다.