개발자 미할리스 추칼로스가 지난 11월 자신의 블로그에 Zig 언어와 C 언어의 시스템 프로그래밍 특성을 비교하는 글을 게시했습니다. 그는 Rust와의 비교 이후 자연스럽게 떠오른 질문인 C 언어와의 차별점에 초점을 맞췄습니다. 두 언어 모두 가비지 컬렉터가 없고 기계어에 가까운 동작을 지향하지만, 실제 코드를 작성할 때 발생하는 시간 낭비 요인이 다르다는 점을 강조했습니다.

추칼로스는 특히 여러 자원을 할당한 후 중간에 실패했을 때 역순으로 해제해야 하는 상황을 주요 문제로 지적했습니다. C 언어에서는 일반적으로 goto 문과 레이블을 사용해 이 작업을 수행합니다. 하지만 정리 코드가 할당 위치에서 멀리 떨어져 있고, 레이블 순서를 수동으로 맞춰야 하는 번거로움이 존재합니다.

반면 Zig은 각 할당 바로 아래에 errdefer를 배치하여 함수가 에러를 반환할 때 자동으로 역순 실행되도록 설계되었습니다.

그는 Mac 환경에서 Zig 0.17 버전과 clang 컴파일러를 사용하여 모든 예제 코드를 테스트했다고 밝혔습니다. C 언어가 유닉스 커널과 시스템 라이브러리의 기반이며 안정성이 뛰어나지만, 새로운 코드를 작성할 때는 Zig의 기능이 더 효율적이라고 설명했습니다. 특히 배열 접근 시 길이 정보를 포함하는 슬라이스 타입과 무시할 수 없는 에러 반환값 처리가 눈에 띄는 차이점으로 꼽혔습니다.

해커뉴스에는 해당 글에 대한 토론이 활발히 진행되었습니다. 일부 사용자는 현대적인 C 도구들을 활용하면 Zig의 장점 상당수를 C에서도 구현할 수 있다고 반박했습니다. 예를 들어 서명된 정수 오버플로우 체크는 샌티타이저로, 무시할 수 없는 에러는 nodiscard 속성으로 대체 가능하다는 의견이 제시되었습니다.

또한 C++를 커스터마이징하여 시스템 프로그래밍에 사용하는 대안도 언급되었습니다.

추칼로스는 Zig이 여전히 빠른 모드나 작은 모드에서 정의되지 않은 동작을 가질 수 있으며, 툴링과 안정성 면에서 C보다 부족함을 인정했습니다. 그럼에도 불구하고 디버그 모드에서의 경계선 검사나 명시적인 연산자 사용 같은 안전장치가 개발자의 실수를 줄여준다고 평가했습니다. 이번 비교는 특정 언어의 우월성을 주장하기보다, 기존 C 코드의 마찰점을 해결하기 위한 Zig의 구체적인 메커니즘을 보여주는 데 의미가 있습니다.