Zig는 2016년 Andrew Kelley가 만든 시스템 프로그래밍 언어로, C를 대체하기 위해 설계되었다. 메모리 안전성을 런타임이 아닌 컴파일 타임에 검증하고, 숨겨진 제어 흐름(예외, 암묵적 할당)을 제거해 투명하고 예측 가능한 코드를 추구한다.
C와의 차이점
| 항목 | C | Zig |
|---|
| 예외 처리 | 없음 (errno, setjmp) | 명시적 오류 값 |
| 암묵적 변환 | 있음 | 없음 |
| 미정의 동작 | 다수 존재 | 명시적 처리 |
| 빌드 시스템 | 외부 도구 | 내장 빌드 시스템 |
| C 상호운용 | - | 네이티브 지원 |
기본 문법
zig
const std = @import("std");
pub fn main() !void {
const stdout = std.io.getStdOut().writer();
try stdout.print("Hello, {s}!
", .{"World"});
}
// 오류 유니언 (명시적 오류 처리)
fn divide(a: i32, b: i32) !i32 {
if (b == 0) return error.DivisionByZero;
return @divTrunc(a, b);
}
// 컴파일 타임 실행 (comptime)
fn Vector(comptime T: type, comptime size: usize) type {
return struct {
data: [size]T,
pub fn sum(self: @This()) T {
var total: T = 0;
for (self.data) |v| total += v;
return total;
}
};
}
const IntVec3 = Vector(i32, 3);
const v = IntVec3{ .data = .{1, 2, 3} };
메모리 관리
zig
const allocator = std.heap.page_allocator;
// 명시적 할당/해제
const buf = try allocator.alloc(u8, 100);
defer allocator.free(buf); // defer로 자동 해제 보장
// 선택적 값 (null 안전)
var maybe: ?i32 = null;
maybe = 42;
if (maybe) |val| {
std.debug.print("값: {}
", .{val});
}
관련 개념