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