needhelp
← 返回博客

ZeroLang:当 Vercel 为 AI Agent 造了一门系统编程语言

作者 needhelp
ZeroLang
Vercel
系统编程
AI Agent
编程语言
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 工作流程

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.spanstd.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 最具辨识度的一个设计。传统语言的 printfconsole.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/i64u8/u16/u32/u64usize/isizef32/f64boolcharVoid。整数和浮点之间不会隐式转换,需要显式使用 as

let count: u32 = 0x12c_u32
let 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 使用,且匹配必须是穷尽的——如果 choiceokerr 两个分支,你必须都处理。这排除了整类运行时错误。

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 在作用域通过 returnbreakcontinue 退出时都会执行。这借鉴了 Zig 和 Go 的优秀设计,但 Zero 进一步规定:用户不能直接调用 value.drop(),以确保清理的确定性。

3.5 C 互操作与 Web 支持

ZeroLang 原生支持 C 互操作:

extern c "config.h" as config
extern 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

Terminal window
$ 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 内建了体积分析:

Terminal window
$ zero size --json examples/point.0

体积报告以 JSON 格式输出,让 Agent 能够追踪代码变更对产物大小的影响,并在超过阈值时自动发出警告。这与 Zero 的”小体积原生产物”定位完全一致——静态分发、显式能力、无强制 GC、无隐藏运行时开销

4.3 依赖图分析

Terminal window
$ zero graph --json examples/systems-package

zero graph 输出模块依赖的结构化图数据。对于 Agent 来说,这意味着它可以快速理解代码库的拓扑结构,识别循环依赖,或者在做重构时评估变更的涟漪效应。这通常需要 IDE 或专门工具(如 Rust 的 cargo-modules)才能实现的功能,在 Zero 中是编译器原生支持的。

4.4 Web 路由分析与 Skills 系统

Terminal window
$ zero routes --json examples/web/hello
$ zero skills get zero --full

zero 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 环境诊断

Terminal window
$ zero doctor --json

zero 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 需要的结构化输出。

维度RustZeroLang
内存安全所有权 + 借用检查器显式分配 + 能力系统
学习曲线陡峭中等
编译时间较慢较快(目标)
错误信息精美的人类可读文本人类可读 + 结构化 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 的 raisesWorld 能力让这一切显式化。第二是 结构化工具链——Zig 的编译器输出是为人类设计的,而 Zero 的 --json 模式是为 Agent 设计的。

Zig 的创作者 Andrew Kelley 将 Zig 定位为”更好的 C”,而 ZeroLang 的定位则是”面向 Agents 的系统语言”。这不是竞争关系,而是针对不同时代的互补设计。

Rust vs Zig 性能对比

各编程语言薪资对比,系统语言位于中上游 来源

5.3 为什么不是改造现有语言?

一个自然的问题是:为什么不给 Rust 或 Zig 添加 --json 输出模式,而是要造一门新语言?答案是语言设计决定论。Rust 的所有权系统虽然强大,但它的复杂性(生命周期标注、unsafe 块、异步运行时生态)对于 Agent 来说是一个巨大的认知负担。Zig 的显式性很好,但它的编译器架构和语言设计并没有从第一天就考虑 Agent 的需求。ZeroLang 的设计哲学——“如果函数接触外部世界,签名必须明说”——需要语言从语法层面就支持 effects 标注,这不是事后添加一个 CLI flag 就能实现的。


六、上手体验:从安装到第一个可执行文件

ZeroLang 的上手流程被设计得极为简洁。官方的安装脚本是一行 curl:

Terminal window
curl -fsSL https://zerolang.ai/install.sh | bash
export 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")
}

然后运行类型检查:

Terminal window
$ zero check hello.0

6.2 编译为原生可执行文件

Terminal window
$ zero build --emit exe --target linux-musl-x64 hello.0 --out .zero/out/hello

Zero 使用直接发射器(direct emitters),所以不需要外部 C 编译器。支持的原生目标包括 linux-musl-x64 等;WebAssembly 目标 wasm32-wasi 也是直接输出,不需要外部工具链。

6.3 项目管理

实际项目使用 zero.json 清单文件和 src/ 目录结构:

Terminal window
$ 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

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

分享本页