Zig, 빌드 속도 향상과 I/O 개선으로 개발 효율 UP!

by DD
4일 전
조회수 4

빌드 시스템 재설계(Build System Rework)를 통해 빌드 속도와 유연성 향상, 캐싱(Caching) 메커니즘 도입

io_uring 및 GCD 기반의 I/O 구현(I/O Implementation)으로 비동기 I/O 지원 및 성능 개선

패키지 관리 워크플로우(Package Management Workflow) 개선, --fork 플래그(Flag)를 통한 의존성 관리 편의성 증대

윈도우 API(Windows API) 활용 개선, kernel32.dll 우회(Bypassing)를 통한 성능 및 안정성 확보

zig libc 프로젝트(Project)를 통해 C 표준 라이브러리(C Standard Library) 통합, 컴파일 속도 향상

빌드 시스템 재설계: 속도 및 유연성 향상

Zig의 빌드 시스템은 configurer와 maker 프로세스를 분리하여 빌드 속도를 개선했다. 특히, build.zig 로직 변경 시 configurer만 재컴파일하고, maker는 캐싱을 활용하여 재사용함으로써 빌드 시간을 단축했다. 또한, --watch, --fuzz, --webui와 같은 기능의 추가를 용이하게 만들었다. 캐싱 메커니즘(Caching Mechanism)을 통해 불필요한 빌드 단계를 건너뛰어 전체적인 개발 생산성을 향상시켰다.

I/O 구현: io_uring 및 GCD 지원

Zig는 io_uring과 Grand Central Dispatch(GCD)를 활용한 I/O 구현을 통해 비동기 I/O를 지원한다. 이는 사용자 공간 스택 스위칭(User-space Stack Switching)을 기반으로 하며, std.Io.Evented를 통해 사용할 수 있다. 비동기 I/O(Asynchronous I/O)를 통해 I/O 작업의 효율성을 높이고, 다양한 환경에서 Zig 애플리케이션의 성능을 최적화할 수 있는 기반을 마련했다. 하지만, 아직 성능 저하 문제와 테스트 커버리지 부족 등의 과제가 남아있다.

패키지 관리 개선: --fork 플래그

Zig는 프로젝트 내 zig-pkg 디렉토리에 패키지를 저장하고, 전역 캐시를 압축된 형태로 관리하여 패키지 관리 효율성을 높였다. 또한, --fork 플래그를 도입하여 의존성 프로젝트를 쉽게 오버라이드(Override)할 수 있도록 했다. 이 기능은 의존성 문제(Dependency Issues) 발생 시, 개발자가 직접 수정하고 테스트할 수 있는 환경을 제공하여 개발 워크플로우를 개선한다. 패키지 관리 시스템(Package Management System)의 유연성을 높여 개발 편의성을 증대시켰다.

윈도우 API 활용 개선: kernel32.dll 우회

Zig는 윈도우 API 호출 시 kernel32.dll 대신 ntdll.dll의 네이티브 API를 직접 호출하는 방식을 선호한다. 이는 kernel32.dll의 불필요한 힙 할당, 추가적인 오류 발생 가능성, CPU 사용량 증가를 피하기 위함이다. 특히, 랜덤 바이트 생성(Random Byte Generation)과 파일 I/O 작업에서 성능 향상을 이루었다. 네이티브 API 활용(Native API Utilization)을 통해 윈도우 환경에서의 성능과 안정성을 개선했다.

zig libc 프로젝트: C 표준 라이브러리 통합

Zig는 zig libc 프로젝트를 통해 C 표준 라이브러리 함수를 Zig 표준 라이브러리 래퍼로 제공하여 코드 중복을 줄이고 컴파일 속도를 향상시켰다. 약 250개의 C 소스 파일을 제거하고, LTO(Link-Time Optimization)와 유사한 방식으로 코드를 최적화한다. 또한, std.Io 변경 사항과 결합하여, 사용자가 libc의 I/O 동작을 제어할 수 있는 가능성을 열었다. C 표준 라이브러리 통합(C Standard Library Integration)을 통해 Zig의 독립성을 강화하고, 컴파일 속도 및 바이너리 크기를 개선했다.

Zig: Build System Reworked