ZeroLang:当 Vercel 为 AI Agent 造了一门系统编程语言
TL;DR:Vercel Labs 推出了实验性系统编程语言 Zero(文件扩展名
.0),定位是”面向 AI agents 的编程语言”。它围绕”一切显式”设计——无隐藏分配器、无隐式异步、无魔法全局变量——同时内建了面向 Agent 的工具链:结构化 JSON 诊断、产物体积报告、类型化修复元数据。如果你关心 AI 时代的编程语言演进,或者正在寻找一门能让 agents 和人类”共同阅读、修复、检查和发布”小型原生程序的语言,Zero 值得你的关注。
一、时代背景:AI Agent 正在重塑编程语言的需求
2025 到 2026 年,AI 编程助手已经不再是”代码补全工具”,而是正在演变为能够独立编写、调试和发布代码的 autonomous agents。Anthropic 的 2026 Agentic Coding Trends Report 指出,约 27% 的 AI 辅助工作 是过去根本不会去做的任务——构建交互式仪表盘、探索性实验、修复那些因为”不值得投入人力”而被长期忽视的 papercuts。工程师的角色正在从”亲自实现”转向”编排 agents”,而这对编程语言提出了全新的要求。

AI Agent 的典型工作循环:规划 → 执行(工具调用)→ 观察 → 记忆反思 来源
传统的系统编程语言——C、C++、Rust、Zig——都是为人类开发者设计的。它们的错误信息、编译器输出、文档格式,本质上都是”人类可读”的。但当 agents 开始大规模阅读和修改代码时,这些输出对于机器来说往往过于自由文本化了。Agent 需要结构化的诊断信息、可预测的内存模型、明确的函数契约——它不需要漂亮的错误提示,它需要的是能直接解析的 JSON。
这正是 ZeroLang 试图解决的问题。它的口号非常直接:“The programming language for agents”——一门人类与 AI agents 可以共同阅读、修复、检查和发布小型原生程序的系统语言。
二、ZeroLang 的设计哲学:一切显式,从零开始
ZeroLang 的核心设计哲学可以用一句话概括:“Everything is explicit.” 这听起来像是系统编程语言的共同追求,但 Zero 把它推到了一个极致——而且是为 Agent 场景量身定制的极致。
2.1 无隐藏分配器
在大多数现代语言中,内存分配或多或少都带有”魔法”色彩。Go 有垃圾回收器在后台默默工作;Rust 虽然要求显式管理,但标准库中的很多操作仍然会隐式分配;甚至连以”显式”著称的 Zig,std.debug.print 也会在幕后使用一个全局分配器。ZeroLang 的态度是:如果函数进行了内存分配,签名必须明说。你需要显式传入一个 Alloc 能力,使用 owned<T> 来管理资源生命周期,而 std.mem.span、std.mem.len 这类 helpers 都是零分配的。
pub fun main(world: World) -> Void raises { let bytes: Span<u8> = std.mem.span("zero") let view = BufferView { bytes: bytes } if std.mem.len(view.bytes) == 4 && view.bytes[0] == 122 { check world.out.write("span ok\n") }}这段代码来自官方示例 examples/memory-package。注意它使用了 Span<u8> 来表示一个只读的连续内存视图,完全没有触及分配器。对于 Agent 来说,这种”分配自由”(allocation-free)的代码路径意味着更可预测的行为和更小的产物体积。
2.2 无隐式异步
JavaScript 的 async/await 彻底改变了前端开发,但也带来了”颜色问题”——同步代码和异步代码无法自由混合。Rust 的异步生态虽然强大,但 .await 的传染性让整个代码库都不得不染上异步的颜色。ZeroLang 选择了完全不支持隐式异步。如果你的函数不会阻塞,它就是同步的;如果需要并发,你需要显式地表达它。这种简化对于 agents 来说是一种福利:Agent 不需要推理复杂的异步状态机,代码的执行流程就是字面上的流程。
2.3 无魔法全局变量
这是 ZeroLang 最具辨识度的一个设计。传统语言的 printf、console.log、甚至 Rust 的 println! 都依赖于某种全局或线程局部的输出句柄。ZeroLang 的 main 函数签名长这样:
pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n")}注意 world: World 这个参数。在 Zero 中,程序不是从一个隐式的全局环境中启动的;运行时显式地传入一个 World 能力对象,而所有与外部世界的交互——写输出、读文件、访问网络——都必须通过这个能力对象来进行。如果函数想要写输出,它必须在签名中请求 World;如果可能失败,必须标记 raises。这种设计让 Agent 能够静态地、完整地理解一个函数的副作用边界,而不需要深入分析函数体。
| 特性 | 传统语言 | ZeroLang |
|---|---|---|
| 输出操作 | 隐式全局(printf/println!) | 显式能力(world.out.write) |
| 错误处理 | 异常/返回值/隐式传播 | 显式 check + raises 标记 |
| 内存分配 | 隐式 GC 或默认分配器 | 显式 Alloc 能力 |
| 异步操作 | 隐式 async/await | 不支持隐式异步 |
| 全局状态 | 允许魔法全局变量 | 拒绝——签名必须说明 |
三、语言特性深度解析:一门为 Agent 设计的系统语言
ZeroLang 的语法整体上是一种类 Rust/Zig 的静态类型系统语言,但做了大量针对 Agent 场景的简化和特化。文件扩展名是 .0——这可能是编程语言史上最简洁的扩展名之一。
3.1 基础语法:显式且简洁
Zero 的函数签名遵循一种清晰的模式:
fun 函数名(参数: 类型) -> 返回类型 { ... }pub 用于导出(public),fun 声明函数,返回类型用 -> 标记。基本类型包括 i8/i16/i32/i64、u8/u16/u32/u64、usize/isize、f32/f64、bool、char 和 Void。整数和浮点之间不会隐式转换,需要显式使用 as:
let count: u32 = 0x12c_u32let byte: u8 = count as u8这种”拒绝隐式转换”的态度贯穿整个语言设计。对于 Agent 来说,这意味着更少的意外行为和更明确的类型边界。
3.2 Effects 系统:Capability-based I/O
ZeroLang 的 effects 系统是它最硬核的技术特性之一。函数签名不仅仅是类型签名,还是能力契约(capability contract)。main 函数的完整签名 pub fun main(world: World) -> Void raises 告诉我们三件事:
- 它接收一个
World能力,说明它可能需要与外部世界交互 - 它返回
Void,即没有有意义的返回值 - 它标记了
raises,说明它可能失败
check 关键字用于处理可能失败的操作。world.out.write(...) 可能失败(比如输出句柄关闭),所以调用它时必须使用 check,而使用 check 的函数又必须在签名中声明 raises。这种错误传播的显式链条让 Agent 能够完全静态地追踪失败路径。
3.3 数据建模:shape、enum 与 choice
Zero 提供了三种主要的数据构造方式:
shape 用于具名记录(类似 struct):
shape Point { x: i32, y: i32,}Shape 支持字段默认值:shape Counter { value: i32 = 0, }。字段名在构造时必须显式指定:Point { x: 40, y: 2 }。
enum 用于固定名称集合:
enum Status { ready, failed,}choice 是 Zero 的代数数据类型(ADT),用于表示”带载荷的或”:
choice Result { ok: i32, err: String,}choice 配合 match 使用,且匹配必须是穷尽的——如果 choice 有 ok 和 err 两个分支,你必须都处理。这排除了整类运行时错误。
match result { .ok => value { if value == 42 { check world.out.write("choice ok\n") } } .err => message { check world.out.write("choice err\n") }}3.4 内存管理:可预测且显式
ZeroLang 没有垃圾回收器,也没有 Rust 那样的所有权/借用检查器。它的内存模型更接近 Zig 的显式管理,但做了更多面向 Agent 的简化。
核心内存类型包括:
Span<T>:只读视图,零成本抽象MutSpan<T>:显式可写视图[N]T:定长数组Maybe<T>:可能不存在的值ref<T>/mutref<T>:显式引用可变性owned<T>:拥有所有权的值,作用域结束时自动清理(如果定义了drop)Alloc:分配器能力
defer 用于作用域退出时的清理:
pub fun main(world: World) -> Void raises { defer cleanup() check world.out.write("work\n")}defer 在作用域通过 return、break、continue 退出时都会执行。这借鉴了 Zig 和 Go 的优秀设计,但 Zero 进一步规定:用户不能直接调用 value.drop(),以确保清理的确定性。
3.5 C 互操作与 Web 支持
ZeroLang 原生支持 C 互操作:
extern c "config.h" as configextern shape CConfig { enabled: bool, limit: i32,}Web 方面,Zero 支持编译为 wasm32-web 目标,并通过路由导出 HTTP handlers:
pub fun GET(req: Request) -> Response { return Response.text("hello from zero web\n")}zero routes --json 可以输出路由清单和 Web bundle 审计元数据,包括浏览器安全的能力限制、请求/响应表面和 bundle 导入信息——这些都是 Agent 可以直接消费的结构化数据。
四、Agent-first 工具链:不只是编译器,更是 Agent 的 IDE
如果说 ZeroLang 的语言设计解决了”Agent 如何理解代码”的问题,那么它的工具链则解决了”Agent 如何与代码交互”的问题。官方文档中有一句话精准地概括了这种设计意图:
“Humans read the message. Agents read the JSON. The same CLI surfaces diagnostics, repair metadata, graph facts, and size reports.”

Zig、Rust、Go 等系统语言的特性对比 来源
4.1 结构化 JSON 诊断
传统编译器的错误信息是为人类阅读的——漂亮的颜色、建议的修复、上下文提示。Zero 的 CLI 同样提供人类可读的错误信息,但同时输出结构化的 JSON:
$ zero check --json{ "ok": false, "diagnostics": [{ "code": "NAM003", "message": "unknown identifier", "line": 3, "repair": { "id": "declare-missing-symbol" } }]}每个诊断包含稳定的错误代码(如 NAM003)、位置信息、期望/实际类型对比、帮助文本、修复安全性评估,以及类型化的修复元数据。Agent 不需要解析自由文本错误信息,它可以直接根据 repair.id 决定下一步操作——比如自动生成缺失的符号声明。
4.2 产物体积报告
对于系统编程语言来说,二进制体积是一个关键指标,尤其是在边缘计算和 Serverless 场景。Zero 内建了体积分析:
$ zero size --json examples/point.0体积报告以 JSON 格式输出,让 Agent 能够追踪代码变更对产物大小的影响,并在超过阈值时自动发出警告。这与 Zero 的”小体积原生产物”定位完全一致——静态分发、显式能力、无强制 GC、无隐藏运行时开销。
4.3 依赖图分析
$ zero graph --json examples/systems-packagezero graph 输出模块依赖的结构化图数据。对于 Agent 来说,这意味着它可以快速理解代码库的拓扑结构,识别循环依赖,或者在做重构时评估变更的涟漪效应。这通常需要 IDE 或专门工具(如 Rust 的 cargo-modules)才能实现的功能,在 Zero 中是编译器原生支持的。
4.4 Web 路由分析与 Skills 系统
$ zero routes --json examples/web/hello$ zero skills get zero --fullzero routes 分析 Web 路由的表面和 bundle 导入信息;zero skills 则输出 Zero 语言的能力描述——这些描述遵循 Vercel 的 Agent Skills 规范,可以直接被 Claude Code、Cursor、Codex 等 17+ 种 AI 编程助手消费。Vercel 在 2026 年 1 月推出的 skills.sh 生态已经迅速积累了 200+ skills,其中 Vercel 官方的 React Best Practices skill 获得了 26,000+ 次安装。Zero 的 skills 命令将这种生态直接内建于语言工具链中。
4.5 环境诊断
$ zero doctor --jsonzero doctor 检查 PATH 健康度、工作区写权限、捆绑目标支持、目标 SDK/sysroot 就绪状态、互操作工具就绪状态。--json 版本输出 targetToolchains——一个按目标划分的就绪矩阵。对于 Agent 来说,这意味着在尝试构建之前,它就能知道环境是否就绪,以及缺少哪些依赖。
| CLI 命令 | 人类用途 | Agent 用途 |
|---|---|---|
zero check --json | 类型检查 | 解析结构化诊断,自动修复 |
zero size --json | 查看产物体积 | 追踪体积回归,触发告警 |
zero graph --json | 查看依赖图 | 理解代码拓扑,规划重构 |
zero routes --json | 查看 Web 路由 | 分析 API 表面,生成文档 |
zero skills get | 查看语言描述 | 注入 Agent Skills 上下文 |
zero doctor --json | 环境检查 | 预检构建环境,自动安装依赖 |
五、与 Rust、Zig 的对比:ZeroLang 站在谁的肩膀上?
要真正理解 ZeroLang 的定位,必须把它放在系统编程语言的谱系中来看。
5.1 与 Rust 的对比
Rust 是近十年来最成功的系统编程语言之一,连续 8 年 在 Stack Overflow 开发者调查中被评为”最受赞赏的语言”。Rust 的核心卖点是内存安全——通过所有权和借用检查器在编译时消除整类运行时错误。但 Rust 的学习曲线是臭名昭著的陡峭,编译时间也常常让人诟病。
ZeroLang 与 Rust 的根本区别在于目标用户不同。Rust 是为人类系统程序员设计的,它的错误信息极其精美(甚至有点话痨),生命周期标注虽然强大但增加了认知负担。ZeroLang 则是为人类和 Agent 共同设计的——它保留了静态类型和内存安全的基本保证,但简化了所有权模型(没有生命周期标注),同时增加了 Agent 需要的结构化输出。
| 维度 | Rust | ZeroLang |
|---|---|---|
| 内存安全 | 所有权 + 借用检查器 | 显式分配 + 能力系统 |
| 学习曲线 | 陡峭 | 中等 |
| 编译时间 | 较慢 | 较快(目标) |
| 错误信息 | 精美的人类可读文本 | 人类可读 + 结构化 JSON |
| Effects 系统 | 无原生支持 | Capability-based I/O |
| 产物体积 | 较大(Hello World ~280KB) | 较小(目标:~7KB 级别) |
| Agent 工具链 | 需第三方(rust-analyzer 等) | 原生内建 |
5.2 与 Zig 的对比
Zig 可能是 ZeroLang 最亲近的”表亲”。两者都强调显式性、拒绝隐藏控制流、都使用 defer 进行作用域清理、都没有垃圾回收器。Zig 的哲学是”专注于调试你的应用程序,而不是调试你对编程语言的知识”,这与 Zero 的”一切显式”有异曲同工之妙。
但 ZeroLang 在 Zig 的基础上做了两个关键的 Agent 向扩展。第一是 effects 系统——Zig 的函数签名不会告诉你它是否会失败、是否会分配内存、是否会访问文件系统;Zero 的 raises 和 World 能力让这一切显式化。第二是 结构化工具链——Zig 的编译器输出是为人类设计的,而 Zero 的 --json 模式是为 Agent 设计的。
Zig 的创作者 Andrew Kelley 将 Zig 定位为”更好的 C”,而 ZeroLang 的定位则是”面向 Agents 的系统语言”。这不是竞争关系,而是针对不同时代的互补设计。

各编程语言薪资对比,系统语言位于中上游 来源
5.3 为什么不是改造现有语言?
一个自然的问题是:为什么不给 Rust 或 Zig 添加 --json 输出模式,而是要造一门新语言?答案是语言设计决定论。Rust 的所有权系统虽然强大,但它的复杂性(生命周期标注、unsafe 块、异步运行时生态)对于 Agent 来说是一个巨大的认知负担。Zig 的显式性很好,但它的编译器架构和语言设计并没有从第一天就考虑 Agent 的需求。ZeroLang 的设计哲学——“如果函数接触外部世界,签名必须明说”——需要语言从语法层面就支持 effects 标注,这不是事后添加一个 CLI flag 就能实现的。
六、上手体验:从安装到第一个可执行文件
ZeroLang 的上手流程被设计得极为简洁。官方的安装脚本是一行 curl:
curl -fsSL https://zerolang.ai/install.sh | bashexport PATH="$HOME/.zero/bin:$PATH"zero --version安装器从 GitHub release 下载匹配的二进制文件,验证校验和,然后写入 $HOME/.zero/bin/zero。在 Linux 上默认安装静态 musl 构建;如果需要 glibc 版本,可以设置 ZERO_LINUX_FLAVOR=gnu。
6.1 第一个程序
创建一个 hello.0 文件:
pub fun main(world: World) -> Void raises { check world.out.write("hello from zero\n")}然后运行类型检查:
$ zero check hello.06.2 编译为原生可执行文件
$ zero build --emit exe --target linux-musl-x64 hello.0 --out .zero/out/helloZero 使用直接发射器(direct emitters),所以不需要外部 C 编译器。支持的原生目标包括 linux-musl-x64 等;WebAssembly 目标 wasm32-wasi 也是直接输出,不需要外部工具链。
6.3 项目管理
实际项目使用 zero.json 清单文件和 src/ 目录结构:
$ zero new cli hello$ cd hello$ zero check .$ zero test .$ zero run .$ zero build --target linux-musl-x64 --out .zero/out/hello .zero.json 示例:
{ "package": { "name": "systems-package", "version": "0.1.0" }, "targets": { "cli": { "kind": "exe", "main": "src/main.0" } }}6.4 VS Code 支持
ZeroLang 提供了官方的 VS Code 语法高亮扩展,位于 extensions/vscode/ 目录。.0 文件的语法高亮让你在编辑 Zero 代码时有良好的视觉体验。
七、项目现状:实验性但野心勃勃
必须强调的是,ZeroLang 目前处于实验性状态。官方文档的开篇就明确说明:“The compiler, standard library, docs, and examples are useful for trying the language and giving feedback, but the language is not stable yet.”
7.1 仓库结构
ZeroLang 的 GitHub 仓库 vercel-labs/zero 采用了清晰的分层结构:
| 目录 | 内容 |
|---|---|
native/zero-c/ | C 语言编写的原生编译器(当前主力编译器) |
compiler-zero/ | Zero 自编写的编译器源码(自举目标) |
examples/ | 按概念分组的示例程序 |
docs-site/ | 文档站点源码 |
conformance/ | 语言与 CLI 行为测试固件 |
tests/ | TypeScript 编写的 CLI 行为测试 |
extensions/vscode/ | VS Code 语法高亮插件 |
7.2 自举之路
native/zero-c/ 是当前的编译器实现,用 C 编写;而 compiler-zero/ 则是用 Zero 语言自身编写的编译器源码——这是语言成熟度的终极试金石。**自举(self-hosting)**意味着一门语言强大到足以编写自己的编译器。从 C 编译器过渡到 Zero 自编译器,将是 ZeroLang 发展路线图上的一个重要里程碑。历史上,Zig 用了数年时间完成自举,而 Zeta 语言在 2026 年 1 月宣布实现自举时引起了不小轰动——Zeta 编译器编译自己仅需 14 毫秒。ZeroLang 是否会走类似的路径,值得持续关注。
7.3 Vercel 的 Agent 生态布局
ZeroLang 不是 Vercel 在 Agent 领域的唯一布局。2026 年 1 月,Vercel 推出了 skills.sh——一个面向 AI Agent 的”npm”,让开发者可以用 npx skills add vercel-labs/agent-skills 的方式为 Claude Code、Cursor 等 Agent 安装最佳实践技能包。上线几小时内就获得了 20,000+ 安装量,React Best Practices skill 达到 26,000+ 安装。Stripe、Expo、Remotion 等知名项目也在上线当天发布了自己的 skills。

Vercel 的 agent-skills 已获得 76.4K+ 总安装量 来源
ZeroLang 的 zero skills get zero --full 命令直接集成在这个生态中——Agent 可以在开始编写 Zero 代码之前,先”阅读”语言的完整技能描述,了解最佳实践和常见模式。
八、未来展望:Agent-native 编程的先锋
ZeroLang 的出现,标志着一个更大趋势的开端:编程语言正在从”人类专用”向”人机共享”演进。这不是说人类不再需要理解代码,而是说代码和工具链的输出需要同时服务于两种消费者——有直觉和创造力的人类,以及有速度和耐力的 Agent。
8.1 对 AI Agent 开发者的意义
如果你是 AI Agent 的开发者或研究者,ZeroLang 提供了一个理想的实验场:
- 可预测的语义:没有隐式异步、没有隐藏分配、没有魔法全局变量,Agent 的行为预测变得简单
- 结构化交互:编译器输出是 JSON,Agent 可以直接消费,不需要 NLP 解析错误信息
- 体积可控:小型原生产物,适合边缘部署和 Serverless 场景
- C 互操作:可以复用现有的 C 库生态
8.2 对系统编程爱好者的意义
如果你对传统系统编程语言感兴趣,ZeroLang 是一个观察”后 Rust/Zig 时代”语言设计的窗口。它在 Zig 的显式性和 Rust 的类型安全之间找到了一个有趣的平衡点,同时添加了面向 Agent 的创新(effects 系统、结构化工具链)。即使你不打算在生产中使用 Zero,它的设计决策也值得深入思考。
8.3 风险与不确定性
作为实验性项目,ZeroLang 面临诸多不确定性。语言规范尚未稳定,生态几乎为零,自编译器还在开发中,社区规模也远不及 Rust 或 Zig。Vercel Labs 的历史项目有些成为了行业标准(如 Next.js),也有些逐渐淡出。ZeroLang 能否从实验走向生产,取决于它能否在语言稳定性、生态建设和社区 adoption 上取得突破。
结语:从零开始,面向未来
ZeroLang 的名字本身就蕴含了一种哲学——“Start with zero”。从零开始,没有历史包袱;从零开始,一切显式;从零开始,人类与 Agent 站在同一起跑线上。
在 AI 迅速改变软件开发的 2026 年,编程语言的设计范式正在发生深层变革。我们不再仅仅问”这门语言对人类友好吗?“,还要问”这门语言对 Agent 友好吗?” ZeroLang 是首批系统性地回答这个问题的语言之一。它的 effects 系统、capability-based I/O、结构化工具链,都是为了让代码成为人类与 Agent 之间的”通用语”。
无论 ZeroLang 最终能否成为主流,它都代表了一个重要的方向:未来的编程语言,必须是 human-native 和 agent-native 的。从这个角度看,ZeroLang 的实验价值已经远超它当前的代码行数。
如果你感兴趣,不妨花十分钟安装它,运行一个 hello.0,然后看看 zero check --json 的输出。你可能会发现,编程语言的未来,比想象中来得更快。
ZeroLang 官方网站:zerolang.ai | GitHub:github.com/vercel-labs/zero | 安装:curl -fsSL https://zerolang.ai/install.sh | bash