Zig, 백엔드 및 빌드 시스템 혁신으로 개발 경험 향상

by DD
15시간 전
조회수 0

SPIR-V 백엔드의 기능 확장 및 안정성 개선으로 셰이더 개발 지원 강화

LLVM 백엔드의 정수 타입 처리 및 @bitCast 내장 함수 의미론 개선

ELF 링커의 점진적 컴파일 지원 및 외부 라이브러리 연동 기능 향상

빌드 시스템 리팩토링으로 컴파일 속도 향상 및 캐싱 메커니즘 도입

io_uring 및 GCD 기반의 비동기 I/O 구현으로 시스템 프로그래밍 역량 강화

SPIR-V 백엔드: 타입 시스템 확장 및 실행 모드 통합

SPIR-V 백엔드는 Zig의 타입 시스템으로 표현하기 어려운 타입들을 위해 @SpirvType 내장 함수를 도입했습니다. 이를 통해 셰이더 작성의 주요 장애물이었던 타입 표현 문제를 해결했습니다. 또한, 실행 모드 정보(workgroup size 등)를 인라인 어셈블리 대신 호출 규약(Calling Convention)으로 전달하도록 변경하여, `spirv_task` 및 `spirv_mesh`와 같은 새로운 호출 규약이 추가되었습니다. 이는 GPU 컴퓨팅 및 메쉬 셰이딩 파이프라인 개발을 위한 기반을 마련합니다.

LLVM 백엔드: 정수 타입 처리 및 @bitCast 의미론 재정의

LLVM 백엔드에서 임의의 비트 너비 정수 타입(u4, i13 등)을 ABI 크기 타입으로 변환하는 방식이 개선되었습니다. 기존에는 LLVM IR의 bit-int 타입을 직접 사용했으나, 이는 최적화에 비효율적이고 테스트되지 않은 코드 경로를 포함했습니다. 새로운 방식은 SSA 형태에서는 bit-int를 사용하고 메모리 저장 시 ABI 크기 타입으로 확장/부호 채우기(extend/sign-extend)를 수행합니다. 또한, @bitCast 내장 함수의 의미론이 재정의되어, 바이트 재해석 방식에서 논리적 비트 레이아웃 재해석으로 변경되었습니다. 이는 특히 배열 및 벡터 타입 처리 시 엔디안(endianness)에 독립적인 일관된 동작을 보장합니다.

ELF 링커: 점진적 컴파일 및 외부 라이브러리 지원 강화

새로운 ELF 링커는 점진적 컴파일(Incremental Compilation)을 지원하며, 외부 라이브러리 및 C 소스 코드 링크 시에도 추가적인 성능 오버헤드 없이 빠른 재빌드를 가능하게 합니다. x86_64 Linux 환경에서 Zig 컴파일러 자체를 LLVM 및 LLD 라이브러리와 함께 빌드하는 것이 가능해졌습니다. 현재 DWARF 디버그 정보 생성은 지원하지 않지만, 밀리초 단위의 빠른 재빌드는 개발 생산성을 크게 향상시킬 것으로 기대됩니다. `.spv` 파일도 오브젝트 파일로 인식하여 여러 소스를 단일 모듈로 링크할 수 있습니다.

빌드 시스템 리팩토링: 성능 향상 및 캐싱 메커니즘 도입

Zig의 빌드 시스템이 리팩토링되어 빌드 속도가 크게 향상되었습니다. 이전에는 `build.zig` 파일과 빌드 시스템 구현이 하나의 프로세스로 컴파일되었으나, 이제는 `build.zig` 로직을 컴파일하는 'configurer'와 빌드 그래프를 실행하는 'maker' 프로세스로 분리되었습니다. 'configurer'는 디버그 모드로 컴파일되고, 그 결과는 직렬화되어 캐시됩니다. 'maker'는 릴리스 모드로 컴파일되어 빌드 그래프를 실행합니다. 이 변경으로 인해 빌드 스크립트 재컴파일이 불필요해지고, 빌드 그래프 실행 프로세스의 최적화가 가능해져 `zig build --help` 명령어 실행 시간이 90% 이상 단축되었습니다.

비동기 I/O: io_uring 및 GCD 구현으로 유연성 확보

Zig 표준 라이브러리에 io_uring(Linux) 및 Grand Central Dispatch(macOS/iOS) 기반의 비동기 I/O 구현이 추가되었습니다. 이는 스택 스위칭(stack switching) 기술을 활용하며, `std.Io.Evented`를 통해 다양한 I/O 구현을 애플리케이션에서 쉽게 교체할 수 있게 합니다. 아직 실험적인 단계이며 오류 처리, 성능 최적화 등 후속 작업이 필요하지만, I/O 구현의 유연성을 크게 높여 시스템 프로그래밍의 가능성을 확장합니다.

패키지 관리: 로컬 및 전역 캐싱, 포크 오버라이드 기능 강화

Zig 패키지 관리 워크플로우가 개선되어, 패키지가 프로젝트 루트의 `zig-pkg` 디렉토리에 로컬로 저장됩니다. 이는 프로젝트별 종속성 관리를 용이하게 하며, 오프라인 빌드 및 아카이빙을 가능하게 합니다. 또한, 전역 캐시에는 압축된 형태로 저장되어 디스크 공간을 절약합니다. 추가로 `--fork` 플래그를 통해 외부 소스 체크아웃을 종속성으로 임시 오버라이드할 수 있게 되어, 생태계 브레이크 시 디버깅 및 패치 적용 워크플로우가 간소화되었습니다.

SPIR-V Backend Progress