📘 第01课:Zig概述

📋 本课目录什么是Zig? 设计哲学 与C/Rust对比 安装Zig 第一个程序 构建系统 性能对比 练习

什么是Zig?

Zig是一门系统级编程语言,旨在成为C的更好替代品。它由Andrew Kelley于2016年创建,目标是提供比C更强的安全保障,同时保持C级别的控制力和性能。

Zig的核心定位:

设计哲学

Zig的设计哲学可以用几条原则概括:

  1. 交流重于编写——代码被阅读的次数远多于被编写的次数,显式优于隐式
  2. 显式优于隐式——每个行为都应该在代码中可见
  3. 编译期计算是一等公民——能在编译期做的事就不留到运行时
  4. 没有隐藏的控制流——读代码时不需要猜测背后发生了什么
  5. 小而完整的标准库——不追求大而全,但确保核心功能完整
💡 Zig的哲学核心是:程序员应该能精确控制生成的机器码,而不是靠运行时的"魔法"来保证安全。

与C/Rust对比

特性CRustZig
内存安全手动,易出bug编译期借用检查可选安全检查+显式管理
错误处理错误码/errnoResult<T,E>error union + try/catch
泛型宏/void*trait + 泛型comptime参数
构建系统Make/CMakecargo内置build.zig
交叉编译需工具链需target配置原生支持,开箱即用
C互操作原生需extern/unsafe@cImport直接导入
编译速度极快慢(增量改善中)快(Debug模式)
运行时开销极小
学习曲线陡峭平缓

C代码

// C: 手动管理,无安全检查
int* arr = malloc(10 * sizeof(int));
if (!arr) return -1;
arr[10] = 42;  // 越界,未定义行为
free(arr);
arr[0] = 1;  // use-after-free

Rust代码

// 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代码

// Zig: 可选安全检查+显式管理
const arr = try allocator.alloc(i32, 10);
defer allocator.free(arr);
arr[10] = 42;  // Debug: panic
                // ReleaseFast: UB

安装Zig

方式一:官方二进制

# 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
💡 关键观察:

构建系统

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   # 最小体积

性能对比

📊 Hello World 编译时间对比

语言编译时间二进制大小运行时间
C (gcc -O2)0.08s16KB0.002s
Rust (cargo)0.45s3.2MB0.003s
Zig (ReleaseFast)0.12s18KB0.002s

📊 斐波那契(40) 性能对比

语言时间(ms)内存
C (-O2)5300.6MB
Rust (--release)5400.6MB
Zig (ReleaseFast)5350.6MB
Go6801.2MB
Python215008.5MB
💡 Zig的ReleaseFast模式性能与C相当,因为都使用LLVM后端优化。Debug模式有安全检查但编译更快。

练习

📝 课后练习

  1. 环境搭建:安装Zig,运行hello world,尝试zig build
  2. 格式化输出:使用std.fmt打印你的名字、年龄和最喜欢的编程语言
  3. 构建系统:创建一个build.zig项目,包含可执行文件和测试
  4. 交叉编译:编译一个Windows版本的hello world,不需要Windows系统
  5. 性能验证:用Zig实现斐波那契,与C版本对比性能
⚠️ 挑战题:用comptime在编译期计算斐波那契数列的前10项,运行时直接打印结果。