zerolang:Vercel 造了一门给 AI Agent 写代码的编程语言
看完你会发现,你之前对"编程语言给谁用"的理解可能要更新了。
编程语言一直有两个用户:人和机器。zerolang 加了第三个——AI Agent。
这不是又一个"用 AI 写代码"的工具。zerolang(来自 Vercel Labs)从根本上重新思考了一个问题:如果一门语言的编译器原生暴露语义结构,Agent 能不能少猜一点、少错一点?
答案是一个实验性的 graph-first 编程语言,GitHub 上 4.7K Stars,Apache 2.0 协议。它用 C 写编译器,用 .0 作为源文件后缀,目前版本 v0.2.0。
本文提纲
- 核心问题:Agent 编辑代码为什么总出错
- Graph-First:源码是给人看的,图是给 Agent 用的
- 语言速览:
.0文件长什么样 - ProgramGraph:编译器直接暴露语义结构
- Checked Graph Edits:Agent 不再盲改代码
- Agent 工作流接口:编译器即开发工具
- 设计哲学与当前状态
核心问题:Agent 编辑代码为什么总出错
LLM 编辑代码的方式本质上是文本补丁——"把第 42 行到第 45 行替换成这段代码"。这种方式有几个致命弱点:
- 猜测引用关系:改了一个函数名,不知道哪些地方调用了它
- 过时的上下文:Agent 看到的代码可能已经被修改了,但它不知道
- 级联错误:改了类型签名,不知道下游有没有破坏
- 验证延迟:改完代码还得单独跑一遍编译器、linter、测试才知道对不对
每一步都是猜。猜错了就进入"改了又错、错了又改"的循环,token 烧了一大堆。
zerolang 的核心洞察:源码文本对人类友好,但对 Agent 来说是一个有损的接口。Agent 需要的不是代码文本,而是程序的语义结构。
Graph-First:源码是给人看的,图是给 Agent 用的
zerolang 的架构把"人看的"和"Agent 用的"分成两层:
MERMAID_BLOCK_0
关键设计决策:
- 源码仍然是唯一的真实来源(Source of Truth)。
.0文件是人审阅、审计、版本控制的 artifact - ProgramGraph 是编译器从源码派生的结构,不是独立的存储格式
- Agent 通过操作 Graph 来间接修改源码,编译器负责验证、重写、格式化
这不是"取代程序员",而是"让 Agent 在改代码的时候少犯错"。
语言速览:.0 文件长什么样
一个小程序:
fn answer() -> i32 {
return 40 + 2
}pub fn main(world: World) -> Void raises {
if answer() == 42 {
check world.out.write("math works\n")
}
}
几个值得注意的设计:
- 显式 fallibility:
raises关键字标记可能失败的函数 - 显式 capability:
world参数通过类型系统传递外部能力,不是全局变量 - 显式错误处理:
check关键字处理可能失败的操作 - 无分号:语句结尾不需要分号
语法故意设计得很"无聊"——容易索引、比较、格式化、审计和重新生成,同时仍然像正常代码一样可读。
ProgramGraph:编译器直接暴露语义结构
这是 zerolang 最核心的创新。Agent 不需要从文本推断程序结构,编译器直接告诉你:
zero graph dump examples/hello.0
输出:
zero-graph v1
origin source-text
module "hello"
hash "graph:b8a019041020df03"node #ea5ea1ca Function name:"main" type:"Void" public:true fallible:true
node #f9ce8b3e Param name:"world" type:"World"
node #421a4d4b MethodCall name:"write" type:"Void"
node #610c78bf Literal type:"String" value:"hello from zero\n"
edge #421a4d4b arg #610c78bf order:0
edge #ea5ea1ca body #6c48dda8
Agent 拿到的不是模糊的文本,而是精确的语义事实:
- Node ID:每个语法节点有唯一标识符,Agent 可以精确指向它
- Graph Hash:整个图的哈希值,用于检测上下文是否过时
- 类型信息:已解析的类型,不需要 Agent 猜测
- Effects/Ownership/Capabilities:副作用、所有权、能力约束全部显式化
Agent 可以从任意入口开始导航——一个符号、一个诊断、一个调用、一个模块——只拉取相关的语义切片,不用加载整个文件。
Checked Graph Edits:Agent 不再盲改代码
传统的 Agent 编辑流程:改文本 → 格式化 → 重新解析 → 编译检查 → 发现错误 → 再改。
zerolang 把这些步骤压缩成一个编译器中介的操作:
zero graph patch examples/hello.0 \
--expect-graph-hash graph:b8a019041020df03 \
--op 'set node="#610c78bf" field="value" expect="hello from zero\n" value="hello graph\n"'
这个命令做了什么:
- 验证 graph hash:如果源码已经变了(hash 不匹配),直接拒绝,防止过时编辑
- 验证 expect 值:如果目标字段的当前值和预期不一样,拒绝编辑
- 执行语义修改:在 Graph 层面修改 node
#610c78bf的value字段 - 编译器验证:验证修改后的 Graph 是否合法
- 重写源码:验证通过后才写回
.0文件 - 格式化 + 重新检查:确保输出是干净、可编译的代码
一个命令完成"验证 → 修改 → 写回 → 格式化 → 检查"全流程。 Agent 不再需要自己拼凑这些步骤。
对比传统方式:Agent 在 Python 项目里改一个函数名,需要自己 grep 所有引用、逐个替换、跑一遍 pytest、发现还有个 import 没改、再改、再跑。在 zerolang 里,重命名是一个语义操作——"把 Function node #ea5ea1ca 的 name 改掉",编译器负责找到所有相关引用并一起更新。
Agent 工作流接口:编译器即开发工具
zerolang 把 Agent 需要的所有接口都收进了编译器 CLI,每个命令都有结构化输出(--json):
| 命令 | 提供什么 |
|---|---|
zero skills get language |
随编译器版本匹配的语言规则 |
zero check --json |
诊断信息:错误码、span、expected/actual、修复建议 |
zero parse --json |
解析摘要:声明、函数签名、body 节点类型 |
zero graph --json |
模块、导入、公开符号、capabilities、effects |
zero graph dump |
确定性的 ProgramGraph 文本输出 |
zero graph patch |
带前置条件的 Checked Graph 编辑 |
zero fix --plan --json |
类型化的修复计划(只看不改) |
zero size --json |
体积报告、保留的 helpers、安全约束 |
当编译检查失败时,输出不只是"这里有错",而是结构化的诊断信息:
{
"code": "NAM003",
"message": "unknown identifier 'message'",
"expected": "visible local, parameter, function, or builtin",
"actual": "no matching visible symbol",
"repair": {
"id": "declare-missing-symbol"
}
}
Agent 拿到 repair.id,就能直接生成对应的修复方案:
zero explain --json NAM003
zero fix --plan --json examples/broken.0
诊断 → 解释 → 修复方案 → 应用修复,整条链路都有结构化 API。
还有一个巧妙的设计:zero skills 命令。编译器自带的技能文档(语言指南、诊断说明、stdlib 文档)和二进制文件版本匹配。Agent 不用担心参考了过时的文档——编译器本身就是最新版的"说明书"。
设计哲学与当前状态
zerolang 的设计目标明确指向系统和嵌入式场景:
| 目标 | 具体要求 |
|---|---|
| Token 效率 | 结构化输出减少 Agent 的 token 消耗 |
| 低内存 | 适合资源受限的运行环境 |
| 快速启动 | 编译器冷启动要快 |
| 快速编译 | Agent 反馈循环不能被编译时间拖慢 |
| 低运行时延迟 | 生成的二进制要快 |
| 零依赖 | 编译产物不依赖任何运行时库 |
标准库目前只有三个模块:math.0、path.0、str.0。支持编译到 Linux musl 静态二进制。语言层面有显式的 effects 系统、capability 传递、所有权约束。
但必须说清楚:zerolang 现在是实验阶段,作者明确说"安全漏洞是预期的"。不适合生产系统、敏感数据或关键基础设施。语法和 API 都不是稳定契约,随时可能有破坏性变更。
来自 Vercel Labs(Vercel 的研究团队),主要用 C 写编译器核心(约 280 万字符),JavaScript/TypeScript 做工具链和测试。这不是一个周末项目——它有完整的 conformance 测试、benchmark 套件和 command contract 测试。
zerolang 问了一个有意思的问题:如果编程语言的编译器从第一天起就为 AI Agent 提供一等公民的接口,代码生成会变成什么样?答案还在探索中,但方向值得关注。
觉得编程语言该为 AI Agent 改设计?还是 Agent 该学着适应现有语言?评论区聊聊。觉得有意思就点个赞让更多人看到。
作者: itech001
来源: 公众号:AI人工智能时代
网站: https://www.theaiera.cn/
每日分享最前沿的AI新闻资讯和技术研究。
本文首发于 AI人工智能时代,转载请注明出处。
