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 : Une Bibliothèque Unifiée de Synthèse de Programmes

Informations Fondamentales

  • ID de l'article : 2510.09726
  • Titre : Herb.jl: A Unifying Program Synthesis Library
  • Auteurs : Tilman Hinnerichs, Reuben Gardos Reid, Jaap de Jong, Bart Swinkels, Pamela Wochner, Nicolae Filat, Tudor Magurescu, Issa Hanou, Sebastijan Dumancic (Technische Universiteit Delft)
  • Classification : cs.PL (Langages de Programmation), cs.AI (Intelligence Artificielle), cs.SE (Génie Logiciel)
  • Date de publication : Journal of Machine Learning Research 10 (2025) 1-48, Soumis 10/25
  • Lien de l'article : https://arxiv.org/abs/2510.09726

Résumé

La synthèse de programmes — la génération automatique de code selon une spécification donnée — est l'une des tâches fondamentales de l'intelligence artificielle et le rêve de nombreux programmeurs. Bien que de nombreux outils intelligents de synthèse de programmes aient été développés pour traiter l'espace exponentiel des programmes, la réutilisation et la recombinaison des méthodes existantes sont fastidieuses et chronophages. Cet article propose Herb.jl, une bibliothèque unifiée de synthèse de programmes écrite en langage de programmation Julia pour résoudre ces problèmes. Puisque les méthodes existantes reposent sur des blocs de construction similaires, les auteurs visent à modulariser les algorithmes de synthèse sous-jacents en sous-composants communicants et entièrement extensibles, permettant ainsi une réapplication directe de ces modules.

Contexte et Motivation de la Recherche

Problèmes Fondamentaux

Le domaine de la synthèse de programmes fait face à quatre problèmes majeurs :

  1. Spécificité au domaine : Les implémentations de synthétiseurs sont généralement conçues pour des langages spécifiques et s'adaptent difficilement aux nouvelles règles syntaxiques
  2. Modularité insuffisante : Les mêmes blocs de construction ne peuvent pas être facilement réutilisés, obligeant les chercheurs à réimplémenter les mêmes idées
  3. Difficulté de comparaison : En raison des différences dans les choix d'ingénierie, la comparaison des méthodes dégénère souvent en comparaison de la qualité d'implémentation
  4. Difficultés de réutilisation des benchmarks : Les choix de règles syntaxiques des benchmarks sont souvent implicites, affectant les comparaisons équitables

Motivation de la Recherche

Bien que les méthodes existantes de synthèse de programmes excellent dans leurs domaines respectifs, elles présentent les limitations suivantes :

  • Les implémentations sont trop spécialisées, manquant de planification pour la réutilisabilité
  • Absence de conception modulaire entre les différentes branches de la synthèse de programmes
  • Les hypothèses implicites et les optimisations rendent la comparaison des méthodes difficile
  • Les définitions des règles syntaxiques des benchmarks ne sont pas uniformes

Contributions Principales

  1. Proposition de Herb.jl : Une nouvelle bibliothèque unifiée de synthèse de programmes écrite en langage Julia
  2. Démonstration d'implémentations modulaires : Illustration de la façon d'implémenter facilement des synthétiseurs existants avec Herb.jl
  3. Fourniture de benchmarks standardisés : Réimplémentation de benchmarks standards dans un format lisible par l'homme et extensible
  4. Résumé des principes de conception : Énumération des principes de conception directeurs dans Herb.jl, servant de référence pour d'autres implémentations de synthétiseurs

Explication Détaillée de la Méthode

Définition de la Tâche

Un problème de synthèse de programmes est défini par deux composants :

  1. Spécification : Décrit l'intention de l'utilisateur, généralement exprimée par des exemples entrée-sortie
  2. Grammaire : Décrit le langage cible, composée de règles de dérivation sans contexte

Conception de l'Architecture

Herb.jl adopte une architecture modulaire en couches contenant les composants fondamentaux suivants :

Modules Fondamentaux

  • HerbCore.jl : Définit les interfaces pour la grammaire, les programmes et les contraintes
  • HerbSpecification.jl : Traite la définition des spécifications de problèmes
  • HerbGrammar.jl : Définit la structure syntaxique des programmes
  • HerbInterpret.jl : Traite la sémantique des programmes et l'évaluation
  • HerbConstraints.jl : Formulation et propagation des contraintes
  • HerbSearch.jl : Méthodes de recherche et techniques d'énumération

Modules Spécialisés

  • Herb.jl : Module d'emballage global
  • HerbBenchmarks.jl : Collection de benchmarks standards
  • Garden.jl : Collection d'implémentations de synthétiseurs connus

Points d'Innovation Technique

1. Séparation de la Syntaxe et de la Sémantique

Herb.jl sépare explicitement la syntaxe et la sémantique :

  • L'énumération des programmes est basée purement sur la syntaxe, réalisée par la mise à jour de l'arbre de syntaxe abstraite (AST)
  • Les programmes sont transformés en expressions exécutables pour vérifier les spécifications
  • Les utilisateurs n'ont besoin de fournir que des expressions exécutables, sans comprendre les mécanismes internes

2. Structure d'Arbre Unifiée

Introduction d'une structure de données personnalisée « arbre unifié » :

  • Les opérations de forme similaire produisent des programmes de forme similaire
  • Les nœuds unifiés décrivent des domaines d'opérations de même forme, plutôt que des opérations individuelles
  • Réduction significative de l'utilisation de la mémoire, supportant l'application efficace des contraintes et leur propagation

3. Optimisation de l'Ordre d'Énumération

L'ordre d'énumération des programmes est défini par deux fonctions :

  • Fonction de priorité : Définit la valeur de priorité des éléments dans la file d'attente prioritaire
  • Heuristique de dérivation : Définit l'ordre d'énumération des domaines d'éléments dans l'arbre unifié

Configuration Expérimentale

Démonstration de Cas d'Usage

Cas 1 : Définition et Résolution de Problèmes Simples

# Définir une spécification entrée-sortie
problem = Problem([
    IOExample(Dict(:x => 0), 1),
    IOExample(Dict(:x => 1), 3),
    IOExample(Dict(:x => 2), 5),
    IOExample(Dict(:x => 3), 7)
])

# Définir la grammaire
grammar = @cfgrammar begin
    Int = 1 | 2 | x
    Int = Int + Int
    Int = Int * Int
end

# Exécuter la recherche
iterator = BFSIterator(grammar, :Int, max_depth=5)
solution, flag = synth(problem, iterator)

Cas 2 : Implémentation de l'Algorithme Probe

Démonstration de la réimplémentation du synthétiseur Probe en quelques lignes de code :

  • Implémentation d'un itérateur de recherche par probabilité maximale (MLFSIterator)
  • Définition de la fonction de calcul de probabilité
  • Implémentation de la boucle Probe

Cas 3 : Exécution de Benchmarks

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

Détails d'Implémentation Technique

  • Utilisation de la dépêche multiple de Julia pour implémenter la modularité
  • Exploitation des capacités de métaprogrammation de Julia pour traiter les opérations AST
  • Adoption de la structure d'arbre unifié pour optimiser l'utilisation de la mémoire et la propagation des contraintes

Résultats Expérimentaux

Démonstration des Effets de Modularité

L'article valide l'efficacité de Herb.jl par trois cas d'usage :

  1. Résolution de problèmes simples : Définition et résolution de problèmes fondamentaux de synthèse de programmes en quelques lignes de code
  2. Réimplémentation d'algorithmes existants : La réimplémentation de l'algorithme Probe est concise et efficace
  3. Intégration de benchmarks : Exécution facile de synthétiseurs sur des benchmarks standards et collecte de métriques de performance

Validation de l'Utilité Pratique

  • Simplicité du code : Réduction significative du volume de code par rapport aux implémentations originales
  • Interchangeabilité des modules : Remplacement facile des stratégies de recherche, des types de contraintes et d'autres composants
  • Extensibilité : Support pour l'ajout de nouvelles règles syntaxiques, méthodes de recherche et types de contraintes

Travaux Connexes

État Actuel du Domaine de la Synthèse de Programmes

  • Méthodes de recherche énumératives : Incluant les stratégies de recherche descendante et ascendante
  • Synthèse guidée par contraintes : Utilisation de contraintes pour limiter l'espace de recherche
  • Recherche guidée par heuristiques : Utilisation de connaissances du domaine pour guider le processus de recherche
  • Méthodes neuro-symboliques : Combinaison de l'apprentissage automatique et du raisonnement symbolique

Positionnement de Herb.jl

Par rapport aux outils existants, les avantages de Herb.jl sont :

  • Conception d'un cadre unifié inter-domaines
  • Architecture de composants modulaires et réutilisables
  • Plateforme de benchmarking standardisée
  • Avantages de performance et d'expressivité apportés par le langage Julia

Conclusion et Discussion

Conclusions Principales

Herb.jl résout avec succès quatre problèmes clés du domaine de la synthèse de programmes :

  1. Fourniture d'un cadre générique indépendant du domaine
  2. Implémentation d'une conception de composants hautement modulaire
  3. Établissement d'une infrastructure pour la comparaison équitable
  4. Standardisation de la définition et de l'utilisation des benchmarks

Limitations

  • En tant que cadre émergent, l'écosystème est encore en construction
  • Nécessité pour les utilisateurs d'apprendre le langage Julia et la philosophie de conception de Herb.jl
  • Certains synthétiseurs spécialisés hautement optimisés peuvent conserver des avantages de performance dans des domaines spécifiques

Directions Futures

  • Ajout continu de nouveaux composants modulaires pour supporter davantage de méthodes de synthèse
  • Expansion de la collection de benchmarks pour couvrir davantage de domaines d'application
  • Collaboration avec la communauté de l'apprentissage automatique pour intégrer davantage de méthodes neuro-symboliques

Évaluation Approfondie

Points Forts

  1. Cadre unifié innovant : Première véritable bibliothèque modulaire de synthèse de programmes
  2. Conception technique excellente : Les conceptions telles que la structure d'arbre unifié et la séparation syntaxe-sémantique sont ingénieuses
  3. Valeur pratique élevée : Réduction significative de la barrière à l'entrée pour la recherche en synthèse de programmes
  4. Documentation complète : Fourniture de cas d'usage clairs et de guides d'implémentation

Insuffisances

  1. Évaluation limitée : Manque de comparaisons détaillées de performance avec les outils existants
  2. Dépendance à l'écosystème : Le succès dépend de l'acceptation par la communauté Julia
  3. Courbe d'apprentissage : Nécessité pour les utilisateurs de maîtriser de nouveaux paradigmes de programmation et outils

Impact

  • Contribution académique : Fourniture d'une plateforme standardisée pour la recherche en synthèse de programmes
  • Valeur pratique : Amélioration significative de l'efficacité de la recherche et de la réutilisabilité du code
  • Reproductibilité : La plateforme de benchmarking unifiée facilite la reproduction des résultats

Scénarios d'Application

  • Développement et test de prototypes d'algorithmes de synthèse de programmes
  • Comparaison équitable et évaluation de différentes méthodes de synthèse
  • Enseignement et apprentissage des concepts de synthèse de programmes
  • Déploiement rapide d'applications de synthèse de programmes inter-domaines

Références

L'article cite des travaux importants dans le domaine de la synthèse de programmes, notamment :

  • Benchmarks de compétition SyGuS (Padhi et al., 2019)
  • Algorithme Probe (Barke et al., 2020)
  • Synthétiseur FrAngel (Shi et al., 2019)
  • Synthétiseur Neo (Feng et al., 2018)
  • Synthèse de programmes : aperçu (Gulwani et al., 2017)

Évaluation Globale : Ceci est un article de haute qualité présentant un cadre unifié dont le domaine de la synthèse de programmes a grand besoin. Bien qu'il y ait place pour amélioration dans l'évaluation expérimentale, ses contributions techniques et sa valeur pratique sont remarquables, et il devrait devenir une infrastructure importante dans ce domaine.