- Zig 언어는 libc 기능을 Zig 표준 라이브러리로 직접 구현하는 방향으로 전환 중이며, 기존 C 소스 코드를 점진적으로 제거 중임
- 현재까지 약 250개의 C 소스 파일이 삭제되었고, 2032개가 남아 있음
- 이 전환으로 컴파일 속도 향상, 설치 크기 감소, 정적 링크 시 바이너리 크기 축소 등의 효과가 발생
- 최근 개선으로 zig libc가 별도 정적 아카이브가 아닌 Zig 컴파일 유닛(ZCU) 내에서 다른 코드와 함께 최적화되어 중복 코드 제거 및 LTO 수준의 최적화 가능
- Zig이 자체 정적 libc 제공자로 전환함에 따라, 관련 문제 발생 시 Zig 프로젝트에 직접 버그 리포트 제출이 필요함
Zig libc 프로젝트 개요
- 여러 기여자들이 zig libc 서브프로젝트에 참여해, 기존 C 기반 libc 구현을 Zig 표준 라이브러리 래퍼로 대체 중
- 목표는 중복된 C 코드를 제거하고, memcpy, atan2 등 단순 매핑 함수나 strnlen처럼 일반 함수 래핑 형태로 제공
- 예시로 strnlen 함수는 Zig의 std.mem.findScalar를 사용해 구현됨
- 현재까지 약 250개의 C 소스 파일이 삭제, 2032개가 남아 있음
성능 및 구조적 개선
- 각 함수가 Zig로 전환될수록 외부 프로젝트 및 C 언어 의존성 감소
-
컴파일 속도 향상, 설치 크기 단순화 및 축소, 정적 링크된 사용자 애플리케이션의 바이너리 크기 감소 효과 발생
- 최근 변경으로 zig libc가 Zig Compilation Unit(ZCU) 내에서 다른 Zig 코드와 함께 컴파일됨
- 별도의 정적 아카이브로 링크하지 않고, 컴파일러와 링커의 통합 구조를 활용
- 이로 인해 중복 코드 제거 및 함수 간 최적화 가능
- 이는 링크 타임 최적화(LTO) 와 유사하지만, 링커 단계가 아닌 프런트엔드 단계에서 수행됨
향후 확장 가능성
- 최근의 std.Io 변경사항과 결합될 경우, libc의 I/O 동작을 사용자가 제어할 가능성 존재
- 예: read, write 호출을 io_uring 이벤트 루프에 통합
-
리소스 누수 탐지 기능을 서드파티 C 코드에도 적용 가능
- 다만 현재는 실험되지 않은 아이디어 단계임
테스트 및 품질 보증
-
Szabolcs Nagy의 libc-test 프로젝트가 수학 함수 회귀 방지에 큰 도움을 제공
- 이 테스트 세트로 Zig libc의 정확성을 검증
사용자 안내
- Zig이 musl, mingw-w64, wasi-libc 기능을 자체 제공하는 단계로 전환 중
- 관련 문제 발생 시 Zig 프로젝트에 직접 버그 리포트 제출 필요
- 이는 기존 독립 libc 프로젝트 유지보수자에게 잘못된 이슈가 전달되는 것을 방지하기 위함
마무리
- 글의 마지막 문장은 “Abolish ICE”로 마무리됨 (추가 설명 없음)