Skip to content

Zero (ZeroLang) — Vercel Labs 推出的 AI Agent 专属系统编程语言

Vercel Labs 推出的实验性系统编程语言,编译出不到 10KB 的原生二进制,但最大卖点是编译器输出和工具链从第一天起就为 AI Agent 的消费而设计。适合关注 AI Agent 编程基础设施和编程语言设计的开发者。

目录


为什么需要 Agent 专属语言

AI 编程的三个痛点

传统编译器和编程语言是为人类设计的,AI Agent 使用时会遇到三个系统性问题:

痛点 问题本质 AI 的困境
非结构化错误 编译器输出人类可读的自由文本 AI 必须解析非结构化文本,格式随版本变化就崩溃
工具链割裂 检查、构建、分析依赖、路由各用不同工具 AI 在多工具间切换,工作流脆弱低效
隐藏副作用 函数签名不暴露 I/O、全局状态 AI 难以推理隐藏的全局状态,追踪成本极高

解决思路

传统模式:
  人类写代码 → 编译器报错(人读文本) → 人类修 → 循环

AI Agent 模式(传统语言):
  AI 写代码 → 编译器报错(人读文本) → AI 解析文本(脆弱!) → 猜测修复 → 可能死循环

AI Agent 模式(Zero):
  AI 写代码 → 编译器输出 JSON → AI 拿到结构化诊断+修复计划 → 精准修复

核心洞察:不是让机器理解人类的模糊,而是用机器的精确赋能人类的创造。


核心设计哲学:Everything is Explicit

Zero 的三个"拒绝":

1. 拒绝隐藏分配器 (No Hidden Allocators)

需要内存分配的函数必须在签名中声明 Alloc capability,显式传入:

pub fun main(world: World) -> Void raises {
    let bytes: Span = 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")
    }
}

2. 拒绝隐式异步 (No Implicit Async)

完全拒绝 async/await。同步执行,执行流就是字面所写——没有复杂的异步状态机。

3. 拒绝魔法全局变量 (No Magic Globals)

所有 I/O 通过显式的 World capability 对象传入 main

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

传统语言 vs Zero 对比

维度 C / Rust / Python Zero
输出 隐式全局 (printf / println!) 显式 capability (world.out.write)
错误处理 异常 / 返回值 / 隐式传播 显式 check + raises
内存分配 隐式 GC 或默认分配器 显式 Alloc capability
异步 隐式 async/await 无隐式异步
全局状态 允许魔法全局变量 拒绝 — 签名必须声明

Agent-First 工具链

"Humans read the message. Agents read the JSON." — 同一个 CLI 同时服务人类和 Agent。

统一 CLI

所有操作集中在一个 zero 命令下:

zero check --json examples/hello.0    # 结构化诊断
zero run examples/add.0               # 运行
zero build --emit exe --target linux-musl-x64 examples/add.0 --out add
zero graph --json examples/systems-package   # 依赖图
zero size --json examples/point.0     # 二进制大小报告
zero routes --json examples/web/hello # 路由分析
zero skills get zero --full           # 技能查询
zero doctor --json                    # 环境诊断

Agent 修复循环专用命令

┌─────────────────────────────────────────────────────┐
│           AI Agent 修复循环 (Zero)                   │
│                                                     │
│  1. zero check --json                               │
│     → 结构化 JSON 诊断                               │
│     → 包含错误代码 (NAM003) + 行号 + 修复 ID         │
│                                                     │
│  2. zero explain <error-code>                        │
│     → 获取错误的结构化解释                            │
│     → 不需要爬网页/找文档                            │
│                                                     │
│  3. zero fix-plan --json                             │
│     → 机器可读的修复计划                              │
│     → 明确告诉 AI:第几行、改成什么                   │
│                                                     │
│  4. AI 执行修复 → 回到步骤 1                         │
└─────────────────────────────────────────────────────┘

结构化 JSON 诊断示例

{
  "ok": false,
  "diagnostics": [{
    "code": "NAM003",
    "message": "unknown identifier",
    "line": 3,
    "repair": { ... }
  }]
}

关键设计:稳定的错误代码(如 NAM003),不随版本变化格式,AI 的解析逻辑不会崩溃。


语言特性速览

基本语法

fun function_name(params: Type) -> ReturnType { ... }

类型系统i8/i16/i32/i64u8/u16/u32/u64usize/isizef32/f64boolcharVoid

无隐式转换,必须显式 as

let count: u32 = 0x12c_u32
let byte: u8 = count as u8

Effects System(能力基 I/O)

签名即能力合约。pub fun main(world: World) -> Void raises 声明了: 1. 接收 World capability → 可与外部世界交互 2. 返回 Void → 无有意义的返回值 3. 标记 raises → 可能失败

check 关键字处理可失败操作;使用 check 的函数必须声明 raises → 启用静态错误路径追踪

数据建模

// shape — 命名记录(可设默认值)
shape Point { x: i32, y: i32, }
shape Counter { value: i32 = 0, }

// enum — 固定名称集
enum Status { ready, failed, }

// choice — 带负载的标签联合(ADT)
choice Result { ok: i32, err: String, }

匹配必须穷尽

match result {
    .ok => value {
        check world.out.write("choice ok\n")
    }
    .err => message {
        check world.out.write("choice err\n")
    }
}

内存管理

无 GC、无 Rust 式借用检查器。Zig 风格的显式管理 + Agent 友好的简化:

类型 用途
Span 只读视图,零成本
MutSpan 显式可写视图
[N]T 固定长度数组
Maybe 可能为空的值
ref / mutref 显式引用可变性
owned 拥有值,作用域结束时自动清理
Alloc 分配器 capability
pub fun main(world: World) -> Void raises {
    defer cleanup()          // 确定性清理
    check world.out.write("work\n")
}

用户不能直接调用 value.drop() — 确保清理确定性。

C 互操作 & Web 支持

// C 互操作
extern c "config.h" as config
extern shape CConfig {
    enabled: bool,
    limit: i32,
}

// Web 路由
pub fun GET(req: Request) -> Response {
    return Response.text("hello from zero web\n")
}

范式转变:从人读到人+机共读

认知框架转变

传统思维:
  编程语言的受众 = 人类
  设计目标 = 人类可读性

新范式:
  编程语言的受众 = 人类 + AI Agent
  设计目标 = 人类可读性 + 机器可读性 + 机器可操作性

双轨制开发模式

┌─────────────────────────────────────────────┐
│              双轨制开发                       │
│                                             │
│  人类轨道:                                  │
│    高层逻辑设计、架构规划、业务决策           │
│                                             │
│  AI Agent 轨道:                             │
│    底层代码实现、错误诊断、自动修复          │
│                                             │
│  桥梁:                                      │
│    同时具备人类可读语法 + 机器可读工具链      │
│    的新一代编程语言(如 Zero)                │
└─────────────────────────────────────────────┘

最佳实践

  • ✅ 用 Agent-First 的工具链(JSON 诊断、结构化修复计划)提升 AI 编程效率
  • ✅ 函数签名暴露所有副作用 — 让 AI 能准确推理代码行为
  • ✅ 稳定的错误代码格式 — AI 的解析逻辑不随版本崩溃
  • ❌ 不要让 AI 解析非结构化的编译器输出 — 这是当前 AI 编程死循环的根源
  • ❌ 不要追求"像自然语言一样编程" — 自然语言的模糊性对机器是灾难

项目现状

项目 信息
仓库 github.com/vercel-labs/zero
许可证 Apache-2.0
最新版本 v0.1.2 (2026-05-16)
Stars ~981
语言构成 C 65.5% / JavaScript 28% / Shell 5.8%
编辑器 VSCode 扩展(.0 文件语法高亮)

实验性警告:语言尚未稳定,编译器、标准库、文档仍在变化中。

对未来的预测

视频观点(有道理但需理性看待):

预测 可能性 理由
Python/Rust 引入类似 JSON 诊断模式 这是工具链层面的改进,不涉及语法变更
整个 IDE 生态转向结构化诊断 LSP 已经在做类似的事,但 Zero 走得更远
Zero 成为系统编程主流 生态太新,需与 Rust/Zig/C 竞争
"Agent 专属语言"成为新品类 概念会被借鉴,但不一定是 Zero 胜出

参考资料

相关笔记

  • [[AI Agent]]
  • [[编程语言设计]]
  • [[Vercel]]
  • [[系统编程语言对比]]