写完了三年编程语言,今天发现编译器根本不是给我写的——Zero 把这件事彻底变了

我干了十年前端,用过 TypeScript、Rust、Go,每次学新语言都是同一套流程:看语法手册、配 IDE、写 Demo、调 bug。但最近 Vercel 发布了一门叫 Zero 的编程语言,我翻完文档之后意识到一件事——它根本不是给我写的。

这话不是比喻。

编译器是给 AI 看的,不是给人看的

传统编程语言的报错信息是给人设计的。SyntaxError: unexpected tokenCannot read property x of undefined ——人看得懂,AI 其实也能看懂,但 AI 要花额外的 token 去解析、去猜上下文、去理解这个错误和代码库其他部分的关系。

Zero 彻底把这个关系翻了。

它的报错是结构化的,带稳定代码:NAM003 是命名冲突、declare-missing-symbol 是缺失声明修复元数据。而且所有子命令都支持 --json 输出,zero fix --plan --json 返回的是一份机器可读的修复计划,AI 可以直接接受、编辑或拒绝,不用盲写。

这个设计对 AI 程序员是致命的。 因为 AI 改代码最怕的就是拿着模糊的错误信息来回试——Zero 把这个来回次数直接压缩到了一次。

.0 文件是投影,zero.graph 才是本体

这是 Zero 最反直觉的设计。

一个 .0 文件不是源代码,是投影——供人类阅读的视图。真正的输入是二进制文件 zero.graph,里面存着程序的完整语义结构。

AI 通过 zero query 查图、通过 zero patch 改图。补丁受图哈希保护——过期的或无效的编辑在写入存储之前就会失败,根本写不进去。

v0.3.0 把这个 graph-first 设定为默认工作流。v0.3.2 还把 zero import 速度提升了约 12 倍,让从文本优先项目迁移过来的成本大幅降低。

副作用是显式的,World 参数是编译器强制执行的

在传统语言里,一个函数能不能访问网络、读文件、打印日志,全靠文档和经验。AI 尤其容易在这里踩坑——它不知道这个函数能不能做网络请求,有时候会自己加一个,结果踩到安全边界。

Zero 直接在类型系统里把这件事堵死了。

任何和外部世界交互的函数都必须接受一个 World 能力参数,由编译器强制检查。看一眼函数签名,就知道它会不会产生副作用——这是静态的,是编译器级别的,不是靠文档约定的。

// 这个函数可以访问网络
fn fetchData(url: String, world: World<net>) -> Data

// 这个函数只能做纯计算
fn compute(x: Number): Number  // 不需要 World 参数

AI 生成的代码如果偷偷加了没声明的副作用,编译器直接报错,AI 没法靠「凑巧能跑」来蒙混过关。

和成熟语言的对比

Zero Rust Go
二进制体积 ~16KB (Hello World) 较大 较大
运行时 有 (Go runtime)
内存安全 靠显式管理 借检查器 GC
副作用检查 编译器强制 编译器建议 靠约定
AI 友好度 最高

结构上它更接近 Zig 而不是 Rust——没有 Rust 借检查器的成熟度和生态,但也没有 Rust 的学习曲线。它选择了体积和显式分配,放弃了 Rust 的安全性保障。

对前端工程师意味着什么

说实话,短期内你大概率不会用 Zero 写业务代码。 它目前是实验阶段,不适合生产环境,不适合处理敏感数据,预计会有破坏性变更。

但它的方向值得持续关注。

Anthropic 前不久说「Claude Code 已经 100%% 自己写代码」——这件事背后其实是 AI 编程工具对代码一致性的需求在驱动。当 AI 成了代码的主要生产者和修改者,语言的面向对象就从「人读」变成了「人机共读」。

Zero 是第一个在语言设计层面把这个转变说出来的玩家。它的实验性恰恰是价值所在——它在回答一个还没人认真回答的问题:如果 AI 是你的主要读者,编程语言应该长什么样?


下一步你可以做一件事: 去 GitHub 搜 vercel/zero,跑一下它的 Hello World,感受一下 zero graphzero query 是什么手感。不用学它,但要知道它在那里。

评论区

0 条评论

登录后可评论。

AI 产品观察 78 阅读