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: Una Biblioteca Unificada de Síntesis de Programas

Información Básica

  • ID del Artículo: 2510.09726
  • Título: Herb.jl: A Unifying Program Synthesis Library
  • Autores: Tilman Hinnerichs, Reuben Gardos Reid, Jaap de Jong, Bart Swinkels, Pamela Wochner, Nicolae Filat, Tudor Magurescu, Issa Hanou, Sebastijan Dumancic (Technische Universiteit Delft)
  • Clasificación: cs.PL (Lenguajes de Programación), cs.AI (Inteligencia Artificial), cs.SE (Ingeniería de Software)
  • Fecha de Publicación: Journal of Machine Learning Research 10 (2025) 1-48, Enviado 10/25
  • Enlace del Artículo: https://arxiv.org/abs/2510.09726

Resumen

La síntesis de programas —la generación automática de código a partir de especificaciones dadas— es una de las tareas más fundamentales en inteligencia artificial y un sueño de muchos programadores. Aunque se han desarrollado numerosas herramientas inteligentes de síntesis de programas para abordar el crecimiento exponencial del espacio de programas, la reutilización y recombinación de métodos existentes es tediosa y consume tiempo. Este artículo propone Herb.jl, una biblioteca unificada de síntesis de programas escrita en el lenguaje de programación Julia para resolver estos problemas. Dado que los métodos existentes dependen de bloques de construcción similares, los autores tienen como objetivo modularizar los algoritmos de síntesis subyacentes en subcomponentes comunicables y completamente extensibles, permitiendo la reaplicación directa de estos módulos.

Contexto de Investigación y Motivación

Problemas Centrales

El campo de la síntesis de programas enfrenta cuatro problemas principales:

  1. Especificidad de Dominio: Las implementaciones de sintetizadores suelen diseñarse para lenguajes específicos, siendo difícil adaptarse a nuevas reglas sintácticas
  2. Modularización Insuficiente: Los mismos bloques de construcción no pueden reutilizarse fácilmente, requiriendo que los investigadores reimplementen ideas idénticas
  3. Dificultad de Comparación: Debido a diferencias en las opciones de ingeniería, la comparación de métodos a menudo se reduce a comparar la calidad de la implementación
  4. Dificultad de Reutilización de Pruebas: Las opciones de reglas sintácticas en las pruebas suelen ser implícitas, afectando la comparación justa

Motivación de la Investigación

Aunque los métodos existentes de síntesis de programas muestran excelente desempeño en sus respectivos dominios, presentan las siguientes limitaciones:

  • Las implementaciones son demasiado especializadas, careciendo de planificación de reutilización
  • Falta de diseño modularizado entre ramas de síntesis de programas
  • Los supuestos implícitos y optimizaciones hacen que la comparación de métodos sea difícil
  • Definición no uniforme de reglas sintácticas en pruebas

Contribuciones Principales

  1. Propone Herb.jl: Una nueva biblioteca unificada de síntesis de programas escrita en lenguaje Julia
  2. Demuestra Implementación Modularizada: Muestra cómo implementar fácilmente sintetizadores existentes usando Herb.jl
  3. Proporciona Pruebas Estandarizadas: Reimplementa pruebas estándar en formato legible por humanos y extensible
  4. Resume Principios de Diseño: Describe los principios de diseño orientadores en Herb.jl, con valor de referencia para otras implementaciones de sintetizadores

Explicación Detallada del Método

Definición de Tareas

El problema de síntesis de programas se define por dos componentes:

  1. Especificación: Describe la intención del usuario, típicamente expresada mediante ejemplos entrada-salida
  2. Gramática: Describe el lenguaje objetivo, compuesta por reglas de derivación libres de contexto

Diseño de Arquitectura

Herb.jl adopta una arquitectura modularizada en capas que contiene los siguientes componentes principales:

Módulos Principales

  • HerbCore.jl: Define interfaces para gramáticas, programas y restricciones
  • HerbSpecification.jl: Maneja la definición de especificaciones de problemas
  • HerbGrammar.jl: Define la estructura sintáctica de programas
  • HerbInterpret.jl: Maneja la semántica de programas y evaluación
  • HerbConstraints.jl: Formulación y propagación de restricciones
  • HerbSearch.jl: Métodos de búsqueda y técnicas de enumeración

Módulos Especializados

  • Herb.jl: Módulo envolvente general
  • HerbBenchmarks.jl: Colección de pruebas estándar
  • Garden.jl: Colección de implementaciones de sintetizadores conocidos

Puntos de Innovación Técnica

1. Separación de Sintaxis y Semántica

Herb.jl separa explícitamente sintaxis y semántica:

  • La enumeración de programas se basa puramente en sintaxis, completada mediante actualización de árboles de sintaxis abstracta (AST)
  • Los programas se transforman en expresiones ejecutables para verificar especificaciones
  • Los usuarios solo necesitan proporcionar expresiones ejecutables, sin necesidad de comprender mecanismos internos

2. Estructura de Árbol Unificada

Introduce una estructura de datos personalizada "árbol unificado":

  • Las operaciones de forma similar producen programas de forma similar
  • Los nodos unificados describen dominios de operaciones de forma idéntica, no operaciones individuales
  • Reduce significativamente el uso de memoria, soportando aplicación y propagación eficiente de restricciones

3. Optimización del Orden de Enumeración

Define el orden de enumeración de programas mediante dos funciones:

  • Función de Prioridad: Define el valor de prioridad de elementos en la cola de prioridad
  • Heurística de Derivación: Define el orden de enumeración de dominios de elementos dentro del árbol unificado

Configuración Experimental

Demostración de Casos de Uso

Caso 1: Definición y Resolución de Problemas Simples

# Definir especificación entrada-salida
problem = Problem([
    IOExample(Dict(:x => 0), 1),
    IOExample(Dict(:x => 1), 3),
    IOExample(Dict(:x => 2), 5),
    IOExample(Dict(:x => 3), 7)
])

# Definir gramática
grammar = @cfgrammar begin
    Int = 1 | 2 | x
    Int = Int + Int
    Int = Int * Int
end

# Ejecutar búsqueda
iterator = BFSIterator(grammar, :Int, max_depth=5)
solution, flag = synth(problem, iterator)

Caso 2: Implementación del Algoritmo Probe

Demuestra cómo reimplementar el sintetizador Probe en pocas líneas de código:

  • Implementar iterador de búsqueda más probable primero (MLFSIterator)
  • Definir función de cálculo de probabilidad
  • Implementar lógica del bucle Probe

Caso 3: Ejecución de Pruebas

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

Detalles de Implementación Técnica

  • Utiliza despacho múltiple de Julia para implementar modularización
  • Aprovecha capacidades de metaprogramación de Julia para operaciones AST
  • Adopta estructura de árbol unificada para optimizar uso de memoria y propagación de restricciones

Resultados Experimentales

Demostración de Efectos de Modularización

El artículo valida la efectividad de Herb.jl mediante tres casos de uso:

  1. Resolución de Problemas Simples: Definir y resolver problemas básicos de síntesis de programas con pocas líneas de código
  2. Reimplementación de Algoritmos Existentes: La reimplementación del algoritmo Probe es concisa y eficiente
  3. Integración de Pruebas: Ejecutar fácilmente sintetizadores en pruebas estándar y recopilar métricas de desempeño

Validación de Practicidad

  • Simplicidad del Código: Reducción significativa en cantidad de código comparado con implementaciones originales
  • Intercambiabilidad de Módulos: Reemplazar fácilmente estrategias de búsqueda, tipos de restricciones y otros componentes
  • Extensibilidad: Soporta agregar nuevas reglas sintácticas, métodos de búsqueda y tipos de restricciones

Trabajo Relacionado

Estado Actual del Campo de Síntesis de Programas

  • Métodos de Búsqueda por Enumeración: Incluye estrategias de búsqueda de arriba hacia abajo y de abajo hacia arriba
  • Síntesis Dirigida por Restricciones: Utiliza restricciones para limitar el espacio de búsqueda
  • Búsqueda Guiada por Heurísticas: Utiliza conocimiento de dominio para guiar el proceso de búsqueda
  • Métodos Neuro-Simbólicos: Combina aprendizaje automático y razonamiento simbólico

Posicionamiento de Herb.jl

Las ventajas de Herb.jl comparado con herramientas existentes incluyen:

  • Diseño de marco unificado entre dominios
  • Arquitectura de componentes modularizada y reutilizable
  • Plataforma de pruebas estandarizada
  • Ventajas de desempeño y expresividad del lenguaje Julia

Conclusiones y Discusión

Conclusiones Principales

Herb.jl resuelve exitosamente cuatro problemas clave en el campo de la síntesis de programas:

  1. Proporciona un marco genérico independiente del dominio
  2. Implementa diseño de componentes altamente modularizado
  3. Establece infraestructura para comparación justa
  4. Estandariza la definición y uso de pruebas

Limitaciones

  • Como marco emergente, el ecosistema aún está en construcción
  • Requiere que los usuarios aprendan el lenguaje Julia y la filosofía de diseño de Herb.jl
  • Algunos sintetizadores especializados altamente optimizados pueden mantener ventajas de desempeño en dominios específicos

Direcciones Futuras

  • Agregar continuamente nuevos componentes modularizados para soportar más métodos de síntesis
  • Expandir la colección de pruebas para cubrir más dominios de aplicación
  • Colaborar con la comunidad de aprendizaje automático para integrar más métodos neuro-simbólicos

Evaluación Profunda

Fortalezas

  1. Marco Unificado Innovador: Proporciona por primera vez una biblioteca de síntesis de programas verdaderamente modularizada
  2. Diseño Técnico Excelente: Diseños ingeniosos como estructura de árbol unificado y separación sintaxis-semántica
  3. Alto Valor Práctico: Reduce significativamente la barrera de entrada para investigación en síntesis de programas
  4. Documentación Completa: Proporciona casos de uso claros y guías de implementación

Deficiencias

  1. Evaluación Limitada: Carece de comparaciones detalladas de desempeño con herramientas existentes
  2. Dependencia del Ecosistema: El éxito depende de la aceptación de la comunidad Julia
  3. Curva de Aprendizaje: Requiere que los usuarios dominen nuevos paradigmas de programación y herramientas

Impacto

  • Contribución Académica: Proporciona plataforma estandarizada para investigación en síntesis de programas
  • Valor Práctico: Mejora significativamente la eficiencia de investigación y reutilización de código
  • Reproducibilidad: La plataforma de pruebas unificada facilita la reproducción de resultados

Escenarios de Aplicación

  • Desarrollo y prueba de prototipos de algoritmos de síntesis de programas
  • Comparación justa y evaluación de diferentes métodos de síntesis
  • Enseñanza y aprendizaje de conceptos de síntesis de programas
  • Despliegue rápido de aplicaciones de síntesis de programas entre dominios

Referencias

El artículo cita trabajos importantes en el campo de síntesis de programas, incluyendo:

  • Pruebas de competencia SyGuS (Padhi et al., 2019)
  • Algoritmo Probe (Barke et al., 2020)
  • Sintetizador FrAngel (Shi et al., 2019)
  • Sintetizador Neo (Feng et al., 2018)
  • Revisión de síntesis de programas (Gulwani et al., 2017)

Evaluación General: Este es un artículo de alta calidad sobre sistemas que propone el marco unificado que el campo de síntesis de programas necesita urgentemente. Aunque hay espacio para mejora en la evaluación experimental, sus contribuciones técnicas y valor práctico son destacados, con potencial para convertirse en infraestructura importante en este campo.