Zig 语言:从入门到放弃
一直想用 Zig 来写一点什么。正好看到一个 Zig 的 GUI 项目 Capy,想着用它来试试手。
首先,用 scoop install zig
命令安装了 Zig,版本是 0.14.0(后续会提到)。然后,按照 Capy 的官方文档下载了项目模板,使用 zig build
命令编译。接下来,就遇到第一个扑面而来的问题:
error: unable to discover remote git server capabilities: ConnectionTimedOut
可以确信的是,命令执行环境中已经正确地配置了代理,包括 Git 全局配置、环境变量和系统代理。Zig 没能正确使用代理设置。最后只能使用虚拟网卡实现代理。
解决了网络问题,接着就遇到各种兼容性错误。比如:
build.zig.zon:2:13: error: expected enum literal
.name = "capy-template",
^~~~~~~~~~~~~~~
以及
build.zig.zon:1:2: error: missing top-level 'fingerprint' field; suggested value: 0xa46d6299a1ade711
应该是 Zig 版本升级后,不在兼容旧的 build.zig.zon 格式。修复了这些错误后再次编译,这次报了更多的错误,怀疑 Zig 0.14.0 已经不再兼容项目模板中所使用的 Capy 版本了。索性用 zig init
命令创建一个新项目,在新项目中使用 Capy 试试。
用 zig fetch
命令安装最新版本的 Capy:
powershellzig fetch --save git+https://github.com/capy-ui#c54ea2c17c9863b9dbc71b04ba0aaf0740d5f355
编译失败,提示:
error: no module named 'capy' available within module root
原来还要修改 build.zig 才行。没想到 Zig 的包管理那么弱智,还需要手动修改构建脚本。按照 Capy 官方文档修改好构建脚本,编译仍旧出错:
error: unsupported Zig version (0.14.0). Required Zig version 2024.11.0-mach: https://machengine.org/docs/nominated-zig/#2024110-mach
Zig 编译器版本不支持!直接被干懵了,三方库竟然不支持编译器主版本,这 Zig 的语言特性到底是有多不稳定啊!
最后试了试将 Zig 作为 C 语言项目的构建工具。让 AI 工具将一个 C 项目的 CMake 配置转换成 build.zig,让 AI 反反复复改了好多回,每次编译又是一堆错误,调都调不好的那种。
不过写不好构建脚本这事儿也不能赖 AI,实在是 Zig 的 Build API 变化太大,且完全不兼容,AI 的训练数据都没来得及更新呢。比如在 Zig 0.13 的时候,编译 main.c 的构建脚本还是这样写的:
zigconst std = @import("std");
const name = "main";
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe = b.addExecutable(.{
.name = name,
.target = target,
.optimize = optimize,
});
exe.addIncludePath(b.path("src"));
exe.addCSourceFile(.{
.file = b.path("src/main.c"),
});
exe.defineCMacro("WIN32", null);
exe.linkLibC();
b.installArtifact(exe);
}
到了 Zig 0.14 时,defineCMacro()
被删除了,构建脚本要改成:
zigconst std = @import("std");
const name = "main";
pub fn build(b: *std.Build) !void {
const target = b.standardTargetOptions(.{});
const optimize = b.standardOptimizeOption(.{});
const exe_mod = b.createModule(.{
.target = target,
.optimize = optimize,
.link_libc = true,
});
exe_mod.addCMacro("WIN32", "");
const exe = b.addExecutable(.{
.name = name,
.root_module = exe_mod,
});
exe.addIncludePath(b.path("src"));
exe.addCSourceFile(.{
.file = b.path("src/main.c"),
});
b.installArtifact(exe);
}
罢了罢了,这语言不仅语法和 API 不稳定,还一堆坑,完全没到适合生产环境的地步。还是等它发布 1.0 以后再考虑吧。