Zig是一门系统级编程语言,旨在成为C的更好替代品。它由Andrew Kelley于2016年创建,目标是提供比C更强的安全保障,同时保持C级别的控制力和性能。
Zig的核心定位:
zig cc开箱即用Zig的设计哲学可以用几条原则概括:
| 特性 | C | Rust | Zig |
|---|---|---|---|
| 内存安全 | 手动,易出bug | 编译期借用检查 | 可选安全检查+显式管理 |
| 错误处理 | 错误码/errno | Result<T,E> | error union + try/catch |
| 泛型 | 宏/void* | trait + 泛型 | comptime参数 |
| 构建系统 | Make/CMake | cargo | 内置build.zig |
| 交叉编译 | 需工具链 | 需target配置 | 原生支持,开箱即用 |
| C互操作 | 原生 | 需extern/unsafe | @cImport直接导入 |
| 编译速度 | 极快 | 慢(增量改善中) | 快(Debug模式) |
| 运行时开销 | 零 | 极小 | 零 |
| 学习曲线 | 中 | 陡峭 | 平缓 |
// C: 手动管理,无安全检查
int* arr = malloc(10 * sizeof(int));
if (!arr) return -1;
arr[10] = 42; // 越界,未定义行为
free(arr);
arr[0] = 1; // use-after-free
// Rust: 编译期借用检查
let mut v: Vec<i32> = vec![0;10];
v[10] = 42; // panic at runtime
let r = &v[0];
v.push(1); // 编译错误!
println!("{}", r);
// Zig: 可选安全检查+显式管理
const arr = try allocator.alloc(i32, 10);
defer allocator.free(arr);
arr[10] = 42; // Debug: panic
// ReleaseFast: UB
# Linux/macOS
$ curl -L https://ziglang.org/download/0.13.0/zig-linux-x86_64-0.13.0.tar.xz | tar xJ
$ export PATH=$PWD/zig-linux-x86_64-0.13.0:$PATH
# 验证安装
$ zig version
0.13.0
# macOS
$ brew install zig
# Arch Linux
$ pacman -S zig
# Nix
$ nix-env -iA nixpkgs.zig
$ git clone https://github.com/ziglang/zig.git
$ cd zig && mkdir build && cd build
$ cmake .. -DCMAKE_BUILD_TYPE=Release
$ make -j$(nproc)
// hello.zig - 你的第一个Zig程序
const std = @import("std");
pub fn main() !void {
// stdout是标准输出的writer
const stdout = std.io.getStdOut().writer();
// try是错误处理语法糖:err catch |e| return e
try stdout.print("Hello, {s}!\n", .{"Zig"});
// 格式化打印各种类型
const version: u32 = 13;
try stdout.print("Zig 0.{d} 是系统编程的未来\n", .{version});
// 声明常量
const pi: f64 = 3.14159265358979;
try stdout.print("π ≈ {d:.5}\n", .{pi});
// 数组和切片
const langs = [_][:0]const u8{ "C", "Rust", "Zig" };
for (langs, 0..) |lang, i| {
try stdout.print(" [{d}] {s}\n", .{ i, lang });
}
}
$ zig run hello.zig
Hello, Zig!
Zig 0.13 是系统编程的未来
π ≈ 3.14159
[0] C
[1] Rust
[2] Zig
pub fn main() — 程序入口,! 表示可能返回错误@import("std") — 内置函数以@开头,导入标准库try — 自动传播错误,等价于 catch |e| return e[_][:0]const u8 — sentinel-terminated字符串数组Zig内置了构建系统,通过build.zig文件描述项目构建逻辑:
const std = @import("std");
pub fn build(b: *std.Build) void {
// 获取优化选项
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
// 创建可执行文件
const exe = b.addExecutable(.{
.name = "myapp",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
// 声明安装步骤
b.installArtifact(exe);
// 添加run命令
const run_cmd = b.addRunArtifact(exe);
run_cmd.step.dependOn(&b.getInstallStep());
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);
// 添加测试
const exe_unit_tests = b.addTest(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});
const run_unit_tests = b.addRunArtifact(exe_unit_tests);
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_unit_tests.step);
// 链接C库
// exe.linkSystemLibrary("c");
// exe.linkLibC();
}
# 构建
$ zig build
# 运行
$ zig build run
# 测试
$ zig build test
# 交叉编译
$ zig build -Dtarget=aarch64-linux-gnu
$ zig build -Dtarget=x86_64-windows-gnu
# 不同优化级别
$ zig build -Doptimize=Debug # 安全检查
$ zig build -Doptimize=ReleaseSafe # 优化+安全检查
$ zig build -Doptimize=ReleaseFast # 最大优化
$ zig build -Doptimize=ReleaseSmall # 最小体积
| 语言 | 编译时间 | 二进制大小 | 运行时间 |
|---|---|---|---|
| C (gcc -O2) | 0.08s | 16KB | 0.002s |
| Rust (cargo) | 0.45s | 3.2MB | 0.003s |
| Zig (ReleaseFast) | 0.12s | 18KB | 0.002s |
| 语言 | 时间(ms) | 内存 |
|---|---|---|
| C (-O2) | 530 | 0.6MB |
| Rust (--release) | 540 | 0.6MB |
| Zig (ReleaseFast) | 535 | 0.6MB |
| Go | 680 | 1.2MB |
| Python | 21500 | 8.5MB |
zig buildstd.fmt打印你的名字、年龄和最喜欢的编程语言comptime在编译期计算斐波那契数列的前10项,运行时直接打印结果。