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: Унифицированная библиотека синтеза программ

Основная информация

  • 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 (Языки программирования), cs.AI (Искусственный интеллект), cs.SE (Инженерия программного обеспечения)
  • Дата публикации: 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. Спецификация: описывает намерение пользователя, обычно выражается через примеры вход-выход
  2. Грамматика: описывает целевой язык, состоит из правил вывода без контекста

Архитектурный дизайн

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)

Общая оценка: Это высококачественная системная статья, предлагающая давно необходимый унифицированный фреймворк для области синтеза программ. Хотя в экспериментальной оценке есть место для улучшения, его технический вклад и практическая ценность являются выдающимися и, вероятно, станут важной инфраструктурой в этой области.