Zig로 4개월 써본 소감: snurl 라이브러리, Zig Day Seattle, 그리고 명시적 allocator·IO
- 저자는 몇 년 쉬었다가 Zig로 돌아와 4개월간 smallnet(Gemini·Gopher·Finger·Spartan)용 curl 대안 라이브러리 snurl을 만들었고, TigerStyle을 가능한 범위에서 따르려 했다
- 지난 글에서 감탄했던 내장 퍼저가 실제로는 미완성 기능이었다는 걸 나중에 알았음.
zig init이 생성하는 main.zig에 퍼저 예제가 들어 있어서 더 헷갈렸다는 지적 - 8월 20일 Zig Day Seattle이 벨류도서관에서 인원 초과로 보셀도서관으로 옮겨 열렸고, Zig 창시자 Andrew Kelley가 참석했음. 저자는 친구 Evin Yulo와 snurl의 TLS 백엔드 작업을 나눠 했다
- 버전 관리 도구 anyzig를 zig master와 0.16.0을 함께 쓰는 데 유용하게 썼지만,
build.zig.zon이 없는 디렉터리에서는 동작하지 않아 일회용 스크립트의 자동 포매팅이 깨진다고 함 - 함수마다 allocator와 IO를 명시적으로 넘기는 방식을 높게 평가했음. Odin의 암묵적 context나 Rust의 숨은 infallible 할당(실패 시 panic)보다 낫고, IO 도입에 따른 0.15.0에서 0.16.0 파괴적 변경도 감수할 가치가 있다는 입장
Hacker News opinions
사이트가 HN 터져서 DNS 조회부터 실패하네. 혹시 몰라서 archive.is 링크 남겨둠.
Rust에서 ? 쓰려면 Result<Type, Box> 식으로 해야 한다는 건 사실 아니야. E: From만 만족하면 어떤 에러든 ?로 올릴 수 있고, thiserror로 에러 타입 직접 정의하면 됨. 오히려 저자가 하려던 말을 그대로 증명하는 셈인데.
ReTangled가 tangled.org랑 무슨 관계인지 모르겠는데? 링크 타고 들어가보면 관련 없는 repo던데.
Zig가 조금만 더 안정되면 제대로 파보고 싶음. 메타프로그래밍이 제일 끌리더라.
allocator를 왜 다들 그렇게 좋아하는지 모르겠음. 나는 RAII 같은 편한 인터페이스가 낫고, 언어가 애초에 할당을 피하도록 밀어주면 좋겠음. arena는 HTTP 연결마다 새로 잡으면 그냥 메모리 누수가 되기 쉽고, 링커 같은 단발 프로그램에서는 mimalloc이 arena보다 빠다는 얘기도 있었음.
라이브러리 코드에서는 allocator 주입이 맞아. 호출자가 결정할 일이지 라이브러리가 몰래 malloc을 부를 권한은 없음. Zig는 암묵적 로직을 유난히 싫어하는 언어라 그렇고, 앱 코드에서는 굳이 안 돌려도 됨.
arena도 연결 하나당 하나 만들어서 연결 닫을 때 통째로 free하면 되잖아. HTTP 서버가 딱 좋은 예고, 연결 넘어서 살아야 하는 것만 gpa로 빼면 됨.
할당자 포인터를 돌려주는 건 전역 변수를 명시적으로 만드는 것과 비슷해. 진짜 문제는 자료구조 인스턴스마다 할당 전략을 묶어두고 싶을 때 나옴.
Zig가 C의 정신적 후계자라는 게 제일 흥미롭고, 기본값을 고르라면 TigerBeetle처럼 절대 안 커지는 고정 크기 arena가 낫지.