GitHub Explorer

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 上仍在密集开发,绝非项目放弃。

值得关注的理由

  1. 顶级语言主动出走 GitHub 的标志性事件:43k star 的头部系统语言,因对微软的不信任、GitHub 工程质量退化、Actions 长期失修、以及严格的 no-AI 贡献政策被 Copilot 破坏,整体迁往社区非营利的 Codeberg——代码级实锤是 .github/ 目录已被删除、改用 .forgejo/workflows/。
  2. comptime 是「单一机制吃掉五套元编程」的语言设计杰作:让「类型成为一等的编译期值」,泛型就是一个返回匿名 struct 的普通函数,宏和预处理器被彻底取消——这是值得任何语言设计者研究的范式。
  3. zig cc:连非 Zig 用户都来用的获客入口:Zig 自带一个零依赖、开箱即用、支持任意目标跨编译的 drop-in C/C++ 编译器,很多 C/C++ 项目只是把它当构建工具引入,一行代码都不用改。

项目展示

Zig Logo

Zig 的吉祥物 Ziggy(项目 Logo)。语言/编译器项目以文字与代码示例为主,README 无产品截图。

项目画像

维度数据
GitHubhttps://github.com/ziglang/zig(已迁移,主仓库现在 Codeberg;官网 https://ziglang.org)
Star / Fork43,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、不依赖商业服务)正是价值观自洽。

核心价值提炼

创新之处

  1. comptime 统一泛型 + 元编程 + 编译期计算 — 让「类型成为一等的 comptime 值」,泛型即「comptime T: type 参数 + 返回匿名 struct 的普通函数」(fn ArrayList(comptime T: type) type);comptime-known 的 if/switch 编译期隐式内联并裁剪未走分支;同一函数无需改写即可在编译期与运行期复用。一招取代泛型语法/宏/模板/预处理器/codegen 五件套。新颖度 5/5、实用性 5/5、可迁移性 2/5。
  2. WASM 种子三阶段自举 — 仓库签入 stage1/zig1.wasm(旧版编译器的 WebAssembly 快照):cc 编 wasm2c → 把 zig1.wasm 转成 zig1.c → 编出迷你编译器 zig1 → zig1 用 -ofmt=c C 后端把当前 src/main.zig 编成 zig2.c → cc 编出真正的 zig2。唯一外部依赖是一个 C 编译器,且 WASM 稳定 ABI 让种子小且确定。新颖度 5/5、实用性 4/5、可迁移性 4/5。
  3. zig cc / 内置跨编译工具链 — drop-in C/C++ 编译器,仓库内分发各 target 的 libc 头,任意 -target 即可交叉编译 C;translate-c 已用 Zig 原生的 aro 前端脱离 libclang。这是「连非 Zig 用户都来用」的获客入口。新颖度 5/5、实用性 5/5、可迁移性 2/5。
  4. ZIR/AIR 双层 IR + 分片 InternPool — AstGen 把 AST 降成无类型、每文件一份、与源解耦的 ZIR(可独立缓存、按需重 Sema 增量编译);Sema 再降成有类型、每函数一份的 AIR 供所有后端共享;InternPool 全局去重所有 type+value 并按 thread 分片以支持并行 Sema。新颖度 4/5、实用性 4/5、可迁移性 3/5。
  5. 能力即显式参数(Allocator → Io 同构 vtable) — std.mem.Allocator 是 {ptr, vtable} 胖指针、按约定无默认分配器、函数显式收 Allocator;新版 std.Io 复刻同一形态把并发/异步做成可插拔接口,实现「colorless async」——同一函数体在阻塞或异步运行时都能跑。新颖度 4/5、实用性 4/5、可迁移性 3/5。

可复用的模式与技巧

  1. 胖指针 vtable 接口:{ptr/userdata: *anyopaque, vtable: *const VTable} 做零成本依赖注入(Allocator/Io 同模板)——需可替换实现又拒绝重型 OOP 的库。
  2. 能力作显式参数:把分配器、I/O、并发当函数参数而非全局单例——要在裸机/实时/测试多环境复用的库。
  3. comptime 工厂函数:fn Foo(comptime T: type) type { return struct {...}; } 做泛型容器。
  4. comptime 特性门控(dev.zig):枚举 + supports() comptime 谓词 + noreturn 返回类型裁剪死代码——多构建变体/可裁剪二进制。
  5. 无类型 IR 缓存层:前端先降到与源解耦的可缓存 IR,再做类型化降级——增量编译器/LSP。
  6. WASM 确定性种子引导:用 WASM 快照 + 转译到 C 自举——自托管语言的可复现构建。
  7. 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(自研链接器)。

竞品格局与定位

竞品对比矩阵

维度ZigRustCGoC++
体量43k★~100k★事实标准~125k★工业标准
内存安全手动 + 运行期检查借用检查器(编译期证明)全手动GC手动/RAII
元编程comptime(统一)宏(声明/过程,割裂)预处理器泛型(较弱)模板(复杂)
C 互操作零成本 + zig ccbindgen原生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 贡献政策。

知识入口

资源链接
DeepWikihttps://deepwiki.com/ziglang/zig(已收录,含完整架构图:编译流水线 AST→ZIR→AIR、多后端代码生成、三阶段自举)
官方文档https://ziglang.org(语言参考 langref + 迁移公告);社区教程 zig.guide
主仓库(已迁移)Codeberg(GitHub 为只读冻结快照,不再镜像)
Zread.ai未确认(返回 403)

相关报告