Zig, @bitCast 의미론 변경 및 LLVM 백엔드 최적화

by DD
9시간 전
조회수 0

@bitCast 의미론 재정의로 LLVM 백엔드 정수 타입 처리 방식이 개선됨

LLVM 백엔드 성능 향상으로 Zig 컴파일러 자체 성능 약 5% 개선 확인

새로운 ELF 링커는 빠른 증분 컴파일 지원 및 LLVM/LLD 라이브러리 빌드 가능

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

새로운 @bitCast 의미론과 엔디안 독립성

기존 @bitCast는 메모리 재해석에 기반하여 타겟 엔디안(Endian)에 따라 동작이 달라지는 문제가 있었습니다. 새로운 의미론은 논리적 비트 표현(Logical Bit Representation)에 기반하여 엔디안 독립적인 동작을 보장합니다. 이는 리틀 엔디안(Little-Endian) 타겟에서의 기존 동작과 유사하며, 빅 엔디안(Big-Endian) 타겟에서 발생하던 예측 불가능한 동작을 제거합니다. 개발자들은 이제 엔디안 종속적인 코드를 작성할 필요 없이 일관된 동작을 기대할 수 있습니다.

LLVM 백엔드 정수 타입 처리 최적화

임의 비트폭 정수 타입(Arbitrary Bit-Width Integer Types)을 LLVM IR의 비트 인트(Bit-Int) 타입으로 직접 변환하는 방식은 최적화에 비효율적이었습니다. 새로운 방식은 SSA(Static Single Assignment) 폼에서만 비트 인트 타입을 사용하고, 메모리 저장 시에는 ABI 크기 타입으로 확장(Extend)합니다. 이는 Clang의 C 비트 인트(BitInt) 처리 방식과 유사하며, LLVM 옵티마이저의 지원을 강화하고 컴파일 오류를 줄이는 데 기여합니다.

새로운 ELF 링커의 증분 컴파일 및 호환성

Zig 0.16.0에 도입된 새로운 ELF 링커는 빠른 증분 컴파일(Fast Incremental Compilation)을 지원하며, 외부 라이브러리 및 C 소스 링크 시에도 추가 오버헤드가 없습니다. x86_64 Linux 환경에서 셀프 호스팅 Zig 컴파일러 빌드가 가능해졌으며, 이는 링커의 기능적 성숙도를 보여줍니다. 아직 DWARF 디버그 정보 생성은 지원하지 않지만, 수 밀리초(Milliseconds) 단위의 빠른 재빌드 경험을 제공합니다.

빌드 시스템 리팩토링과 성능 향상

빌드 시스템이 'Configurer'와 'Maker' 프로세스로 분리되면서 zig build 성능이 극적으로 향상되었습니다. 사용자의 `build.zig` 로직만 변경 시 재컴파일되며, 빌드 그래프는 직렬화되어 캐싱됩니다. 또한, 빌드 실행 프로세스가 최적화 모드로 컴파일되어 전체 빌드 시간이 단축되었습니다. 이는 `--watch` 및 `--fuzz`와 같은 기능의 효율성을 높이고, ZLS와 같은 외부 도구와의 통합에도 이점을 제공합니다.

Windows 네이티브 API 활용 및 표준 라이브러리 개선

Zig 표준 라이브러리는 `kernel32.dll` 대신 `ntdll.dll`의 네이티브 API를 우선적으로 사용하도록 개선되었습니다. 예를 들어, 난수 생성 시 `bcryptprimitives.dll` 의존성 제거`ReadFile`/`WriteFile` 함수 호출 시 `OVERLAPPED` 구조체 대신 APC 루틴 사용으로 불필요한 오버헤드와 잠재적 오류를 줄였습니다. 이는 더욱 견고하고 효율적인 Windows 시스템 프로그래밍을 가능하게 합니다.

New @bitCast Semantics and LLVM Backend Improvements