2025-11-24T09:28:17.353555

Herb.jl: A Unifying Program Synthesis Library

Hinnerichs, Reid, de Jong et al.
Program synthesis -- the automatic generation of code given a specification -- is one of the most fundamental tasks in artificial intelligence (AI) and many programmers' dream. Numerous synthesizers have been developed to tackle program synthesis, manifesting different ideas to approach the exponentially growing program space. While numerous smart program synthesis tools exist, reusing and remixing previously developed methods is tedious and time-consuming. We propose Herb.jl, a unifying program synthesis library written in the Julia programming language, to address these issues. Since current methods rely on similar building blocks, we aim to modularize the underlying synthesis algorithm into communicating and fully extendable sub-compartments, allowing for straightforward reapplication of these modules. To demonstrate the benefits of using Herb.jl, we show three common use cases: 1. how to implement a simple problem and grammar, and how to solve it, 2. how to implement a previously developed synthesizer with just a few lines of code, and 3. how to run a synthesizer against a benchmark.
academic

Herb.jl: A Unifying Program Synthesis Library

基本信息

  • 论文ID: 2510.09726
  • 标题: Herb.jl: A Unifying Program Synthesis Library
  • 作者: Tilman Hinnerichs, Reuben Gardos Reid, Jaap de Jong, Bart Swinkels, Pamela Wochner, Nicolae Filat, Tudor Magurescu, Issa Hanou, Sebastijan Dumancic (Technische Universiteit Delft)
  • 分类: cs.PL (Programming Languages), cs.AI (Artificial Intelligence), cs.SE (Software Engineering)
  • 发表时间: Journal of Machine Learning Research 10 (2025) 1-48, Submitted 10/25
  • 论文链接: https://arxiv.org/abs/2510.09726

摘要

程序合成——根据给定规范自动生成代码——是人工智能中最基础的任务之一,也是许多程序员的梦想。虽然已经开发了众多智能的程序合成工具来处理指数级增长的程序空间,但重用和重新组合已有方法既繁琐又耗时。本文提出了Herb.jl,一个用Julia编程语言编写的统一程序合成库来解决这些问题。由于现有方法依赖于相似的构建模块,作者旨在将底层合成算法模块化为可通信且完全可扩展的子组件,从而允许直接重新应用这些模块。

研究背景与动机

核心问题

程序合成领域面临四个主要问题:

  1. 领域特定性:合成器实现通常针对特定语言设计,难以适应新的语法规则
  2. 模块化不足:相同的构建模块无法轻易重用,研究者需要重复实现相同的思想
  3. 比较困难:由于工程选择的差异,方法比较往往退化为实现质量的比较
  4. 基准测试重用困难:基准测试的语法规则选择往往是隐式的,影响了公平比较

研究动机

现有的程序合成方法虽然在各自领域表现出色,但存在以下局限性:

  • 实现过于专门化,缺乏重用性规划
  • 缺乏跨程序合成分支的模块化设计
  • 隐式假设和优化使得方法比较变得困难
  • 基准测试的语法规则定义不统一

核心贡献

  1. 提出了Herb.jl:一个用Julia语言编写的新颖统一程序合成库
  2. 展示了模块化实现:演示如何使用Herb.jl轻松实现已有合成器
  3. 提供标准化基准测试:以人类可读和可扩展格式重新实现标准基准测试
  4. 设计原则总结:概述了Herb.jl中的指导设计原则,对其他合成器实现具有参考价值

方法详解

任务定义

程序合成问题由两个组件定义:

  1. 规范(Specification):描述用户意图,通常通过输入-输出示例表达
  2. 语法(Grammar):描述目标语言,由上下文无关派生规则组成

架构设计

Herb.jl采用分层模块化架构,包含以下核心组件:

核心模块

  • HerbCore.jl:定义语法、程序和约束的接口
  • HerbSpecification.jl:处理问题规范定义
  • HerbGrammar.jl:定义程序语法结构
  • HerbInterpret.jl:处理程序语义和求值
  • HerbConstraints.jl:约束公式化和传播
  • HerbSearch.jl:搜索方法和枚举技术

特殊模块

  • Herb.jl:总体包装模块
  • HerbBenchmarks.jl:标准基准测试集合
  • Garden.jl:已知合成器的实现集合

技术创新点

1. 语法与语义分离

Herb.jl明确分离语法和语义:

  • 程序枚举纯粹基于语法,通过更新抽象语法树(AST)完成
  • 程序转换为可执行表达式来检查规范
  • 用户只需提供可执行表达式,无需了解内部机制

2. 统一树结构

引入自定义数据结构"统一树":

  • 相似形状的操作产生相似形状的程序
  • 统一节点描述相同形状的操作域,而非单个操作
  • 显著减少内存使用,支持高效约束应用和传播

3. 枚举顺序优化

通过两个函数定义程序枚举顺序:

  • 优先级函数:定义优先队列中元素的优先级值
  • 派生启发式:定义统一树内元素域的枚举顺序

实验设置

使用案例展示

案例1:简单问题定义与求解

# 定义输入-输出规范
problem = Problem([
    IOExample(Dict(:x => 0), 1),
    IOExample(Dict(:x => 1), 3),
    IOExample(Dict(:x => 2), 5),
    IOExample(Dict(:x => 3), 7)
])

# 定义语法
grammar = @cfgrammar begin
    Int = 1 | 2 | x
    Int = Int + Int
    Int = Int * Int
end

# 执行搜索
iterator = BFSIterator(grammar, :Int, max_depth=5)
solution, flag = synth(problem, iterator)

案例2:实现Probe算法

展示如何用几行代码重新实现Probe合成器:

  • 实现最可能优先搜索迭代器(MLFSIterator)
  • 定义概率计算函数
  • 实现Probe循环逻辑

案例3:基准测试运行

using HerbBenchmarks
pairs = get_all_problem_grammar_pairs(PBE_SLIA_Track_2019)

solved_problems = 0
for (problem, grammar) in pairs
    solution = probe(grammar, :Start, problem; max_depth=5)
    if !isnothing(solution)
        solved_problems += 1
    end
end

技术实现细节

  • 使用Julia的多重分派特性实现模块化
  • 利用Julia的元编程能力处理AST操作
  • 采用统一树结构优化内存使用和约束传播

实验结果

模块化效果展示

论文通过三个使用案例验证了Herb.jl的有效性:

  1. 简单问题求解:用几行代码即可定义和解决基本程序合成问题
  2. 已有算法重实现:Probe算法的重新实现代码简洁且高效
  3. 基准测试集成:轻松在标准基准上运行合成器并收集性能指标

实用性验证

  • 代码简洁性:相比原始实现,代码量显著减少
  • 模块互换性:可以轻松替换搜索策略、约束类型等组件
  • 扩展性:支持添加新的语法规则、搜索方法和约束类型

相关工作

程序合成领域现状

  • 枚举搜索方法:包括自顶向下和自底向上搜索策略
  • 约束驱动合成:利用约束来限制搜索空间
  • 启发式引导:使用领域知识指导搜索过程
  • 神经符号方法:结合机器学习和符号推理

Herb.jl的定位

相比现有工具,Herb.jl的优势在于:

  • 跨领域的统一框架设计
  • 模块化和可重用的组件架构
  • 标准化的基准测试平台
  • Julia语言带来的性能和表达能力优势

结论与讨论

主要结论

Herb.jl成功解决了程序合成领域的四个关键问题:

  1. 提供了领域无关的通用框架
  2. 实现了高度模块化的组件设计
  3. 建立了公平比较的基础设施
  4. 标准化了基准测试的定义和使用

局限性

  • 作为新兴框架,生态系统仍在建设中
  • 需要用户学习Julia语言和Herb.jl的设计理念
  • 某些高度优化的专用合成器可能在特定领域仍有性能优势

未来方向

  • 持续添加新的模块化组件以支持更多合成方法
  • 扩展基准测试集合以覆盖更多应用领域
  • 与机器学习社区合作,集成更多神经符号方法

深度评价

优点

  1. 创新的统一框架:首次提供真正模块化的程序合成库
  2. 技术设计优秀:统一树结构和语法语义分离等设计巧妙
  3. 实用价值高:显著降低了程序合成研究的入门门槛
  4. 文档完善:提供了清晰的使用案例和实现指南

不足

  1. 评估有限:缺乏与现有工具的详细性能比较
  2. 生态依赖:成功依赖于Julia社区的接受度
  3. 学习曲线:需要用户掌握新的编程范式和工具

影响力

  • 学术贡献:为程序合成研究提供了标准化平台
  • 实用价值:显著提高了研究效率和代码重用性
  • 可复现性:统一的基准测试平台有助于结果复现

适用场景

  • 程序合成算法的原型开发和测试
  • 不同合成方法的公平比较和评估
  • 教学和学习程序合成概念
  • 跨领域程序合成应用的快速部署

参考文献

论文引用了程序合成领域的重要工作,包括:

  • SyGuS竞赛基准测试 (Padhi et al., 2019)
  • Probe算法 (Barke et al., 2020)
  • FrAngel合成器 (Shi et al., 2019)
  • Neo合成器 (Feng et al., 2018)
  • 程序合成综述 (Gulwani et al., 2017)

总体评价:这是一篇高质量的系统论文,提出了程序合成领域急需的统一框架。虽然在实验评估方面还有提升空间,但其技术贡献和实用价值都很突出,有望成为该领域的重要基础设施。