Jacquard 0.1: 专为 AI 编写、人类审查的代码设计的编程语言
Jacquard 0.1: 专为 AI 编写、人类审查的代码设计的编程语言
Jacquard 0.1 是一种编程语言,旨在应对大多数代码由机器学习模型编写并由人类进行审查的时代。它专注于使语言本身具备回答关键安全性和可靠性问题的能力——例如“这段代码可以触及什么?”以及“我们有多确定?”——而无需人类审查员阅读 AI 生成的每一行代码。
显式副作用追踪与能力授权
Jacquard 在语言层面强制执行副作用的透明度。每个函数签名都会显式声明其可能执行的影响,从而允许审查员一眼就能看出某段代码能够做什么。
- 副作用签名 (Effect Signatures): 像
(text) ->{net} text这样的签名表示该函数可能会执行网络操作 (net)。 - 语言级强制执行: Jacquard 运行时会拒绝任何未处理的世界效应 (world effects),除非通过
--allow标志显式授予权限 (例如--allow net或--allow fs)。 - 无环境权限 (No Ambient Authority): 与传统语言不同,它没有访问文件系统或网络的隐式权限;权限必须显式授予运行时。
多世界执行与模拟
Jacquard 允许通过更换管理外部世界的处理器 (handler) 来针对不同的“世界”执行同一个程序。这用一种一等公民的语言特性取代了传统的 Mocking。
- 世界处理器 (World Handlers): 处理器是响应程序对外部世界请求的组件。通过更换处理器,开发者可以在真实网络、脚本化的伪造环境、历史流量记录或服务器行为的概率模型上运行相同的代码。
- 确定性测试: 这种架构使得测试诸如“如果 API 挂了,我的智能体 (agent) 会怎么做?”之类的场景变得轻而易举,只需更改世界处理器即可。
离散概率编程
Jacquard 将概率编程视为一个库而非内置的运行时特性,这是通过具有深度、多射 (multi-shot) 处理器的代数效应实现的。
- 多射处理器 (Multi-shot Handlers): 处理器可以恢复计算零次、一次或多次。这使得对于有限离散模型,可以精确枚举所有可达结果及其概率。
- 作为库的贝叶斯推理: 由于处理器可以控制程序的延续 (continuation),
sample和observe操作被实现为效应,而不同的推理算法(如似然加权)被实现为处理器。 - 程序修复: 该语言可用于执行程序修复,通过将失败的测试视为一种观测,并计算各种候选补丁的概率。
结构化身份与内容寻址
为了避免格式和重命名的干扰,Jacquard 使用基于代码规范解析结构的内容寻址。
- 规范哈希 (Canonical Hashing): Jacquard 对程序的规范解析结构进行哈希,而不是对源代码字节进行哈希。这意味着更改注释、格式或重命名局部变量不会改变程序的身份。
- 结构化差异对比 (Structural Diffing): 该语言提供了一个结构感知型差异对比工具,能够识别逻辑上的变化而非文本上的变化。
- 高效缓存: 只有当规范代码或其依赖项发生变化时,纯测试才会重新运行,从而减少了冗余计算。
技术实现与工具链
Jacquard 0.1 是作为一个研究原型实现的,带有 OCaml 检查器和 CPS 解释器。它包含一个原生的 AOT (Ahead-of--Time) 后端,用于生成 C 代码,然后通过 clang 或 gcc 进行编译。
- 内核 AST (Kernel AST): 该语言构建在一种统一的表示形式上,其中每个形式都是一个
(head, meta, args)三元组,由 27 个内核形式组成。 - 原生编译:
jac build命令将内核.jqd载体编译成一个独立的二进制文件。虽然完整的效应语言可以编译,但出于安全原因,eval操作仍保留在解释器层。 - Warp 测试: 该项目包含一个 Warp 测试框架,用于带有内容寻址缓存的发现和基于属性的测试。
社区见解与批评
虽然该项目因其在效应追踪和内容寻址方面的方法而受到称赞,但一些社区成员对为 AI 智能体采用新语言表示担忧。
"任何以 AI 为中心的新编程语言... 显而眼的问题在于,你尝试使用它的任何 LLM 都会从零开始——它没有任何可以复制的内容,而且很难通过自主搜索找到相关的文档。"
其他批评者质疑效应系统是否从根本上不同于复杂的类型系统,或者世界建模能力是否仅仅是依赖注入的一种形式。
当前局限性
作为一个研究原型,Jacquard 0.1 有明确的非目标和局限性。它目前缺乏 VM/JIT、并发、连续分布、梯度、类型化分阶段 (typed staging) 以及形式化完备性证明。世界授权仍然是粗粒度的,且该语言目前尚不打算用于生产环境。