编程 Zig 项目宣布反 AI 贡献政策:开源社区最分裂的话题,程序员怎么看?

2026-05-31 11:23:49 +0800 CST views 5

Zig 项目宣布反 AI 贡献政策:开源社区最分裂的话题,程序员怎么看?

引言:一个编程语言项目的"出圈"时刻

2026年4月,一个原本只在小众程序员圈子活跃的消息,在 Hacker News 上拿到了 656 分,成为当日最高热度——Zig 语言官方宣布:不接受任何由 LLM(大型语言模型)生成的代码贡献

不是"鼓励",不是"建议",是明文写入《行为准则》(Code of Conduct)》的硬性禁止:issues 不许用 LLM 写,Pull Request 不许用 LLM 写,bug 跟踪系统的评论也不许用——翻译也不行。

这个决定本身已经足够炸裂,但更耐人寻味的是背后的逻辑。Zig Software Foundation(ZSF)社区副总裁 Loris Cro 在博客文章《Contributor Poker and Zig's AI Ban》中,给出了迄今为止技术社区里关于 AI 贡献禁令最系统、最有深度的论述。这不是一家公司的商业决策,也不是某个大厂的作秀,而是一个由志愿者驱动的小型语言项目,在 AI 狂潮中做出的一次艰难而清醒的判断。

本文将从程序员视角出发,完整解析这一事件的来龙去脉、核心论点、社区争议,以及它对整个开源生态的深远影响。

一、背景:Zig 是什么?为什么它的声音值得听?

在深入话题之前,有必要先理解 Zig 为何值得关注。

1.1 Zig 的设计哲学

Zig 是一门由 Andrew Kelley 于 2016 年发起的系统编程语言,核心目标是成为 C 的现代替代品。它的设计哲学极为鲜明:

  • 无隐藏控制流:没有隐式的内存分配,没有宏展开的隐藏行为,没有垃圾回收器的不可预测暂停
  • 显式优于隐式:所有资源分配和释放都在代码中可见
  • 零成本抽象:抽象不应引入运行时开销
  • 优秀的 C 互操作:Zig 可以直接编译 C 代码,不需要任何胶水层

用 Zig 官方的话来说:"通用编程语言应该做到:你的代码做什么,就写什么,不多不少。"

这种极致显式化的设计哲学,贯穿 Zig 的每一个决策——包括这一次对 AI 的立场。

1.2 Zig 的社区规模

必须指出:Zig 不是一个"主流"语言。截至 2026 年,它的 GitHub star 数约 7 万,与 Rust(12万+)、Go(110万+)相比仍有相当距离。但这恰恰让这个决定更有分析价值——不是因为它有多大影响力,而是因为它代表了小而精的社区在 AI 洪流中的主动选择

1.3 Bun 的出现:一个"意外"的对比案例

Zig 获得广泛关注的另一个原因,与 Bun 密切相关。Bun 是一个由 Jarred Sumner 开发的 JavaScript 运行时/打包工具/测试框架,它选择用 Zig 编写核心底层代码。2025年12月,Bun 被 Anthropic 收购,成为 Claude 生态的一部分。

Bun 大量使用 AI 辅助开发,与 Zig 的反 AI 政策形成了戏剧性的对比。而更戏剧性的是:

2026年,Bun 团队在自有的 Zig fork 中实现了编译器并行语义分析和多 codegen 单元的优化,将编译速度提升了 4 倍——但 Bun 明确表示:"我们目前没有计划向上游(Zig 主仓库)提交这个 patch,因为 Zig 严格禁止 LLM 生成的贡献。"

这一声明直接把这个事件从一个"哲学讨论"变成了一个真实的技术后果案例

二、核心论点:为什么 Zig 要禁止 AI 贡献?

2.1 Loris Cro 的"Contributor Poker"理论

Loris Cro 是 Zig Software Foundation 的 VP of Community,也是这个禁令背后的主要阐释者。他的核心理论被命名为 "Contributor Poker"(贡献者扑克)——借用了真实扑克游戏中的一句话:"你打的是人,不是牌。"

在开源世界里,这个比喻的意思是:维护者真正看重的,是贡献者这个人,而不是某一次 PR 的内容。

Loris Cro 在博客中解释道:

在成功的开源项目中,你迟早会达到一个临界点——收到的 PR 数量超过了你能够处理的极限。按常理,这时候应该减少接受不完美的 PR,以提高工作投入产出比。但 Zig 项目没有这么做。我们尽最大努力帮助新的贡献者把代码合并进来,即使他们需要一些指导。

这样做不只是因为这是"正确的事",更因为这是聪明的事

核心逻辑链如下:

贡献者提交 PR → 维护者审核代码 → PR 被合并(或被指导修改后合并)
                          ↓
              贡献者在审核交流中成长
                          ↓
            贡献者变成可信的、活跃的长期贡献者
                          ↓
                   项目社区持续壮大

这是一个投资关系:维护者花时间审核 PR,本质上是在对贡献者进行投资。如果一个 PR 完全是 LLM 写的,那么维护者花费的审核时间,对培养贡献者没有任何帮助——因为那个"写代码的人"(LLM)不会从这个过程中学到任何东西,下一次还是提交同等质量的代码。

2.2 为什么维护者的时间是稀缺资源?

在 Zig 这样的项目里,维护者基本是无偿贡献者。他们有自己的全职工作,利用业余时间维护一个数万开发者依赖的语言项目。

在这种情况下,时间稀缺性是首要矛盾。Loris Cro 指出了一个关键问题:

如果一个 PR 大部分是由 LLM 写的,那项目的维护者为什么要花时间审核和讨论这个 PR,而不是直接打开自己的 LLM 去解决同一个问题?

这是一个朴素但深刻的反问。当 LLM 可以"批量生产"看起来合理的代码时,传统的"以代码质量论贡献"的评价体系就失效了——因为即使代码质量合格,维护者投入的每一分钟,都是在为一个不会成长的 LLM 做嫁衣。

2.3 LLM 辅助与"搭便车"问题

更深一层,LLM 辅助贡献引入了**搭便车(Free Rider)**问题:

  • 贡献者 A:花 2 周深入研究 Zig 的异步运行时,手写代码,经历 10 轮 review,最终合并
  • 贡献者 B:用 LLM 生成代码,花 2 小时提交,经历 5 轮 review(大部分是让 LLM 修复),最终合并

从代码层面看,两者的最终产出可能完全等价。但从项目生态的角度看,贡献者 A 的过程为项目带来了:一个更深入理解 Zig 架构的活跃成员,一段可以在未来帮助审核他人的知识积累,和一段建立信任的社区关系。贡献者 B 则只贡献了代码本身。

Zig 的判断是:只收代码、透支维护者时间的模式,长期来看会损害社区生态。

三、真实案例:Bun 的 4 倍提速为什么上不了游?

3.1 事件始末

2026年,Bun 团队在 Oven.sh(公司名)维护的 Zig fork 中,对 Zig 编译器做了重大优化。核心改进包括:

  1. 并行语义分析(Parallel Semantic Analysis):将编译过程的语义分析阶段并行化,充分利用多核 CPU
  2. 多 Codegen 单元(Multiple Codegen Units):编译器后端 LLVM 的 codegen 阶段拆分为多个并行单元

这两个改动叠加起来,将 Bun 的编译速度提升了 4 倍——这对一个 JavaScript 运行时来说,是极其显著的工程收益。

3.2 为什么不上游?

Bun 的官方声明原文是:

We do not currently plan to upstream this, as Zig has a strict ban on LLM-authored contributions.

Bun 明确表示,因为 Zig 的禁令,他们不会向上游提交这个 patch。

这让整个事件从"哲学讨论"变成了有血有肉的技术现实

  • 社区失去了一个 4 倍性能提升的优化,即使代码本身可能完全合规
  • Bun 与 Zig 主线的技术差距将持续扩大,Fork 与上游渐行渐远
  • 这恰恰说明 Zig 的禁令是有代价的——它在保护社区价值观的同时,也在承担生态割裂的风险

3.3 另一个声音:并行语义分析"本身就有问题"

有趣的是,一位 Zig 核心贡献者在 ZigGit 论坛上补充了另一个视角:并行语义分析的 patch 本身就有问题,与 LLM 禁令无关。

这位贡献者指出,并行语义分析对 Zig 语言本身有深远影响——它不只是"一个优化",而是涉及 Zig 编译器的核心设计方向。这个方向是 Zig 核心团队早就规划过的,但在落地之前需要更全面的讨论。

换句话说:即使没有 AI 禁令,这个 patch 也很可能不会被接受——不是因为来源有问题,而是因为它涉及语言层面的架构决策,不适合以"大 patch"的形式直接合并。

这个补充让我们看到,Zig 的 AI 禁令虽然清晰,但真实的技术决策远比表面复杂

四、版权与法律:被忽视的隐患

4.1 LLM 训练的版权争议

除了社区治理问题,版权是另一个被广泛讨论但尚未有定论的话题。

当前主流 LLM(包括 GPT 系列、Claude 系列、Gemini 等)的训练数据来源,一直存在法律争议:

  • 有版权的代码:GitHub、Stack Overflow、技术书籍——这些数据的版权归属复杂,LLM 在训练时是否获得了合法授权?
  • 输出代码的版权归属:当 LLM 基于训练数据生成代码时,输出内容的版权状态如何?
  • 许可协议冲突:Zig 本身采用自定义许可(Zlib License,几乎等同于公共领域),但其他开源项目的许可能否兼容 LLM 的"蒸馏"过程?

4.2 为什么这对 Zig 特别重要?

Zig 社区的核心价值观之一是代码透明和自由。Zlib License 是最宽松的开源许可之一——几乎允许任何用途,包括商业闭源使用,前提是不损害原作者的署名权。

如果 Zig 项目接受了 LLM 生成的代码,而这些代码的训练数据包含了 GPL 等 Copyleft 协议的代码,理论上可能引入许可传染风险。虽然这个风险在实践中很难量化,但它与 Zig 社区对代码纯净性的追求是相悖的。

4.3 免责声明的困境

目前,所有主流 LLM 服务都有类似的免责声明:模型输出不保证准确性,不构成专业建议,版权归属存在争议等。

但对于一个系统编程语言来说,"输出代码不保证正确性"是不可接受的风险。Zig 的编译器直接生成机器码,一个隐藏的 bug 可能导致:

  • 安全漏洞(如缓冲区溢出)
  • 未定义行为(UB)
  • 编译时/运行时的静默错误

LLM 生成的代码,在这类安全敏感的底层代码场景下,风险远高于上层应用开发。

五、社区反应:开源世界的"左右之争"

5.1 支持者:这是清醒的判断

支持 Zig 决定的声音主要集中在:

长期贡献者群体:他们深刻理解维护开源项目的艰辛。审核 PR 是纯粹的利他行为,而 LLM 批量生产 PR 的模式,会把这种利他行为变成一种"被薅羊毛"的感觉。

重视社区文化的开发者:开源不只是代码的集合,更是一种人际关系网络。Contributor Poker 理论戳中了很多人的真实感受:社区的价值来自于人与人之间的互动,而不是人与机器之间的交易。

版权洁癖者:在 LLM 版权争议尘埃落定之前,保持距离是一种理性的风险规避。

5.2 反对者:这是不现实的乌托邦

批评者的声音同样有力:

"这无法执行"派:你如何证明一个 PR 是 LLM 写的?提交者只需要声称是自己手写的,你没有办法反驳。这个政策本质上只能靠"荣誉制度",执行成本为零。

"自我矛盾"派:Bun 用 Zig 写就,但 Bun 被 Anthropic 收购了,而 Anthropic 的 Claude 就是 LLM。Zig 对外部贡献者说不,但它的最大商业用户却在用 LLM 开发——这难道不是一种双重标准?

"阻碍进步"派:4 倍编译提速的 patch 因为来源问题无法进入上游,最终受害的是整个 Zig 生态。政策应该解决的是"代码质量问题",而不是"代码生产方式"。

"门槛歧视"派:不是所有开发者都有相同的英语水平和代码经验。对于非英语母语的开发者,LLM 辅助写作 issues 和评论是降低参与门槛的有效工具。Zig 的禁令可能会让一些有价值的贡献者望而却步。

5.3 中间地带:技术问题还是哲学问题?

最有趣的观点来自中间地带:这个问题根本没有"正确答案"。

不同的开源项目有不同的需求:

  • Linux 内核:规模超大,维护者众多,技术决策复杂,LLM 辅助的边界在哪里是真实的问题
  • 小众工具库:贡献者稀缺,社区关系紧密,Contributor Poker 的逻辑可能完全适用
  • 企业内部项目:没有"社区",LLM 爱怎么用怎么用

Zig 的选择不一定是"正确答案",但它是最适合 Zig 当前状态的选择。每个项目都应该根据自身情况做出判断,而不是盲目追随某一种趋势。

六、横向对比:其他开源项目如何应对?

6.1 Linux 内核

Linus Torvalds 对 LLM 的态度经历了从冷淡观望有条件接受的转变。

2025年,Linux 内核明确宣布:允许使用 LLM 辅助生成代码,但提交时必须注明。这不是对 LLM 的全面禁止,而是一种"透明化要求"。

Linus 本人在邮件列表中表达过这样的观点:"如果 LLM 能帮你写一个好的 driver,我不在乎它是怎么写的——只要最终代码是正确的。"但他也补充,维护者仍然需要对代码负责,所以提交的 LLM 辅助代码,最终质量责任还是落在提交者身上。

6.2 Python(CPython)

Python 的核心开发者社区相对保守。PEP(Python 改进提案)流程要求提案者深度解释技术决策,这不是 LLM 能轻易替代的领域。

但在实际开发中,CPython 的贡献者大量使用 LLM 辅助代码审查和 bug 定位——这不是贡献,而是辅助工具,与 Zig 禁止的"LLM 生成贡献内容"有所区别。

6.3 React / Next.js(Meta)

Meta 允许工程师在内部使用 LLM 辅助开发,但对外的开源贡献流程没有明确的 AI 政策。这更多反映的是:大型科技公司的开源项目,其"社区贡献"在公司内部开发面前往往是边缘角色

6.4 对比总结

项目AI 政策核心理由
Zig全面禁止贡献社区价值观 + Contributor Poker
Linux允许(需注明)质量优先 + 透明化
CPython无明确政策依赖开发者自律
Meta 项目内部允许,外部无政策企业驱动,贡献占比小

Zig 的政策是所有主流开源项目中最激进、最明确的。这与它的社区规模、治理结构和文化基因是分不开的。

七、技术深度:为什么 LLM 在系统编程领域特别"危险"?

7.1 未定义行为(Undefined Behavior)的陷阱

系统编程语言(C、C++、Rust、Zig)的最大挑战之一,是处理未定义行为(UB)。UB 指的是 C 标准没有规定编译器应该如何处理的代码模式——在这种情况下,编译器可以"为所欲为",生成任何它认为合理的机器码。

LLM 在生成系统级代码时,特别容易产生 UB,原因如下:

  1. 上下文窗口限制:LLM 能看到的上下文有限,系统级代码往往需要理解整个项目的架构,LLM 容易产生"只见树木不见森林"的错误
  2. 隐性假设:LLM 倾向于在代码中注入隐式假设(如"这个指针不可能为 null"),而 Zig 的设计哲学恰恰是要消除所有隐式假设
  3. 编译器差异:Zig 支持多个后端(LLVM、Glslang、wasm-ld 等),不同后端对 UB 的处理不同,LLM 难以掌握所有后端的细节

7.2 一个具体的例子

以下是 LLM 容易出错的一个 Zig 代码场景——错误处理的隐式跳过

// LLM 容易写出的"隐性错误"
const std = @import("std");

fn readFile(path: []const u8) ![]u8 {
    // 错误处理看起来有,但实际上可能忽略了很多边缘情况
    const file = try std.fs.cwd().openFile(path, .{});
    defer file.close();
    
    // LLM 经常忘记处理空文件、大文件、权限问题等
    const content = try file.readToEndAlloc(std.heap.page_allocator, std.math.maxInt(usize));
    return content;
}

而 Zig 社区期望的显式错误处理风格是:

// 正确的显式错误处理
const std = @import("std");

fn readFile(path: []const u8) ![]u8 {
    const file = try std.fs.cwd().openFile(path, .{
        .mode = .read_only,
    });
    errdefer file.close(); // 使用 errdefer 确保错误路径也关闭文件
    
    // 显式处理空文件边界情况
    const stat = try file.stat();
    if (stat.size == 0) {
        return &.{};
    }
    
    // 限制最大文件大小,防止恶意大文件
    const max_size = 10 * 1024 * 1024; // 10MB
    if (stat.size > max_size) {
        return error.FileTooLarge;
    }
    
    const content = try file.readToEndAlloc(std.heap.page_allocator, max_size);
    return content;
}

这种"宁可啰嗦也不遗漏"的显式风格,恰恰是 LLM 最难稳定产出的——因为 LLM 的训练数据中,隐式简化的代码比显式完备的代码数量更多。

7.3 内存安全 vs. LLM 的不确定性

Zig 不使用垃圾回收,而是依赖所有权系统(Ownership)编译时资源管理来实现内存安全。LLM 在生成涉及内存分配的代码时,经常出现:

  • 忘记 defer 释放资源
  • 在错误路径上遗漏资源清理
  • arenaAllocator 等工具的使用不当

这些错误在 Rust 中会被编译器直接拦截,但在 Zig 中,它们是潜在的运行时 bug

// 错误示例:LLM 常见的内存管理遗漏
fn processData(allocator: std.mem.Allocator, data: []u8) ![]u8 {
    const result = try allocator.alloc(u8, data.len);
    // LLM 经常忘记处理 allocator.alloc 可能失败的情况
    // 以及在错误时没有释放已分配的 result
    
    @memcpy(result, data);
    return result;
}

// 正确做法:使用 errdefer
fn processDataCorrect(allocator: std.mem.Allocator, data: []u8) ![]u8 {
    const result = try allocator.alloc(u8, data.len);
    errdefer allocator.free(result); // 任何错误返回时都会释放
    
    @memcpy(result, data);
    return result;
}

八、程序员视角:这件事对我们意味着什么?

8.1 开源治理的新课题

Zig 的 AI 禁令,揭示了开源社区在 AI 时代面临的一个根本性治理问题:当代码的生产成本趋近于零时,如何重新定义"贡献"的价值?

传统上,开源贡献的价值链是:

代码质量(功能正确性)+ 贡献者成长(社区参与)= 整体价值

AI 时代,这个等式变成了:

代码质量(可能被 LLM 解决)+ 贡献者成长(被 LLM 跳过)= 部分价值

Zig 的选择是:拒绝接受这种"部分价值",坚持整体价值。这不是反对 AI,而是一种基于社区价值观的主动选择

8.2 AI 辅助的边界在哪里?

对于普通程序员来说,这个事件引发的最重要的问题是:我在工作中使用 LLM 辅助编程是"作弊"吗?

这个问题的答案取决于场景:

  • 个人项目:随便用,没有人在乎你是怎么写出来的
  • 工作项目:只要最终产品满足要求,工具的选择取决于公司政策
  • 开源贡献:需要考虑目标项目的文化和政策,尊重社区规则
  • 学习过程:如果用 LLM 替代了主动思考和debug过程,损害的是你自己的能力成长

Zig 的案例给我们的最大启示是:LLM 是工具,不是替代品。它可以放大你的能力,但不能替代你理解代码。

8.3 对于开源维护者的建议

基于 Zig 的实践,如果你是一个开源项目的维护者,可以考虑以下策略:

策略一:明确政策(像 Zig 一样)
如果你认为社区文化比代码数量更重要,可以制定明确的 AI 使用政策,并写进 CONTRIBUTING.md 和 Code of Conduct。

策略二:透明要求(像 Linux 一样)
不禁止 LLM 辅助,但要求贡献者说明是否使用了 LLM,以及如何验证了代码的正确性。

策略三:质量门槛
提高 PR 的质量标准(如要求额外的测试覆盖率、更详细的 commit message),间接降低 LLM 批量生产低质量 PR 的动机。

策略四:拥抱变化
不设置特殊政策,让社区自行决定。这适合规模较大、贡献者背景多元的项目。

8.4 对于程序员的思考

从更宏观的角度看,Zig 的事件让我们不得不面对一个令人不安的问题:如果 LLM 可以写出和你一样的代码,你的独特价值在哪里?

答案可能在于:

  1. 架构决策能力:LLM 在单个函数的粒度上表现优秀,但在整个系统的架构设计上仍然需要人类判断
  2. 上下文理解:理解一个遗留代码库为什么是现在这个样子,这种"考古"能力是 LLM 的短板
  3. 跨领域综合:将产品需求、用户体验、技术约束、团队能力综合起来做出决策——这是纯技术之外的能力
  4. 社区经营:建立和维护一个开发者社区,让人们愿意为共同的目标协作——这是 LLM 完全无法替代的

Zig 的 Loris Cro 说得好:"你赌的是贡献者,不是某一次 PR。" 放到个人职业发展上,这句话同样适用:你赌的是你自己的成长,不是某一次 LLM 帮你完成的代码。

九、展望:开源的下一个十年

9.1 AI 与开源:从对抗到共生的路径

Zig 的强硬立场,可能不是 AI 与开源关系的"标准答案",但它提供了一个有价值的思考框架

未来的开源生态,可能会演变成:

  • AI 生成代码库:由 AI 自动生成、测试、优化的开源库,人类负责验收和架构决策
  • AI 辅助贡献者:人类程序员用 LLM 辅助日常工作,但向开源项目提交时遵循各项目的政策
  • AI 审查工具:LLM 被用作 PR 审查工具,帮助维护者更快地发现潜在问题
  • 新型许可证:针对 AI 训练的许可证出现,明确规定 LLM 是否可以学习该项目代码

9.2 Zig 的实验意义

无论你认同还是反对 Zig 的政策,有一点是确定的:Zig 是第一个把这个争论从"私下讨论"变成"公开政策"的主流开源项目

这种实验的价值,不在于它的结论是否正确,而在于它逼迫我们所有人去思考:在一个 AI 可以无限复制代码的世界里,开源社区存在的意义是什么?人类程序员的价值是什么?维护者的时间应该花在什么地方?

这些问题没有标准答案,但主动思考和选择,本身就是一种进步。

9.3 结语

2026年的编程语言社区,因为 Zig 的一纸禁令而热闹非凡。有人称赞这是"清醒的判断",有人批评这是"不切实际的清高",更多的人在观望这场实验的下一步走向何方。

作为一名程序员,与其盲目站队,不如从中学到一件事:

在工具越来越强大的时代,选择的权力反而更珍贵。

Zig 选择了一条难走的路——不是因为它不知道 AI 的好处,而是因为它知道 社区的灵魂不在于代码,而在于写代码的人。

这个选择,或许正是开源精神最本真的样子。


参考资料:

  • Loris Cro, "Contributor Poker and Zig's AI Ban", ZigGit, 2026
  • Simon Willison, "The Zig project's rationale for their firm anti-AI contribution policy", simonwillison.net, 2026
  • Bun Blog, "Bun joins Anthropic", December 2025
  • Zig Language Official, Code of Conduct, ziglang.org
  • Hacker News Discussion on Zig AI Policy, April 2026

标签:Zig|开源|AI编程|LLM|GitHub|社区治理|系统编程|Contributor|Poker

关键词:Zig反AI政策|开源LLM治理|Bun性能优化|Contributor Poker|Loris Cro|Simon Willison|系统编程语言|AI代码贡献

推荐文章

css模拟了MacBook的外观
2024-11-18 14:07:40 +0800 CST
html文本加载动画
2024-11-19 06:24:21 +0800 CST
一个简单的打字机效果的实现
2024-11-19 04:47:27 +0800 CST
在JavaScript中实现队列
2024-11-19 01:38:36 +0800 CST
Vue3中的Store模式有哪些改进?
2024-11-18 11:47:53 +0800 CST
Vue3中的v-bind指令有什么新特性?
2024-11-18 14:58:47 +0800 CST
程序员茄子在线接单