1 مقدمه

با ظهور معماری‌های نرم‌افزار-به‌عنوان-سرویس و ریزسرویس‌ها، APIهای RESTful در برنامه‌های مدرن همه‌جا حاضر شده‌اند. سرویس‌هایی مانند اسلک، استرایپ و AWS APIهای گسترده‌ای با صدها متد ارائه می‌دهند که چالش‌های قابل توجهی برای توسعه‌دهندگان در یافتن ترکیب مناسب متدها برای وظایفشان ایجاد می‌کند.

APIphany این چالش را از طریق سنتز مؤلفه‌بنیاد که به‌طور خاص برای APIهای RESTful طراحی شده است، برطرف می‌کند. این سیستم از انواع معنایی دقیق برای مشخص کردن قصد کاربر و هدایت فرآیند جستجو استفاده می‌کند و سنتز برنامه خودکار از مشخصات سطح بالا را ممکن می‌سازد.

2 پیش‌زمینه و کارهای مرتبط

2.1 سنتز مؤلفه‌بنیاد

سنتز برنامه مؤلفه‌بنیاد با موفقیت برای پیمایش APIها در زبان‌هایی مانند جاوا، اسکالا و هسکل به کار رفته است. این سنتزکننده‌ها امضاهای نوع و مثال‌های ورودی-خروجی را می‌گیرند تا قطعات برنامه‌ای که فراخوانی‌های API را با رفتار مطلوب ترکیب می‌کنند، تولید کنند.

2.2 چالش‌های APIهای RESTful

سه چالش اصلی، اعمال سنتز مؤلفه‌بنیاد بر روی APIهای RESTful را پیچیده می‌کند: (1) فقدان انواع معنایی دقیق در مشخصات API، (2) نیاز به مهندسی داده‌های نیمه‌ساختاریافته، و (3) نگرانی‌های ایمنی در اجرای فراخوانی‌های API در حین سنتز.

3 معماری APIphany

3.1 استنتاج نوع معنایی

APIphany یک الگوریتم استنتاج نوع معرفی می‌کند که مشخصات REST را با انواع معنایی تقویت می‌کند. این امر مشخص‌سازی دقیق‌تر قصد کاربر و هدایت مؤثرتر فرآیند سنتز را ممکن می‌سازد.

3.2 سنتز مهندسی داده

این سیستم شامل تکنیک‌های سنتز کارآمد برای مهندسی داده‌های نیمه‌ساختاریافته‌ای است که معمولاً هنگام کار با APIهای RESTful، از جمله اشیاء و آرایه‌های 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 دنیای واقعی (اسلک، استرایپ، گیت‌هاب) با 32 وظیفه استخراج‌شده از مخازن گیت‌هاب و StackOverflow ارزیابی شد. وظایف شامل سناریوهای یکپارچه‌سازی رایج مانند بازیابی ایمیل‌های اعضا از کانال‌های اسلک و پردازش داده‌های پرداخت از استرایپ بود.

5.2 نتایج و عملکرد

APIphany با موفقیت راه‌حل‌های صحیح را برای 29 مورد از 32 وظیفه (نرخ موفقیت 90.6٪) یافت. از بین این موارد، 23 راه‌حل در میان ده نتیجه برتر سنتز گزارش شدند که مؤثر بودن رویکرد نوع‌محور را نشان می‌دهد.

نرخ موفقیت

90.6%

29/32 وظیفه حل شد

نتایج برتر 10 تایی

79.3%

23 راه‌حل در 10 مورد برتر

میانگین زمان سنتز

4.2s

به ازای هر وظیفه

6 مثال‌های کد

مثال وظیفه سنتز برای بازیابی ایمیل‌های اعضای کانال اسلک:

// مشخصات ورودی
Type: 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 را می‌توان به حوزه‌های دیگر از جمله موارد زیر گسترش داد:

  • سنتز API گراف‌کیوال با درون‌بینی نوع
  • ارکستراسیون ریزسرویس‌ها در برنامه‌های ابر-بومی
  • یکپارچه‌سازی دستگاه‌های اینترنت اشیاء
  • یکپارچه‌سازی سیستم‌های سازمانی و نوسازی APIهای قدیمی

کار آینده شامل یکپارچه‌سازی یادگیری ماشین برای استنتاج نوع بهتر و گسترش پشتیبانی از الگوهای API ناهمگام است.

8 تحلیل اصلی

APIphany نمایانگر پیشرفت قابل توجهی در سنتز برنامه برای APIهای وب است و به چالش‌های اساسی که رویکردهای قبلی را محدود کرده بود، می‌پردازد. یکپارچه‌سازی انواع معنایی با سنتز مؤلفه‌بنیاد، چارچوب قدرتمندی ایجاد می‌کند که شکاف بین روش‌های صوری و وظایف عملی یکپارچه‌سازی API را پر می‌کند.

مکانیسم استنتاج نوع در APIphany از نظر مفهومی اشتراکاتی با سیستم‌های نوع پالایش در زبان‌هایی مانند Liquid Haskell [1] دارد، اما این مفاهیم را برای دنیای پویا و نیمه‌ساختاریافته APIهای REST تطبیق می‌دهد. این تطبیق بسیار مهم است زیرا برخلاف زبان‌های دارای نوع ایستا که در آن‌ها انواع صریح هستند، APIهای REST اغلب بر روی طرح‌های JSON تکیه می‌کنند که اطلاعات نوع ساختاری اما نه معنایی ارائه می‌دهند.

تکنیک اجرای شبیه‌سازی‌شده به‌ویژه نوآورانه است، که از اجرای نمادین در تأیید برنامه [2] الهام گرفته اما آن را برای سنتز API به کار می‌برد. این رویکرد به نگرانی ایمنی حیاتی اجرای عملیات بالقوه مخرب API در حین فرآیند سنتز می‌پردازد. تکنیک‌های مشابهی در بهینه‌سازی پرس‌وجوی پایگاه داده [3] استفاده شده است، اما APIphany آن‌ها را برای حوزه پیچیده‌تر سنتز برنامه چند-API تطبیق می‌دهد.

هنگام مقایسه با سایر رویکردهای سنتز مانند FlashFill [4] برای تبدیل‌های رشته‌ای یا SyPet [5] برای سنتز مؤلفه‌بنیاد، APIphany نشان می‌دهد که چگونه دانش خاص حوزه (معناشناسی API REST) می‌تواند به طور چشمگیری اثربخشی سنتز را بهبود بخشد. نرخ موفقیت 90.6٪ در وظایف دنیای واقعی به طور قابل توجهی فراتر از چیزی است که از سنتزکننده‌های همه‌منظوره انتظار می‌رود، که فرضیه ضروری بودن سنتز آگاه از حوزه برای کاربردهای عملی را تأیید می‌کند.

مؤلفه مهندسی داده به یک چالش اساسی در یکپارچه‌سازی API می‌پردازد: عدم تطابق امپدانس بین قالب‌های داده API و نیازهای برنامه. این مشکل یادآور چالش‌های تبدیل داده در فرآیندهای ETL (استخراج، تبدیل، بارگذاری) [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.