Zig, 링커와 빌드 시스템 혁신으로 개발 생산성 극대화!
Zig 0.16.0 릴리스에서 새로운 ELF 링커가 도입되어 초기 단계 지원을 시작함
점진적 컴파일(Incremental Compilation) 기능이 LLVM 백엔드 및 외부 라이브러리 연동 시에도 성능 저하 없이 지원됨
빌드 시스템 리팩토링으로 빌드 속도가 3배 이상 향상되었으며, 캐싱 메커니즘이 강화됨
Windows API 호출 시 커널32.dll 대신 ntdll.dll을 직접 사용하여 성능 및 안정성 개선
새로운 ELF 링커와 점진적 컴파일 성능
Zig 0.16.0에 도입된 새로운 ELF 링커는 초기에는 Zig 코드만 지원했으나, 최근 업데이트로 LLVM 및 LLD 라이브러리를 포함한 복잡한 빌드도 성능 저하 없이 지원하게 되었다. 특히 점진적 재빌드(Incremental Rebuilds) 시 외부 라이브러리 연동에도 추가적인 성능 오버헤드가 없다는 점이 주목할 만하다. 이는 개발 과정에서 수 밀리초(milliseconds) 단위의 빠른 피드백 루프를 가능하게 하여 개발 생산성을 크게 향상시킬 것으로 기대된다.
빌드 시스템 리팩토링과 성능 향상
Andrew Kelley가 주도한 빌드 시스템 리팩토링은 빌드 프로세스를 설정(configurer)과 실행(maker)으로 분리하고, 빌드 그래프를 직렬화하여 캐싱하는 방식으로 변경되었다. 이로 인해 빌드 속도가 최대 95%까지 향상되었으며, `zig build --help` 명령어 응답 시간도 150ms에서 14.3ms로 단축되었다. 또한, 빌드 스크립트 재컴파일 없이 인자를 변경하거나, 변경 사항이 없을 경우 빌드 로직 실행을 건너뛰는 등 최적화가 이루어졌다.
Windows API 호출 방식 개선
Zig 표준 라이브러리는 Windows API 호출 시 커널32.dll 대신 ntdll.dll을 직접 사용하도록 변경되었다. 이는 커널32.dll의 불필요한 힙 할당(Heap Allocations), 추가적인 실패 모드, CPU 사용량 증가 등의 단점을 회피하기 위함이다. 예를 들어, 난수 생성 시 bcryptprimitives.dll 의존성을 제거하고, `NtReadFile`과 `NtWriteFile`을 직접 호출하여 오버랩된 I/O(Overlapped I/O) 처리를 위한 추가 리소스 관리를 줄였다.
Zig libc 통합 및 의존성 관리 강화
Zig은 libc 함수들을 Zig 표준 라이브러리 래퍼로 통합하는 작업을 진행 중이며, 이를 통해 250개 이상의 C 소스 파일을 제거했다. 이 통합은 컴파일 속도 향상, 설치 크기 감소, 바이너리 크기 최적화에 기여한다. 또한, 패키지 의존성을 프로젝트 루트의 zig-pkg 디렉토리에 로컬로 저장하고, 전역 캐시를 압축하여 관리하는 방식으로 변경되었다. `--fork` 플래그를 통해 외부 의존성 포크(fork)를 쉽게 적용할 수 있게 되어 생태계 브레이크를 해결하는 데 도움을 준다.
io_uring 및 GCD 기반 I/O 구현
Zig 0.16.0 릴리스를 앞두고 io_uring 및 Grand Central Dispatch(GCD) 기반의 std.Io.Evented 구현이 추가되었다. 이는 사용자 공간 스택 스위칭(Userspace Stack Switching)을 활용하며, 실험적인 단계이지만 I/O 구현을 쉽게 교체할 수 있는 가능성을 보여준다. 컴파일러 자체는 이 기능을 잘 지원하지만, 이벤트 기반 I/O 사용 시 성능 저하에 대한 진단이 필요한 상황이다.