43k star 的 Zig 搬离 GitHub:一门系统语言怎么用 comptime 干掉宏和泛型
GitHub: https://github.com/ziglang/zig
一句话总结
Zig 是一门定位「C 的现代替代」的通用系统编程语言,由 Andrew Kelley 创立、Zig Software Foundation 非营利基金会维护。它用一个 comptime(编译期执行)机制吃掉了别的语言要靠泛型、宏、模板、预处理器、代码生成五套机制才能覆盖的领域;并在 2025-11 把主仓库从 GitHub 搬到了 Codeberg——这个 GitHub 仓库如今只是一份冻结的只读快照。
⚠️ 说明:本仓库已于 2025-11-26 迁移到 Codeberg,GitHub 端自此冻结。一些自动化指标(如「近 30 天 0 提交」)只是镜像停更所致,Zig 在 Codeberg 上仍在密集开发,绝非项目放弃。
值得关注的理由
- 顶级语言主动出走 GitHub 的标志性事件:43k star 的头部系统语言,因对微软的不信任、GitHub 工程质量退化、Actions 长期失修、以及严格的 no-AI 贡献政策被 Copilot 破坏,整体迁往社区非营利的 Codeberg——代码级实锤是
.github/目录已被删除、改用.forgejo/workflows/。 - comptime 是「单一机制吃掉五套元编程」的语言设计杰作:让「类型成为一等的编译期值」,泛型就是一个返回匿名 struct 的普通函数,宏和预处理器被彻底取消——这是值得任何语言设计者研究的范式。
- zig cc:连非 Zig 用户都来用的获客入口:Zig 自带一个零依赖、开箱即用、支持任意目标跨编译的 drop-in C/C++ 编译器,很多 C/C++ 项目只是把它当构建工具引入,一行代码都不用改。
项目展示
Zig 的吉祥物 Ziggy(项目 Logo)。语言/编译器项目以文字与代码示例为主,README 无产品截图。
项目画像
| 维度 | 数据 |
|---|---|
| GitHub | https://github.com/ziglang/zig(已迁移,主仓库现在 Codeberg;官网 https://ziglang.org) |
| Star / Fork | 43,037 / 3,064(Watcher 406、open issues 2789、open PR 125;均为冻结时快照) |
| 代码行数 | 402 万行总量,需拆解:真正的 Zig 编译器源码 + 标准库约 124 万行(占 31%),其余约 277 万行(69%)是仓库内置 vendored 的各平台 libc/头文件(lib/libc/ 等),非 Zig 自身代码 |
| 项目年龄 | 10.8 年 / 130.2 个月(2015-08 创建,GitHub 镜像 2025-11-26 冻结) |
| 开发阶段 | 活跃(GitHub 端冻结非放弃;冻结前一年仍有 2247 次提交,月均 300–650,10 年节奏不衰,开发已转 Codeberg) |
| 贡献模式 | BDFL 主导 + 大型社区(1330 名贡献者,Andrew Kelley 独占 34.2% 提交,ZSF 基金会发薪) |
| 热度定位 | 大众热门、高速增长(编程语言赛道头部) |
| 质量评级 | 代码[良] 文档[中-良] 测试[优] |
作者视角:为什么存在这个项目
创始人/作者背景
Andrew Kelley(andrewrk)2015 年个人发起,2020 年成立 Zig Software Foundation(ZSF)——一个 501(c)(3) 非营利基金会,靠捐赠运营并给核心贡献者发竞争力薪酬。他是绝对的灵魂人物(独占 34.2% 提交),项目是「独立语言 → 基金会可持续运营」的典型样本。
问题判断
核心洞察是:C/C++ 的不可靠不在语法而在「隐藏行为」与「工具链原始」。Zig 的语言参考反复强调一句可操作的判据——程序员必须随时能回答「字节在哪里(Where are the bytes?)」。由此诊断:默认 malloc 全局分配器让库无法在嵌入式/实时复用;预处理器/宏制造不可分析的代码;异常与运算符重载制造隐藏控制流;堆分配失败被「直接崩溃」糊弄过去。
解法哲学
四条「无」是纲领:无隐藏控制流、无隐藏内存分配、无预处理器、无宏。正向手段只有一个杀手锏——comptime,用它一次性吃掉别的语言要靠泛型 + 模板 + 宏 + 预处理器 + 代码生成五套机制才能覆盖的领域。配套:手动内存管理(defer/errdefer 确定性释放 + allocator 显式参数传递)、error union(!T)把错误并入类型系统、堆失败用 error.OutOfMemory 而非崩溃。「明确不做」清单同样是设计:无 GC、无异常、无运算符重载、无宏、无构造/析构隐藏调用。
战略意图
长期主义贯穿一切:pre-1.0 坚守 10.8 年、刻意推迟 1.0 以保留破坏性变更自由。技术三线并进——去 LLVM(自研多后端 + 自研链接器 + Zig 原生 C 前端 aro)、自托管(三阶段自举)、std I/O 重构。治理上,「迁出 GitHub → Codeberg」是同一哲学在组织层面的延伸:拒绝隐藏的平台依赖与不可控外力。迁出 GitHub 的五条原因:① 对微软不信任(「卖给微软那刻,倒计时就开始了」);② GitHub 工程质量退化(前端变成臃肿 buggy 的 JS 框架);③ GitHub Actions 长期失修,CI 积压到连 master 提交都不被检查;④ ZSF 严格的 no-LLM/no-AI 贡献政策被 Copilot 破坏;⑤ Sponsors 在产品被忽视后成了风险点。选择 Codeberg(德国社区驱动、基于 Forgejo、不依赖商业服务)正是价值观自洽。
核心价值提炼
创新之处
- comptime 统一泛型 + 元编程 + 编译期计算 — 让「类型成为一等的 comptime 值」,泛型即「
comptime T: type参数 + 返回匿名 struct 的普通函数」(fn ArrayList(comptime T: type) type);comptime-known 的if/switch编译期隐式内联并裁剪未走分支;同一函数无需改写即可在编译期与运行期复用。一招取代泛型语法/宏/模板/预处理器/codegen 五件套。新颖度 5/5、实用性 5/5、可迁移性 2/5。 - WASM 种子三阶段自举 — 仓库签入
stage1/zig1.wasm(旧版编译器的 WebAssembly 快照):cc编 wasm2c → 把 zig1.wasm 转成 zig1.c → 编出迷你编译器 zig1 → zig1 用-ofmt=cC 后端把当前src/main.zig编成 zig2.c →cc编出真正的 zig2。唯一外部依赖是一个 C 编译器,且 WASM 稳定 ABI 让种子小且确定。新颖度 5/5、实用性 4/5、可迁移性 4/5。 - zig cc / 内置跨编译工具链 — drop-in C/C++ 编译器,仓库内分发各 target 的 libc 头,任意
-target即可交叉编译 C;translate-c已用 Zig 原生的 aro 前端脱离 libclang。这是「连非 Zig 用户都来用」的获客入口。新颖度 5/5、实用性 5/5、可迁移性 2/5。 - ZIR/AIR 双层 IR + 分片 InternPool — AstGen 把 AST 降成无类型、每文件一份、与源解耦的 ZIR(可独立缓存、按需重 Sema 增量编译);Sema 再降成有类型、每函数一份的 AIR 供所有后端共享;
InternPool全局去重所有 type+value 并按 thread 分片以支持并行 Sema。新颖度 4/5、实用性 4/5、可迁移性 3/5。 - 能力即显式参数(Allocator → Io 同构 vtable) —
std.mem.Allocator是{ptr, vtable}胖指针、按约定无默认分配器、函数显式收Allocator;新版std.Io复刻同一形态把并发/异步做成可插拔接口,实现「colorless async」——同一函数体在阻塞或异步运行时都能跑。新颖度 4/5、实用性 4/5、可迁移性 3/5。
可复用的模式与技巧
- 胖指针 vtable 接口:
{ptr/userdata: *anyopaque, vtable: *const VTable}做零成本依赖注入(Allocator/Io 同模板)——需可替换实现又拒绝重型 OOP 的库。 - 能力作显式参数:把分配器、I/O、并发当函数参数而非全局单例——要在裸机/实时/测试多环境复用的库。
- comptime 工厂函数:
fn Foo(comptime T: type) type { return struct {...}; }做泛型容器。 - comptime 特性门控(
dev.zig):枚举 +supports()comptime 谓词 +noreturn返回类型裁剪死代码——多构建变体/可裁剪二进制。 - 无类型 IR 缓存层:前端先降到与源解耦的可缓存 IR,再做类型化降级——增量编译器/LSP。
- WASM 确定性种子引导:用 WASM 快照 + 转译到 C 自举——自托管语言的可复现构建。
- defer/errdefer 确定性资源管理:成功路径与错误路径分别清理。
关键设计决策
- 去 LLVM——自研多后端 + 自研链接器 + Zig 原生 C 前端:
src/codegen/自写 x86_64/aarch64/riscv64/wasm 等后端(AIR + Liveness 直出机器码,绕过 LLVM IR);src/link/自写 Elf/MachO/Coff/Wasm 链接器(LLD 仅作回退);aro 是 Zig 写的 C 前端。换来 debug 构建飞快、增量编译可行、零外部工具链依赖,代价是各后端成熟度参差、去 LLVM 远未完成。 - 编译流水线:源码 → AST → AstGen → ZIR(无类型)→ Sema(含 comptime 求值,编译器心脏
Sema.zig达 3.7 万行)→ AIR(有类型)→ codegen(多后端)→ link(自研链接器)。
竞品格局与定位
竞品对比矩阵
| 维度 | Zig | Rust | C | Go | C++ |
|---|---|---|---|---|---|
| 体量 | 43k★ | ~100k★ | 事实标准 | ~125k★ | 工业标准 |
| 内存安全 | 手动 + 运行期检查 | 借用检查器(编译期证明) | 全手动 | GC | 手动/RAII |
| 元编程 | comptime(统一) | 宏(声明/过程,割裂) | 预处理器 | 泛型(较弱) | 模板(复杂) |
| C 互操作 | 零成本 + zig cc | bindgen | 原生 | cgo(有开销) | 原生 |
| 编译速度 | 快(去 LLVM) | 慢 | 快 | 快 | 慢 |
| 跨编译 | 零配置内置 | 需配置 | 地狱 | 较好 | 难 |
差异化护城河
① comptime 这一「单一机制吃掉五套元编程」的设计,竞品难以追加移植;② zig cc/内置跨编译——把工具链护城河做成「连非 Zig 用户都来用」的获客入口;③ 自托管 + 去 LLVM + 自研链接器形成的全栈可控工具链;④ no-AI 贡献政策 + ZSF 非营利 + 迁出 GitHub 构成的「独立治理」品牌。
竞争风险
pre-1.0 长期不稳定吓退保守用户;内存安全是「手动 + 运行期检查」而非 Rust 式编译期证明,在「安全」叙事上处下风;去 LLVM 各后端成熟度参差、生态深度远逊;迁出 GitHub 牺牲了发现性/贡献者流量。
生态定位
在「C 的现代替代」这条赛道做唯一同时提供「现代语言 + drop-in C 工具链 + 零配置跨编译」三合一者;与 Rust 形成「简单可预测 vs 编译期安全」的双极,共同蚕食 C/C++ 存量。Rust=「编译期证明的安全派」,Zig=「可预测 + 简单 + 可复用派」。
套利机会分析
- 信息差:存在明显套利空间——大量中文读者只看 GitHub,会误以为「Zig 凉了」(被「已放弃」标签与冻结误导),而「头部语言主动出走 GitHub」本身是高传播性事件,纠偏 + 解读「为何迁出」是天然选题钩子,叠加「no-AI 政策 vs Copilot」「微软收购后 GitHub 退化」三重看点。
- 技术借鉴:「胖指针 vtable 接口」「能力即显式参数」「WASM 种子自举」「无类型 IR 缓存层」四项可迁移到任何库设计/编译器/语言工程;comptime 思想对语言设计者极具启发。
- 生态位:填补「现代语言 + drop-in C 工具链 + 零配置跨编译」三合一的空白。
- 趋势判断:与 Rust 并列争夺 C/C++ 王座,长期主义稳健;但 pre-1.0 不稳定与迁出 GitHub 的发现性损失是变量。
风险与不足
- pre-1.0 长期不稳定:10.8 年未发 1.0,刻意保留破坏性变更自由,保守/生产用户需承担语言演进风险。
- 内存安全模型处下风:手动内存 + 运行期 safety check,而非 Rust 式编译期证明,在「内存安全」叙事上不占优。
- 去 LLVM 未完成:自研后端/链接器成熟度参差,仍未全面替代 LLVM。
- 可维护性与生态:多个单文件超万行/数 MB(Sema.zig 3.7 万行、x86_64 codegen ~10.9MB);包管理 pre-1.0、第三方库存量浅;迁出 GitHub 后贡献/曝光入口收窄、仓库不再镜像。
行动建议
- 如果你要用它:写内核/嵌入式/实时/低延迟/游戏引擎/工具链,想要可预测、无 GC、无隐藏行为、且跨编译零配置——Zig 是强候选(注意 pre-1.0 锁版本)。只想给现有 C/C++ 项目一个无痛跨编译的统一构建工具:直接把
zig cc/zig c++引入,零改代码。要编译期内存安全保证选 Rust;要带 GC 的云服务语言选 Go。 - 如果你要学它:这是语言/编译器设计的活教材。看
doc/langref.html.in(唯一权威规范)理解 comptime;编译器架构看src/Sema.zig(心脏,ZIR→AIR + comptime 求值)+src/Air.zig+lib/std/zig/Zir.zig+src/InternPool.zig;自举看bootstrap.c+build.zig;标准库哲学看lib/std/mem/Allocator.zig+lib/std/Io.zig;去 LLVM 看src/codegen/+src/link/+lib/compiler/aro/。 - 如果你要 fork 它:注意主仓库已在 Codeberg(GitHub 是冻结快照),贡献应去 Codeberg。技术上可参与的方向是去 LLVM 后端成熟化、std I/O 重构、包生态建设;但要清楚 ZSF 有严格的 no-AI 贡献政策。
知识入口
| 资源 | 链接 |
|---|---|
| DeepWiki | https://deepwiki.com/ziglang/zig(已收录,含完整架构图:编译流水线 AST→ZIR→AIR、多后端代码生成、三阶段自举) |
| 官方文档 | https://ziglang.org(语言参考 langref + 迁移公告);社区教程 zig.guide |
| 主仓库(已迁移) | Codeberg(GitHub 为只读冻结快照,不再镜像) |
| Zread.ai | 未确认(返回 403) |