Jacquard:AI编写、人工审核代码的编程语言
速览
Jacquard是一种新型编程语言,旨在让AI编写代码,再由人类开发者进行审核。它结合了AI的生成能力与人类的监督,提高代码生产效率的同时保证质量。该语言为AI与人类协作编程提供了新的思路,可能影响软件开发流程。
AI 深度解读
背景
Jacquard 是 FriendMachine 研究项目下的一个编程语言,其核心目标是运行、审查、模拟并信任由模型(如大型语言模型)编写、再由人类审查的代码。随着 AI 生成代码的比例不断上升,传统语言在审查时难以快速回答“这段代码能触及什么资源?我们有多确定它的行为?”这类问题。Jacquard 试图通过语言本身的设计来提供这些信息,而不需要人类逐行阅读全部代码。该项目目前处于研究原型阶段,版本 0.1 已实现端到端工作,但并非生产级语言。
核心内容
Jacquard 是一门小型编程语言,具有紧凑的 .jac 表面语法,基于 OCaml 实现检查器和 CPS(continuation-passing style)解释器,并提供一个原生 AOT(ahead-of-time)后端,该后端发射 C 代码,目前编译内核的 .jqd 载体(carrier)。配套工具包括命令行工具、由 Jacquard 自身编写的标准库,以及名为 Warp 的测试框架。版本 0.1 已完整运行,但文档明确标明了其边界和限制(见 docs/release/0.1/LIMITS.md)。
安装 0.1 候选版本(无需 OCaml 或 opam):
curl -fsSL https://raw.githubusercontent.com/jbwinters/jacquard-lang/jacquard-core-0.1-rc3/scripts/install.sh | sh
~/.local/bin/jac run ~/.local/share/jacquard/demos/basics/m1-fact.jac
预期输出为 120。支持 Linux x86-64、macOS Intel 和 macOS Apple Silicon 的二进制发布,从源码开发的方式也已在文档中说明。
Jacquard 的独特之处在于:大多数语言只告诉你程序计算什么,而 Jacquard 还暴露了它可能执行的效果(effect)、有限离散的不确定性,以及规范的程序身份(canonical program identity)。工具可以检查这三者,因为它们内建于语言中,而非仅存在于注释、日志或你对代码库的记忆里。
以下是一些其他语言难以提供的能力:
-
效果可见性:阅读一行函数签名就能知道它可能执行的效果。例如签名
(text) ->{net} text表示该函数可能执行net效果。Jacquard 运行时拒绝未处理的世界效果,除非通过--allow显式授权,包括动态代码执行的效果。这是研究运行时中的语言级强制,并非操作系统沙箱的替代品。 -
多世界运行:同一段代码可以针对真实网络、脚本模拟的假网络、上一周流量的录制回放,或者服务器通常行为的概率模型运行。处理器(handler)是响应程序对外部世界请求的组件;你只需更换处理器,代码本身无需修改。这可以取代传统在效果边界的大量模拟(mocking),使得“如果 API 宕机,我的代理会怎么做?”成为一项普通测试。
-
精确概率枚举:对于有限离散模型,可以枚举每个可能结果及其精确概率。程序可以采样加权选择并记录证据(evidence),枚举过程列出每个可达结果及其精确概率。下面的修复演示将一个失败的测试视为证据,计算哪些补丁仍然可能,以及每个补丁的可能性。
-
规范身份:重命名和格式化不会改变规范身份。Jacquard 对规范解析后的结构进行哈希,而非对源代码字节做哈希。注释、格式、来源以及普通局部或项的重命名都会被忽略;纯测试仅在规范代码或依赖内容发生变化时重新运行。这是结构身份,并非任意程序行为等价性的证明。
Jacquard 背后的赌注是:当大多数代码由机器编写时,人类审查者需要语言本身能够回答“这段代码能触及什么,我们有多确定?”而无需阅读每一行。
快速入门建议先阅读 docs/SKILL.md,它压缩了内核、CLI、序言(prelude)、Warp 测试以及已知陷阱,并作为项目技能加载。操作规则见 AGENTS.md。节省时间的关键点:
- 行为通过证据固定:cram 转录文本(
test/cli/)、语料黄金文件(corpus goldens)、演示脚本以及docs/release/0.1/CLAIMS.md。如果某个固定点失败,应将其视为关于你变更的信息,切勿削弱一个固定点来让 diff 通过。 - 内核包含 27 种形式(
docs/ast.md);.jac是这些形式的一个投影,bootstrap.jqd永久支持。将已发布的表面边界及其搁置的后续工作视为发布证据,而非冻结的语法;不要添加超出范围的功能(AGENTS.md列出了它们)。 - 开发门禁:
dune build @all && dune runtest && dune fmt,然后git diff --exit-code干净。
对于懂编程语言原理的读者,Jacquard 的设计特点包括:
- 统一表示:每个形式都是一个
(head, meta, args)三元组,内核语法共 27 种形式。引用的代码就是普通数据。 - 代数效应(algebraic effects),支持深度、多路处理器(multi-shot handlers)。处理器可以恢复计算零次、一次或多次,这使得穷举搜索和精确推理成为普通库代码。
- 显式能力授权(explicit capability grants):运行时仅为通过
--allow传递的效果安装外部世界的处理器,没有环境权威(ambient authority)。 - 类型-效果行(type-and-effect rows):每个箭头都携带函数可能执行的效果集,因此程序推断出的行就是它的权威清单。
- 离散概率编程作为库:
sample和observe是效果操作,每个推理算法是一个处理器。 - 内容寻址定义(content-addressed definitions):身份是规范解析结构(消去非身份元数据)的哈希,因此格式化、注释以及普通局部或项重命名不会影响下游。
- 工具链:格式化器、结构感知差异、带有内容寻址缓存的 Warp 测试、记录/回放,以及可重现的发布证据包。
- 原生 AOT 路径:发射 C 代码,按内容哈希专门化和缓存单元,并在 clang 和 gcc 下与解释器进行差异测试。
原型已完成其原始核心计划,并已添加了公共表面语法、带环的标准库、Warp 属性与缓存、原生编译、打包的二进制文件以及产品规模的案例研究。RC1 语义边界由 554 个 Alcotest/QCheck
