Zig, 컴파일러 성능 향상과 I/O 혁신!

by DD
2개월 전
조회수 6

Zig 컴파일러의 타입 분석 로직(Type Resolution Logic) 재설계를 통해 컴파일러 내부 구조를 개선하고, 린(Lazy) 타입 분석을 도입하여 컴파일 속도를 향상시킴

종속성 루프(Dependency Loop) 에러 메시지 개선 및 증분 컴파일(Incremental Compilation) 기능의 버그 수정 및 성능 향상

io_uring 및 Grand Central Dispatch 기반의 std.Io 구현체(Implementations)를 통해 I/O 성능 개선 시도, I/O 구현체 스왑(Swap) 가능성을 제시

패키지 관리 워크플로우 개선, 로컬 zig-pkg 디렉토리 사용 및 --fork 플래그를 통한 의존성 관리(Dependency Management) 기능 강화

Zig 컴파일러 타입 시스템의 재설계

Zig 컴파일러는 타입 분석(Type Analysis) 로직을 재설계하여 컴파일러 내부 구조를 개선했다. 특히, 초기화되지 않은 타입 필드에 대한 린(Lazy) 분석을 도입하여 컴파일 속도를 향상시켰다. 이로 인해, 네임스페이스(Namespace) 역할을 하는 타입의 경우 불필요한 코드 분석을 피할 수 있게 되었다. 또한, 종속성 루프(Dependency Loop) 발생 시, 보다 상세한 에러 메시지를 제공하여 디버깅을 용이하게 한다.

증분 컴파일(Incremental Compilation) 성능 개선

증분 컴파일 기능의 버그 수정 및 성능 향상이 이루어졌다. 특히, 불필요한 분석(Over-analysis) 문제를 해결하여 증분 컴파일 속도를 크게 개선했다. 이는 개발자가 코드 변경 시, 더 빠른 피드백을 받을 수 있도록 돕는다. 이러한 개선은 개발 경험을 향상시키는 데 기여하며, 대규모 프로젝트에서 빌드 시간(Build Time)을 단축하는 효과를 가져온다.

io_uring 및 GCD 기반 I/O 구현

io_uring 및 Grand Central Dispatch(GCD) 기반의 std.Io 구현체가 추가되어, Zig에서 다양한 I/O 모델을 사용할 수 있게 되었다. 이 구현체들은 사용자 공간 스택 스위칭(Userspace Stack Switching)을 활용하며, I/O 구현체의 스왑(Swap)을 통해 유연성을 제공한다. 하지만, 아직 성능 저하 문제 및 에러 처리, 테스트 커버리지 등 개선해야 할 부분이 남아있다.

패키지 관리 및 의존성 관리 개선

패키지 관리 워크플로우가 개선되어, 패키지가 프로젝트 루트의 zig-pkg 디렉토리에 저장된다. 이 디렉토리는 .gitignore에 추가하여 소스 제어에서 제외할 수 있으며, 오프라인 빌드 및 아카이브를 위한 자체 포함 소스 tarball 배포를 가능하게 한다. 또한, --fork 플래그를 통해 의존성 프로젝트를 오버라이드(Override)하여, 개발 환경에서 쉽게 테스트하고 수정할 수 있도록 지원한다.

Windows API 호출 최적화

Zig 표준 라이브러리는 Windows API 호출 시, kernel32.dll 대신 ntdll.dll의 네이티브 API를 선호하는 정책을 채택하고 있다. 이는 kernel32.dll의 래퍼(Wrapper)가 불필요한 힙 할당, 추가적인 오류 발생 가능성, CPU 사용량 증가 등의 문제를 야기하기 때문이다. 특히, 엔트로피(Entropy)를 얻기 위한 API 호출에서 bcryptprimitives.dll 및 advapi32.dll 의존성을 제거하고, NtReadFile 및 NtWriteFile 호출을 최적화하여 성능을 향상시켰다.

zig libc 프로젝트

zig libc 프로젝트를 통해, Zig 표준 라이브러리에서 libc 함수를 Zig 래퍼로 제공하여 중복 코드를 제거하고 있다. 이는 컴파일 속도 향상, 설치 크기 감소, 그리고 정적 링크된 libc를 사용하는 사용자 애플리케이션의 바이너리 크기 감소로 이어진다. 또한, 최근의 std.Io 변경 사항과 결합하여, 사용자가 libc의 I/O 동작을 제어할 수 있는 가능성을 열었다. 예를 들어, io_uring 이벤트 루프에 모든 read 및 write 호출을 참여시킬 수 있다.

Type resolution redesign, with language changes to taste