Vercel 开发了一门编程语言

BBetter Stack
Computing/SoftwareInternet Technology

Transcript

00:00:00Vassel 刚刚发布了一种名为 Xero 的新编程语言,据说它的
00:00:03独特之处在于,它是完全从头构建 country 的,旨在让
00:00:07人类和 AI 智能体可以共同构建轻量级的原生程序。但这不是我们一直在做的事吗?
00:00:12那么,到底是什么让它更好,这真的是个好主意,还是说它只是另一个
00:00:16几个月后就无人问津的业余项目?让我们一探究竟。
00:00:25Xero 是一种像 Rust 或 Zig 那样的系统语言,所以也许有一天 Bun 可以用它来重写。
00:00:30据我所知,它的核心理念是现有的语言都是为人类设计的。
00:00:34因此我们去阅读错误信息、警告和堆栈追踪,但 AI 在处理
00:00:38结构化数据时表现要好得多。所以 Xero 的整个工具链在设计时就考虑到了这一点,
00:00:43这意味着该编译器生成的任何内容都可以输出为 JSON。
00:00:46单凭这几点,再加上这个网站上那些显然由 AI 撰写的句子,
00:00:51我目前对它存在的必要性以及实际效果依然持怀疑态度,
00:00:56不过我把观点留到最后再说。首先我们先来探索一下这门语言本身,
00:00:59因为说实话,它还是挺酷的。我们将从经典的“学习一门
00:01:03新语言”的项目开始,即打印一个非常简单的字符串。这大部分都挺容易理解的。
00:01:08我们有一个公共的 main 函数作为这个程序的入口点。这个函数将返回
00:01:12void,在里面我们会打印一个字符串。但正是这个字符串
00:01:16被打印的方式,向我们展示了它的前几个特性。我们正在使用 world 能力(capability)。如果你在进行
00:01:21任何 I/O 操作(比如文件操作、打印、网络调用或任何 I/O 副作用)时,都需要这个能力,
00:01:26这正是这门语言所崇尚的“显式原则”的一部分。
00:01:31如果一个函数拥有 world 能力,这就直接表明它会执行某些 I/O 操作,
00:01:37如果它没有,则意味着它完全没有 I/O 副作用。
00:01:40world 能力还允许编译器在编译时根据目标平台拒绝不可用的能力,
00:01:45而不是等到运行时。所以如果你尝试在此函数中访问文件系统,并尝试编译为 WebAssembly,
00:01:50并在此时尝试构建 WebAssembly 版本,编译器会在第一时间报错,
00:01:54这样你后续就绝对不会被运行时的错误杀个措手不及。
00:01:57除了 world 能力之外,在这个程序中我们还用到了一些关键字。
00:02:00例如这里的 check,它是用来处理错误的。如果一个函数可能会失败,
00:02:05你可以用 raises 来标记它,然后用 check 来传递该错误。这非常类似于
00:02:09Rust 的问号操作符(?),只不过它是一个关键字。这就是我们在 Xero 中
00:02:13编写第一个程序所需知道的一切,现在我们可以通过执行 `xero run hello.xero` 来运行它了。
00:02:19注意,这是 Xero 语言的文件扩展名。如果我此时按下回车,
00:02:23你可以看到它输出了:hello,快来订阅 Betastack。你绝对应该点个订阅。
00:02:26不过,让我们从 hello 程序继续往下看,既然大家现在显然都是 Xero 专家了,
00:02:30这门语言确实提供了一些基础的原生类型来满足你开发基本应用的需求。
00:02:34所以我在这里写了一个新程序,它只是一个用于分类输入是文本、
00:02:39数字还是混合内容的随机小应用。你可以看到它使用了一些特性,比如标准库,
00:02:43这里有枚举(enums),有形状(shapes,非常类似于结构体 structs),然后还有那些
00:02:47你所期望的常规语言特性,比如 if 语句,下面还有一个 while 语句,你也可以
00:02:52使用 for 循环,再往下还有 match,它基本上就像是你的 switch 语句。
00:02:56所以没有什么太让人意外或新奇的东西。当涉及到内存等更高级的概念时,Xero 同样
00:03:00要求一切都必须是显式的。所以我们有用于可写视图的可变 spans,也有用于
00:03:05只读视图的 spans,在这里我们还有一个 owned(所有权)类型。这基本上是说这个值
00:03:10在这里被所有,当它超出作用域时就会运行 drop 函数。我们在
00:03:14这里的 shape 上自己定义了 drop 函数,所以这就是我们放置清理逻辑的地方。另一种
00:03:18可以实现这一点的方法是使用 defer 关键字,并在后面接一个函数。这基本上
00:03:22意味着当这个函数执行完毕并超出作用域时,随后运行这个延迟函数。所以它
00:03:26基本上具备了你今天开发一个非常基础的应用所需的一切,虽然还有一些其他特性,
00:03:31但我不太想把它变成一个编程教程。不过你可以尽管在你的简历上写上
00:03:35你拥有“三分钟的 Xero 经验”。闲话少叙,现在让我们专注于
00:03:39我认为 Xero 真正的卖点上,那就是它的工具链以及它是为 AI 智能体而建的这一事实。
00:03:44想象一下,一个 AI 智能体写了一些 Xero 代码,并引入了一些 Bug。他们声称
00:03:49在大多数语言中,你只会得到一大堆文本,而那些错误信息是专门设计给人类阅读的。
00:03:54在 Xero 中,你确实可以获取人类可读的错误提示,它看起来大概是这样的,
00:03:58但你可以看到那并不是结构化的输出。因此,他们确保了在
00:04:02工具链的每个部分都提供一个 JSON 选项。所以如果我们再次运行相同的函数,
00:04:07但这次使用 JSON 选项,并且我还通过管道把它传给 JQ,好让它在终端里看起来更美观一些,
00:04:12你可以看到我们得到了一个非常漂亮的结构化输出错误信息。里面包含了诸如
00:04:16严重级别(severity)、代码(code)和消息(message)等诊断信息。我们能看到错误发生的位置、期望值以及
00:04:21实际值。然后还有一些专门给 LLM 提供的帮助提示,以及一个修复安全(fix safety)字段,
00:04:26提示这是否需要人工审查,接着是关于如何修复该问题的信息。所以
00:04:31它只是试图向 LLM 提供足够的上下文,以便其能够自行修复。另一个很好地展示了这一点的
00:04:35命令是 `xero fix`。这里我配合使用了 plan 模式以及 JSON 选项,同时也
00:04:40把它通过管道传给 JQ,以便在我们的终端中显得整洁。当我按下回车时,它基本上
00:04:44对我提供给它的那个分类出错的文件进行了诊断,它大体上指出了
00:04:49我需要做什么才能真正修复这个文件。你可以看到我们得到了一个结构化的输出,其中的字段
00:04:53基本上只有 LLM 才需要知道,比如安全级别、模式、应用、编辑。我们在下面
00:04:58还有诸如自托管修复策略之类的东西。接着就是诊断(diagnostics)部分,它和我们
00:05:03在 `xero check` 命令中看到的几乎一样,而且在下方我们还看到了针对该错误代码本身的修复方案。
00:05:07那么,这通常是怎么修复 country 的呢?其核心理念的一部分似乎是:如果这门语言
00:05:12能在需要的时候提供自己的文档会怎样。这样如果我们让 LLM 去处理这门新语言,
00:05:17它其实不需要查阅任何文档或运用现有的技能,它只需要
00:05:21在实际需要时从工具链中获取足够的信息即可。为了测试这一点,我把
00:05:25我们那个出错的文件放在了一个全新的目录里,该目录没有任何关于 Xero 语言的信息,然后
00:05:30我直接要求 Claude 去修复那个出错的文件,同时也给它提供了进行这些
00:05:34诊断所需的命令,因为它的确需要一些关于如何使用该工具链的信息。接下来
00:05:38我们就可以看看 Claude 是否真的能修复这个文件了。瞧,经过 31 秒后,它成功
00:05:43修复 country 了文件里的所有错误,而我实际上故意引入了三个错误,它全找出来
00:05:47并修好了。我们可以向上滚动看看它是怎么做到的。它其实就是运行了
00:05:51我给它的那个 `xero fix` 命令。这次我们得到了 `ok: true`,所以它由此知道已经
00:05:56没有错误留下了。如果我们向上滚动,可以看到它对代码做出了一些修改,它之所以能做到,是因为
00:06:00在前面的步骤中它运行了 `xero fix`,并获得了关于如何精确修复该问题的具体信息,
00:06:05它对我们存在的全部三个问题都如法炮制。所以它之前完全没有
00:06:10关于 Xero 语言的先验信息,它没有使用任何网页搜索之类的方法去获取文档,
00:06:14它仅仅使用了工具链以结构化输出形式提供的信息。我对此
00:06:18其实感到有一点惊艳。这是一门全新的语言,但多亏了
00:06:22这门语言的构建方式,LLM 依然能够对其进行调试。但我心中不免有些疑问:这真的是创新吗?我是说
00:06:28我明白所谓的卖点在于错误提示以及工具链中的一切都具有结构化
00:06:31输出,但这并不是什么新概念,我们拥有结构化的错误提示已经几十年了。我是说
00:06:37你看这个,我用 Rust 构建了一个大致相同的分类程序,它也有类似的错误,
00:06:41我可以直接要求以 JSON 形式输出。我真的不太确定我们是否需要为此专门构建
00:06:46一整门语言,如果你认为其中的信息存在缺失,也许你只需要改进现有的语言就好了。
00:06:51而且我也非常肯定,如果我把那段写错的 Rust 代码拿给 Claude 并让他去修复,
00:06:55他也能轻而易举地做到,而且即使在没有使用结构化输出的情况下也行。
00:07:00我觉得 LLM 在处理普通错误消息时已经做得相当不错了,或者也可能只是我还没
00:07:05遇到过那样的痛点。除此之外,还有一个事实是 LLM 已经在大量现有的
00:07:10编程语言(比如 Rust)上进行了训练,所以它在调试这些语言时会非常得心应手,
00:07:14并且在其训练数据中有着丰富的示例,但对于 Xero 而言,它完全没有任何现成数据。当然这并不意味着
00:07:19你永远不该尝试去推出一门新语言,它只是意味着如果你在构建一个复杂的应用,你不会去
00:07:24选择 Xero。不过老实说,他们本来也没有把它当作那种定位来推广。
00:07:28总的来说,我认为这只是一个有趣的尝试,如果说它证明了什么,那就是它确实表明了你
00:07:32可以在不让 LLM 接受该语言训练的情况下,依然构建一门新语言并为它们提供所需的上下文,
00:07:37但我只是不太确定这是否有其必要。当然,这并不是说这门语言
00:07:42本身不够酷。正如我所说,它用起来其实还算不错,而且编译出来的
00:07:47体积也很漂亮。我只是怀疑自己是否会放着像 Rust、Zig 或 Go 这样成熟的语言不用,转而去
00:07:51选择使用它。我相信对于这个话题大家会有很多不同的看法,所以在下方的评论区
00:07:55让我知道你们的想法吧,或者顺手点个订阅,一如既往,我们下期视频再见。

Key Takeaway

Vercel 开发的系统级编程语言 Xero 通过全工具链的 JSON 结构化输出,实现了让大语言模型在没有任何先验训练数据的情况下,仅凭编译器自带的上下文信息即可在 31 秒内自主调试并修复代码错误。

Highlights

  • Vercel 发布的新编程语言 Xero 允许整个工具链将编译器生成的任何内容直接输出为 JSON 格式。

  • Xero 语言引入了 world 能力(capability)机制,在执行文件、网络或打印等任何 I/O 操作时均需显式声明。

  • 在函数执行完毕并超出作用域时,Xero 允许使用 defer 关键字后接特定函数来运行延迟清理逻辑。

  • Claude 在完全没有 Xero 语言先验知识且不进行网页搜索的情况下,仅依靠 `xero fix` 命令输出的结构化 JSON 诊断信息,在 31 秒内成功修复了代码文件中的全部 3 个错误。

  • Rust 语言同样具备将编译错误以 JSON 形式输出的功能,这表明结构化错误提示并非 Xero 独有的全新概念。

Timeline

面向 AI 智能体的系统编程语言定位

  • Xero 是一种从头构建的系统级编程语言,其设计目标是让软件工程师与 AI 智能体共同构建轻量级的原生程序。
  • 传统编程语言的错误信息和堆栈追踪是为人类阅读而设计的,而 Xero 的整个工具链则专门针对善于处理结构化数据的 AI 进行了优化。

现有的主流编程语言在设计之初并未考虑 AI 的阅读习惯,导致大语言模型在解析人类可读的警告和堆栈信息时效率不高。Xero 作为一种类似于 Rust 或 Zig 的系统语言,其核心理念在于彻底改变这种人机协作的障碍。为此,该语言的编译器和相关工具链能够将所有生成的诊断数据转化并输出为标准的 JSON 格式。

显式原则与原生语法特性

  • Xero 语言严格遵循显式原则,凡是涉及文件操作或网络调用等 I/O 副作用的函数均须具备 world 能力。
  • 通过在编译时根据目标平台评估 world 能力,编译器会在第一时间拒绝在 WebAssembly 等环境中不可用的功能。
  • 该语言通过 raises 标记可能失败的函数,并使用 check 关键字传递错误,这类似于 Rust 的问号操作符。

在 Xero 中编写基础的字符串打印程序需要使用 main 函数作为入口。如果函数未声明 world 能力,则意味着该函数完全不包含任何 I/O 副作用。这种静态检查机制可以防止运行时出现突发错误。此外,语言本身还提供了枚举(enums)、形状(shapes)、match 分支、用于控制读写视图的可变与不可变 spans 机制,以及利用 owned 类型和 defer 关键字实现的内存清理逻辑。

基于 JSON 结构化输出的 AI 自动修复实验

  • Xero 的核心卖点在于其工具链的每个部分都配有 JSON 选项,能够为大语言模型提供包含严重级别、代码和修复策略的诊断信息。
  • 通过配合使用 `xero fix` 命令、plan 模式以及 JSON 选项,大语言模型可以获取专属的字段并生成代码修复方案。
  • 大语言模型 Claude 依靠结构化输出提供的信息,成功运行了 `xero fix` 并返回 `ok: true` 的最终正确结果。

当 AI 智能体在编写 Xero 代码时引入 Bug,传统的文本错误提示往往缺乏结构。通过将命令输出管线传给 JQ 工具,可以看到 Xero 生成了包含修复安全性、错误发生位置、期望值与实际值的高上下文 JSON 数据。在一项实际测试中,一个包含 3 个故意引入错误的 Xero 文件被放置在没有任何额外文档的全新目录里。Claude 模型在完全没有该语言先验知识的情况下,仅花费 31 秒就通过阅读工具链自自带的 JSON 信息完美修复了所有问题。

关于新语言必要性与实用价值的审视

  • 结构化错误提示并不是全新的发明,Rust 语言同样支持直接以 JSON 格式输出类似的分类程序错误。
  • 大语言模型在没有结构化输出的情况下也已经能够熟练调试普通错误,并且在已有成熟语言上拥有更丰富的训练样本。

尽管 Xero 编译出的体积表现优异且展现了新颖的开发思路,但为结构化输出而专门创造一门新语言的必要性仍存疑问。改进现有语言(如 Rust、Zig 或 Go)中缺失的信息可能是更务实的做法。目前大语言模型在常规的复杂语言调试上已经非常得心应手。不过,Xero 的尝试确实证明了一点:开发团队可以在不让 AI 提前接受大规模语料训练的前提下,仅靠工具链本身提供的上下文来构建并维护一门新语言。

Community Posts

No posts yet. Be the first to write about this video!

Write about this video