Menu

Zero 是什么?为 AI 智能体设计的编程语言

Zero 是 Vercel Labs 推出的实验性系统编程语言,它把 AI 智能体当作一等用户,而不只是为人类设计。本文介绍 Zero 是什么,以及它为什么存在。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

围绕读者设计的语言

大多数编程语言是为人类设计的。它们的语法优化的是人类在意的东西:简洁的写法、富有表现力的惯用法、“优雅”的捷径。编译器用自然语言打印错误信息,因为读它的是人。标准库的组织方式,也是库作者自己觉得好记的方式。

Zero 的出发点不同。它的主要读者是 AI 智能体,也就是代替某个人编写、调试和修复代码的语言模型。人类仍然参与其中,但这门语言从第一天起就把智能体当作一等用户。这一个转变,几乎影响了这门语言每一个看得见的特性。

Zero 由 Vercel Labs 开发,官网是 zerolang.ai,源代码开源在 github.com/vercel-labs/zero。源文件以 .0 结尾。

这段代码里的五样东西:pub、World、raises、check,以及显式的 world.out.write,已经能说明 Zero 的很多设计思路。下面我们逐个拆解。

“一切都是显式的”

Zero 文档里有一句非官方口号:一切都是显式的。这门语言刻意避开那些隐藏机制,它们让其他系统语言对人类来说很方便,对代码生成器来说却处处是坑:

  • 没有强制的垃圾回收器。
  • 没有隐藏的内存分配器。
  • 没有隐式的异步运行时。
  • 没有魔法全局变量:没有随处可用的 stdout,没有 process.env,没有隐式的文件系统访问。

函数只要接触外部世界,就必须在签名里体现出来。对人类来说这意味着多打不少字;但对一个正在推理函数到底做了什么的智能体来说,这是一份大礼。

用能力对象代替全局变量

Zero 处理 I/O 的方式最能体现这种理念。它没有全局的 print 函数。输出要通过运行时传给 main 的 World 值来完成:

pub fun main(world: World) -> Void raises {
    check world.out.write("hello\n")
}

如果调用栈深处的某个函数想写一行日志,就必须显式地把 World(或者某个范围更窄的能力对象)传给它。你只看函数签名,不看函数体,就能知道它会不会访问网络、文件系统或 stdout。这正是静态分析器(或者正在做代码审查的智能体)可以依赖的性质。

World 能力对象 会更深入地讲解这个思路。

用 raises 和 check 显式处理失败

可能失败的函数必须声明出来。调用可能失败的函数时,调用方必须明确处理。不会有悄悄抛出的错误:

validate 上的 raises { InvalidInput } 表示“这个函数可能因 InvalidInput 而失败”。调用处的 check 表示“如果失败了,就把错误向上传递”。你不可能不小心把错误丢掉:它要么出现在你的函数签名里,要么编译器会拦住你。完整内容请看 Raises 和 Check。

会和智能体对话的编译器

Zero 最与众不同的地方不是某个语法特性,而是编译器的输出。对一个有错误的程序运行 zero check --json,你会得到类似这样的结果:

{
    "ok": false,
    "diagnostics": [
        {
            "code": "NAM003",
            "message": "unknown identifier",
            "line": 3,
            "repair": { "id": "declare-missing-symbol" }
        }
    ]
}

它和普通编译器错误有三点不同:

  1. 稳定的错误码。 NAM003 今天表示“unknown identifier”,在下一个编译器版本里也还是完全相同的意思。智能体可以直接匹配错误码,不用解析英文句子。
  2. 结构化的修复元数据。 repair 字段给出编译器认为能解决这个错误的修复类型。智能体可以用 zero fix --plan --json 获取修复计划并应用它。
  3. 不需要解析自然语言。 关键在于,智能体不必去理解一条写给人看的消息,才能决定下一步做什么。

JSON 诊断 会详细讲解这种格式。

刻意保持小巧

Zero 的语法小而规整,精神上更接近早期的 C,而不是 Scala 或现代 C++ 这种包罗万象的语言。理由很实际:智能体应该能在一次会话中掌握整门语言,不会在边界情况上出错。

所以你会看到:

  • 声明函数只有一种方式(fun 或 pub fun)。
  • 绑定局部值只有一种方式(let)。
  • 积类型只有一种建模方式(shape),和类型只有一种(choice),普通枚举也只有一种(enum)。
  • 只有一种模式匹配结构(match)。
  • 早期版本的语言里只有一种循环结构(while)。

至少在现阶段,你找不到运算符重载、隐式转换、宏、装饰器,也不会有三种互相竞争的方式来表达同一个意思。这不是苦行,而是有意为之:让语言保持足够小,智能体就很少会选错写法。

Zero 不是什么

先说清楚预期:

  • 不是脚本语言。 Zero 编译成原生二进制文件。程序很小(文档提到可执行文件不到 10KB),也不需要附带运行时。
  • 不是 Rust,不是 Go,也不是 Zig。 它们的语法有共同的祖先,但优先级不同。Rust 用复杂的类型系统追求内存安全,Zero 则用刻意精简的类型系统追求让智能体容易学会。
  • 还不稳定。 Zero 还处于 1.0 之前。团队明确表示,只要有助于实现智能体优先的目标,就会引入破坏性变更。暂时不要把重要的事情押在它身上。
  • 不是 Vercel 部署平台的功能。 虽然出自 Vercel Labs,但 Zero 和 Next.js 或 Vercel 托管没有绑定关系。它是一门独立的系统语言。

什么时候值得现在试试 Zero

如果你对下面这些感兴趣,现在就可以试试 Zero:

  • 当设计约束来自智能体而不是人类时,一门语言会发生怎样的变化。
  • 不必采用某种研究型语言,就能体验基于能力对象的 I/O。
  • 看看把“结构化编译器输出”当作一等特性,而不是事后补充,会是什么样子。
  • 给一个正在积极演进的项目提供反馈,帮助 Vercel Labs 改进它。

如果你需要一门稳定的语言来做正式工作,想要成熟的库生态,或者需要 Rust、Go 那种水平的跨平台工具链,那就先别用它。

下一步:安装 Zero

下一篇文档会带你安装 Zero 工具链,并编译你的第一个程序。整个过程大约只需要一分钟。

常见问题

Zero 编程语言是什么?

Zero 是 Vercel Labs 推出的实验性系统编程语言,它的设计目标是让 AI 智能体和人类一样成为主要用户。它的语法小而规整,通过 World 能力对象让副作用显式化,编译器会输出结构化的 JSON 诊断和机器可读的修复计划,智能体可以直接据此行动。

Zero 是谁做的?是 Vercel 官方产品吗?

Zero 出自 Vercel Labs,也就是 Vercel 的研究部门。它是托管在 github.com/vercel-labs/zero 上的开放实验项目,不是稳定的 Vercel 产品。README 明确说明它还处于 1.0 之前的阶段,并提醒不要在生产环境或敏感数据上运行它。

Zero 是一门“智能体语言”吗?

是的。Zero 的核心目标就是设计一门让 AI 智能体(而不只是人类)能够可靠地阅读、生成、调试和修复代码的语言。从小而规整的语法,到编译器的 JSON 输出和 NAM003 这样稳定的错误码,一切设计都围绕这个目标展开。

Zero 源文件长什么样?

源文件使用 .0 扩展名。一个最小的程序是这样的:pub fun main(world: World) -> Void raises { check world.out.write("hello\n") }。World 参数是你用来做 I/O 的能力对象,raises 和 check 则让可能失败的操作变得显式。

Zero 可以用于生产环境吗?

不可以。Zero 还处于 1.0 之前,明确属于实验性质。编译器、标准库和语法都还在变化。团队建议只在隔离的环境中运行它:用它来学习、做原型和提供反馈,不要用它发布面向客户的软件。

Coddy 编程语言插图

和 Coddy 一起学编程

开始