Zig Libc

5 days ago 4

  • 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”로 마무리됨 (추가 설명 없음)

Read Entire Article