1 Введение

С ростом популярности программного обеспечения как услуги и микросервисных архитектур RESTful API стали повсеместными в современных приложениях. Такие сервисы, как Slack, Stripe и AWS, предлагают обширные API с сотнями методов, что создает значительные трудности для разработчиков в поиске правильной комбинации методов для их задач.

APIphany решает эту проблему с помощью компонентного синтеза, специально разработанного для RESTful API. Система использует точные семантические типы для спецификации намерений пользователя и направления процесса поиска, обеспечивая автоматизированный синтез программ из высокоуровневых спецификаций.

2 Предпосылки и связанные работы

2.1 Компонентный синтез

Компонентный синтез программ успешно применялся для навигации по API в таких языках, как Java, Scala и Haskell. Эти синтезаторы принимают сигнатуры типов и примеры входных-выходных данных для генерации фрагментов программ, которые комбинируют вызовы API с желаемым поведением.

2.2 Проблемы RESTful API

Три основные проблемы усложняют применение компонентного синтеза к RESTful API: (1) отсутствие точных семантических типов в спецификациях API, (2) необходимость обработки полуструктурированных данных и (3) проблемы безопасности при выполнении вызовов API во время синтеза.

3 Архитектура APIphany

3.1 Вывод семантических типов

APIphany представляет алгоритм вывода типов, который дополняет REST-спецификации семантическими типами. Это позволяет более точно специфицировать намерения пользователя и эффективнее направлять процесс синтеза.

3.2 Синтез обработки данных

Система включает эффективные методы синтеза для обработки полуструктурированных данных, часто встречающихся при работе с RESTful API, включая JSON-объекты и массивы.

3.3 Симулированное выполнение

APIphany использует симулированное выполнение, чтобы избежать выполнения реальных вызовов API во время синтеза, решая проблемы безопасности и производительности при сохранении точности синтеза.

4 Техническая реализация

4.1 Формализм системы типов

Система типов в APIphany расширяет стандартные системы типов семантическими аннотациями. Основное суждение о типах формализуется как:

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

Где $\Gamma$ — типовая среда, $e$ — выражение, $\tau$ — базовый тип, а $\phi$ — семантическое уточнение, отражающее поведение выражения.

4.2 Алгоритм синтеза

Алгоритм синтеза использует типонаправленный поиск с возвратом. Пространство поиска определяется как:

$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)$

Алгоритм отсекает недопустимых кандидатов на ранних этапах, используя типовые ограничения и семантические уточнения.

5 Экспериментальная оценка

5.1 Методология

APIphany оценивался на трех реальных API (Slack, Stripe, GitHub) с 32 задачами, извлеченными из репозиториев GitHub и StackOverflow. Задачи включали распространенные сценарии интеграции, такие как получение email-адресов участников из каналов Slack и обработка платежных данных из Stripe.

5.2 Результаты и производительность

APIphany успешно нашел правильные решения для 29 из 32 задач (успешность 90,6%). Среди них 23 решения оказались в первой десятке результатов синтеза, что демонстрирует эффективность типонаправленного подхода.

Успешность

90,6%

29/32 задач решено

Топ-10 результатов

79,3%

23 решения в топ-10

Среднее время синтеза

4,2 с

На задачу

6 Примеры кода

Пример задачи синтеза для получения email-адресов участников канала Slack:

// Входная спецификация
Тип: ChannelName -> List[Email]

// Синтезированное решение
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 Перспективные приложения и направления

Подход APIphany может быть расширен на другие области, включая:

  • Синтез GraphQL API с интроспекцией типов
  • Оркестрацию микросервисов в облачно-нативных приложениях
  • Интеграцию устройств Интернета вещей (IoT)
  • Интеграцию корпоративных систем и модернизацию устаревших API

Будущая работа включает интеграцию машинного обучения для лучшего вывода типов и расширение поддержки асинхронных API-паттернов.

8 Оригинальный анализ

APIphany представляет значительный прогресс в синтезе программ для веб-API, решая фундаментальные проблемы, ограничивавшие предыдущие подходы. Интеграция семантических типов с компонентным синтезом создает мощную структуру, которая преодолевает разрыв между формальными методами и практическими задачами интеграции API.

Механизм вывода типов в APIphany имеет концептуальное сходство с системами типов уточнения в таких языках, как Liquid Haskell [1], но адаптирует эти концепции для динамического, полуструктурированного мира REST API. Эта адаптация критически важна, потому что, в отличие от статически типизированных языков, где типы явные, REST API часто полагаются на JSON-схемы, которые предоставляют структурную, но не семантическую информацию о типах.

Техника симулированного выполнения особенно инновационна, черпая вдохновение из символьного выполнения в верификации программ [2], но применяя его к синтезу API. Этот подход решает критическую проблему безопасности выполнения потенциально деструктивных API-операций в процессе синтеза. Подобные техники использовались в оптимизации запросов к базам данных [3], но APIphany адаптирует их для более сложной области синтеза программ с несколькими API.

При сравнении с другими подходами к синтезу, такими как FlashFill [4] для строковых преобразований или SyPet [5] для компонентного синтеза, APIphany демонстрирует, как предметно-ориентированные знания (семантика REST API) могут значительно повысить эффективность синтеза. Успешность 90,6% на реальных задачах существенно превышает ожидаемое от универсальных синтезаторов, поддерживая гипотезу, что предметно-ориентированный синтез необходим для практических приложений.

Компонент обработки данных решает фундаментальную проблему в интеграции API: несоответствие между форматами данных API и потребностями приложений. Эта проблема напоминает проблемы преобразования данных в процессах ETL (Extract, Transform, Load) [6], но APIphany решает ее через синтез, а не ручную спецификацию. Этот подход потенциально может повлиять на будущие практики проектирования API, поощряя более систематическую информацию о типах в спецификациях API.

В перспективе техники APIphany могут быть интегрированы с большими языковыми моделями для генерации API-кода. Хотя модели типа GPT-3 [7] демонстрируют впечатляющие возможности генерации кода, им не хватает семантической точности и гарантий безопасности типонаправленного синтеза. Гибридный подход, сочетающий нейронную генерацию с типонаправленной верификацией, может представлять следующую границу в практическом синтезе программ.

9 Ссылки

  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.