Zig
지그
안전하고 빠른 시스템 언어. C 대체 목표. 컴파일 타임 평가.
지그
안전하고 빠른 시스템 언어. C 대체 목표. 컴파일 타임 평가.
Zig는 안전성, 성능, 단순함을 동시에 추구하는 범용 시스템 프로그래밍 언어입니다. C와 동등한 저수준 제어력을 제공하면서도 현대적인 언어 설계 원칙을 적용하여, 정의되지 않은 동작(undefined behavior)을 최소화하고 디버깅을 용이하게 합니다. 가비지 컬렉터가 없으며, 컴파일 타임에 강력한 최적화와 코드 생성이 가능합니다.
Zig는 2016년 Andrew Kelley가 시작한 프로젝트입니다. Kelley는 이전에 LLVM 기반 컴파일러 작업을 하면서 C의 복잡성과 불안정성에 불만을 느꼈고, "C보다 더 나은 C"를 목표로 Zig를 설계했습니다. 기존 C 코드베이스와의 완벽한 호환성을 유지하면서도, C의 문제점들을 해결하는 것이 핵심 철학입니다.
Zig의 가장 독특한 특징은 comptime(컴파일 타임 실행)입니다. 별도의 매크로 시스템 없이 일반 Zig 코드를 컴파일 타임에 실행할 수 있어, 제네릭 프로그래밍과 메타프로그래밍이 매우 자연스럽습니다. 또한 C ABI와 완벽히 호환되어 기존 C 라이브러리를 수정 없이 사용할 수 있고, Zig 자체가 C 컴파일러로도 동작하여 기존 C 프로젝트에 점진적으로 도입할 수 있습니다.
실무에서 Zig는 고성능 시스템 소프트웨어 개발에 활용됩니다. 가장 유명한 사례는 Bun 런타임으로, Node.js보다 수십 배 빠른 JavaScript/TypeScript 런타임을 Zig로 구현했습니다. Uber의 빌드 시스템, Cloudflare의 네트워킹 도구 등 성능이 중요한 인프라에서 Zig 채택이 늘고 있습니다. 또한 임베디드 시스템, 게임 엔진, OS 개발 분야에서도 주목받고 있습니다.
// 1. Zig 기본 문법
const std = @import("std");
pub fn main() void {
// 변수 선언 (const: 불변, var: 가변)
const name: []const u8 = "Zig";
var count: u32 = 0;
count += 1;
// 배열과 슬라이스
const numbers = [_]i32{ 1, 2, 3, 4, 5 };
const slice = numbers[1..4]; // [2, 3, 4]
// 구조체
const Point = struct {
x: f32,
y: f32,
fn distance(self: Point, other: Point) f32 {
const dx = self.x - other.x;
const dy = self.y - other.y;
return @sqrt(dx * dx + dy * dy);
}
};
const p1 = Point{ .x = 0, .y = 0 };
const p2 = Point{ .x = 3, .y = 4 };
const dist = p1.distance(p2); // 5.0
// 열거형
const Color = enum { red, green, blue };
const myColor = Color.green;
// switch 표현식
const rgb = switch (myColor) {
.red => [_]u8{ 255, 0, 0 },
.green => [_]u8{ 0, 255, 0 },
.blue => [_]u8{ 0, 0, 255 },
};
// 출력
std.debug.print("{s} 언어, count: {}\n", .{ name, count });
}
"Zig와 Rust는 둘 다 C 대체를 목표로 하지만 접근 방식이 다릅니다. Rust는 소유권 시스템으로 컴파일 타임에 메모리 안전성을 강제하고, Zig는 단순함을 유지하면서 C와의 완벽한 호환성을 우선시합니다. 이미 C 라이브러리가 많은 프로젝트라면 Zig가 통합이 더 쉽고, 새 프로젝트에서 강력한 안전성 보장이 필요하다면 Rust가 좋습니다."
"이 고성능 네트워킹 모듈에 Zig 도입을 제안합니다. Bun이 Zig로 Node.js보다 수십 배 빠른 성능을 달성했듯이, 우리도 핫 패스 최적화에 활용할 수 있어요. 특히 comptime 기능으로 런타임 오버헤드 없이 제네릭 코드를 작성할 수 있고, 기존 C 라이브러리를 그대로 호출할 수 있어 점진적 도입이 가능합니다. 다만 0.x 버전이라 API 변경 가능성은 고려해야 합니다."
"Zig를 공부한 경험이 있습니다. 가장 인상적이었던 건 comptime입니다. 컴파일 타임에 코드를 실행해서 런타임 오버헤드 없이 제네릭 코드를 생성할 수 있어요. Rust의 매크로보다 직관적이면서도 강력합니다. 또한 C와의 ABI 호환성이 완벽해서 기존 C 라이브러리를 FFI 없이 바로 호출할 수 있다는 점이 레거시 시스템 통합에 유리합니다. Bun이 Zig로 작성되어 그 성능을 입증했고요."
"이 코드에서 catch unreachable을 쓰고 있는데, 프로덕션에서는 위험해요. unreachable은 절대 도달하지 않음을 컴파일러에 알려주는 건데, 실제로 에러가 발생하면 undefined behavior가 됩니다. 에러가 발생할 가능성이 있다면 catch |err| 로 명시적으로 처리하거나, try로 에러를 상위로 전파하세요. Zig는 에러 핸들링을 강제하는 게 철학이에요."
Zig는 아직 1.0 버전이 출시되지 않았습니다. 버전 업데이트마다 문법이나 표준 라이브러리 API가 변경될 수 있으므로, 프로덕션 도입 시 버전 고정과 마이그레이션 계획이 필요합니다. 공식 릴리즈 노트를 주의 깊게 확인하세요.
Zig 생태계는 Rust나 Go에 비해 아직 작습니다. 서드파티 라이브러리가 제한적이고, 패키지 매니저(zon)도 발전 중입니다. 다만 C 라이브러리를 직접 사용할 수 있으므로, libc나 기존 C 생태계를 활용하면 이 한계를 극복할 수 있습니다.
공식 문서와 Zig Learn 외에 한국어 학습 자료가 많지 않습니다. 영어 문서와 커뮤니티(Discord, Reddit)를 활용해야 하며, comptime이나 에러 핸들링 같은 Zig 특유의 개념은 직접 코드를 작성해보며 익히는 것이 효과적입니다.