1 Introduction

Avec l'essor des architectures de logiciels en tant que service et des microservices, les API RESTful sont devenues omniprésentes dans les applications modernes. Des services comme Slack, Stripe et AWS proposent des API étendues avec des centaines de méthodes, créant des défis significatifs pour les développeurs qui doivent trouver la bonne combinaison de méthodes pour leurs tâches.

APIphany relève ce défi grâce à une synthèse basée sur les composants spécialement conçue pour les API RESTful. Le système utilise des types sémantiques précis pour spécifier l'intention de l'utilisateur et orienter le processus de recherche, permettant une synthèse automatisée de programmes à partir de spécifications de haut niveau.

2 Contexte et travaux connexes

2.1 Synthèse basée sur les composants

La synthèse de programmes basée sur les composants a été appliquée avec succès pour naviguer dans les API de langages comme Java, Scala et Haskell. Ces synthétiseurs prennent des signatures de types et des exemples entrée-sortie pour générer des fragments de programmes qui composent des appels d'API avec le comportement souhaité.

2.2 Défis des API RESTful

Trois défis principaux compliquent l'application de la synthèse basée sur les composants aux API RESTful : (1) l'absence de types sémantiques précis dans les spécifications d'API, (2) la nécessité de manipuler des données semi-structurées, et (3) les préoccupations de sécurité liées à l'exécution d'appels d'API pendant la synthèse.

3 Architecture d'APIphany

3.1 Inférence de types sémantiques

APIphany introduit un algorithme d'inférence de types qui enrichit les spécifications REST avec des types sémantiques. Cela permet une spécification plus précise de l'intention de l'utilisateur et guide plus efficacement le processus de synthèse.

3.2 Synthèse de manipulation de données

Le système inclut des techniques de synthèse efficaces pour manipuler les données semi-structurées couramment rencontrées lors du travail avec des API RESTful, y compris les objets et tableaux JSON.

3.3 Exécution simulée

APIphany utilise l'exécution simulée pour éviter d'exécuter de véritables appels d'API pendant la synthèse, répondant aux préoccupations de sécurité et de performance tout en maintenant la précision de la synthèse.

4 Implémentation technique

4.1 Formalisme du système de types

Le système de types d'APIphany étend les systèmes de types standard avec des annotations sémantiques. Le jugement de type principal est formalisé comme suit :

$\Gamma \vdash e : \tau \Rightarrow \phi$

Où $\Gamma$ est l'environnement de types, $e$ est l'expression, $\tau$ est le type de base, et $\phi$ est le raffinement sémantique capturant le comportement de l'expression.

4.2 Algorithme de synthèse

L'algorithme de synthèse utilise une recherche guidée par les types avec retour arrière. L'espace de recherche est défini par :

$P := \text{apiCall}(p_1, \dots, p_n) \mid \text{map}(P, \lambda x. P) \mid \text{filter}(P, \lambda x. P) \mid \text{compose}(P, P)$

L'algorithme élimine tôt les candidats invalides en utilisant des contraintes de types et des raffinement sémantiques.

5 Évaluation expérimentale

5.1 Méthodologie

APIphany a été évalué sur trois API du monde réel (Slack, Stripe, GitHub) avec 32 tâches extraites de dépôts GitHub et de StackOverflow. Les tâches incluaient des scénarios d'intégration courants comme la récupération d'e-mails de membres depuis des canaux Slack et le traitement de données de paiement depuis Stripe.

5.2 Résultats et performances

APIphany a trouvé avec succès des solutions correctes pour 29 des 32 tâches (taux de réussite de 90,6 %). Parmi celles-ci, 23 solutions figuraient parmi les dix premiers résultats de synthèse, démontrant l'efficacité de l'approche guidée par les types.

Taux de réussite

90,6 %

29/32 tâches résolues

Top 10 résultats

79,3 %

23 solutions dans le top 10

Temps moyen de synthèse

4,2 s

Par tâche

6 Exemples de code

Exemple de tâche de synthèse pour récupérer les e-mails des membres d'un canal Slack :

// Spécification d'entrée
Type : ChannelName -> List[Email]

// Solution synthétisée
function getChannelEmails(channelName) {
  const channels = conversations_list();
  const targetChannel = channels.find(c => c.name === channelName);
  const memberIds = conversations_members(targetChannel.id);
  return memberIds.map(id => {
    const user = users_info(id);
    return user.profile.email;
  });
}

7 Applications futures et orientations

L'approche d'APIphany peut être étendue à d'autres domaines incluant :

  • La synthèse d'API GraphQL avec introspection de types
  • L'orchestration de microservices dans les applications cloud-natives
  • L'intégration d'appareils de l'Internet des Objets (IoT)
  • L'intégration de systèmes d'entreprise et la modernisation d'API legacy

Les travaux futurs incluent l'intégration de l'apprentissage automatique pour une meilleure inférence de types et l'extension du support pour les modèles d'API asynchrones.

8 Analyse originale

APIphany représente une avancée significative dans la synthèse de programmes pour les API web, abordant des défis fondamentaux qui ont limité les approches précédentes. L'intégration des types sémantiques avec la synthèse basée sur les composants crée un cadre puissant qui comble le fossé entre les méthodes formelles et les tâches pratiques d'intégration d'API.

Le mécanisme d'inférence de types d'APIphany partage des similitudes conceptuelles avec les systèmes de types de raffinement dans des langages comme Liquid Haskell [1], mais adapte ces concepts au monde dynamique et semi-structuré des API REST. Cette adaptation est cruciale car, contrairement aux langages statiquement typés où les types sont explicites, les API REST s'appuient souvent sur des schémas JSON qui fournissent des informations de typage structurelles mais pas sémantiques.

La technique d'exécution simulée est particulièrement innovante, s'inspirant de l'exécution symbolique en vérification de programmes [2] mais l'appliquant à la synthèse d'API. Cette approche répond à la préoccupation de sécurité critique d'exécuter des opérations d'API potentiellement destructrices pendant le processus de synthèse. Des techniques similaires ont été utilisées dans l'optimisation de requêtes de bases de données [3], mais APIphany les adapte au domaine plus complexe de la synthèse de programmes multi-API.

Comparée à d'autres approches de synthèse comme FlashFill [4] pour les transformations de chaînes ou SyPet [5] pour la synthèse basée sur les composants, APIphany démontre comment la connaissance spécifique au domaine (sémantique des API REST) peut améliorer considérablement l'efficacité de la synthèse. Le taux de réussite de 90,6 % sur des tâches du monde réel dépasse significativement ce qui serait attendu des synthétiseurs généralistes, soutenant l'hypothèse que la synthèse consciente du domaine est essentielle pour les applications pratiques.

Le composant de manipulation de données aborde un défi fondamental dans l'intégration d'API : l'inadéquation d'impédance entre les formats de données d'API et les besoins des applications. Ce problème rappelle les défis de transformation de données dans les processus ETL (Extract, Transform, Load) [6], mais APIphany le résout par la synthèse plutôt que par une spécification manuelle. L'approche pourrait potentiellement influencer les futures pratiques de conception d'API, encourageant des informations de types plus systématiques dans les spécifications d'API.

À l'avenir, les techniques d'APIphany pourraient être intégrées avec de grands modèles de langage pour la génération de code d'API. Bien que des modèles comme GPT-3 [7] montrent des capacités impressionnantes pour la génération de code, ils manquent de la précision sémantique et des garanties de sécurité de la synthèse guidée par les types. Une approche hybride combinant la génération neuronale avec la vérification guidée par les types pourrait représenter la prochaine frontière dans la synthèse de programmes pratiques.

9 Références

  1. Vazou, N., et al. "Refinement types for Haskell." ICFP 2014.
  2. Baldoni, R., et al. "A survey of symbolic execution techniques." ACM Computing Surveys 2018.
  3. Neumann, T. "Efficiently compiling efficient query plans for modern hardware." VLDB 2011.
  4. Gulwani, S. "Automating string processing in spreadsheets using input-output examples." POPL 2011.
  5. Feng, Y., et al. "Component-based synthesis for complex APIs." OOPSLA 2017.
  6. Vassiliadis, P. "A survey of extract-transform-load technology." IJDWM 2009.
  7. Brown, T., et al. "Language models are few-shot learners." NeurIPS 2020.
  8. Polikarpova, N., et al. "Program synthesis from polymorphic refinement types." PLDI 2016.