1 المقدمة
مع صعود البرمجيات كخدمة وهندسة الخدمات المصغرة، أصبحت واجهات برمجة التطبيقات (RESTful APIs) منتشرة في كل مكان في التطبيقات الحديثة. تقدم خدمات مثل Slack وStripe وAWS واجهات برمجة تطبيقات شاملة تحتوي على مئات الطرق، مما يخلق تحديات كبيرة للمطورين للعثور على التركيبة الصحيحة من الطرق لمهامهم.
يتعامل APIphany مع هذا التحدي من خلال التركيب المبنى على المكونات والمصمم خصيصًا لواجهات RESTful APIs. يستخدم النظام أنماطًا دلالية دقيقة لتحديد نية المستخدم وتوجيه عملية البحث، مما يتيح تركيب البرامج الآلي من المواصفات عالية المستوى.
2 الخلفية والأعمال ذات الصلة
2.1 التركيب المبنى على المكونات
تم تطبيق تركيب البرامج المبنى على المكونات بنجاح للتنقل في واجهات برمجة التطبيقات بلغات مثل Java وScala وHaskell. تأخذ هذه المركبات تواقيع الأنماط وأمثلة الإدخال-الإخراج لتوليد مقاطع برامج تؤلف استدعاءات واجهات برمجة التطبيقات بالسلوك المطلوب.
2.2 تحديات واجهات RESTful API
ثلاثة تحديات رئيسية تعقد تطبيق التركيب المبنى على المكونات على واجهات RESTful APIs: (1) نقص الأنماط الدلالية الدقيقة في مواصفات واجهات برمجة التطبيقات، (2) الحاجة إلى معالجة البيانات شبه المهيكلة، و(3) مخاوف السلامة مع تنفيذ استدعاءات واجهات برمجة التطبيقات أثناء التركيب.
3 بنية APIphany
3.1 الاستدلال على الأنماط الدلالية
يقدم APIphany خوارزمية استدلال على الأنماط تزيد مواصفات REST بأنماط دلالية. هذا يتيح تحديدًا أكثر دقة لنية المستخدم ويوجه عملية التركيب بشكل أكثر فعالية.
3.2 تركيب معالجة البيانات
يتضمن النظام تقنيات تركيب فعالة لمعالجة البيانات شبه المهيكلة التي تُواجه عادة عند العمل مع واجهات RESTful APIs، بما في ذلك كائنات ومصفوفات JSON.
3.3 التنفيذ المُحاكى
يستخدم APIphany التنفيذ المُحاكى لتجنب تنفيذ استدعاءات واجهات برمجة التطبيقات الفعلية أثناء التركيب، معالجةً مخاوف السلامة والأداء مع الحفاظ على دقة التركيب.
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 على ثلاث واجهات برمجة تطبيقات حقيقية (Slack وStripe وGitHub) مع 32 مهمة مُستخلصة من مستودعات GitHub وStackOverflow. شملت المهام سيناريوهات تكامل شائعة مثل استرداد رسائل البريد الإلكتروني للأعضاء من قنوات Slack ومعالجة بيانات الدفع من Stripe.
5.2 النتائج والأداء
نجح APIphany في العثور على حلول صحيحة لـ 29 من أصل 32 مهمة (معدل نجاح 90.6٪). من بين هذه، تم الإبلاغ عن 23 حلاً من بين أفضل عشر نتائج تركيب، مما يظهر فعالية النهج الموجه بالأنماط.
معدل النجاح
90.6%
تم حل 29/32 مهمة
أفضل 10 نتائج
79.3%
23 حلاً في أفضل 10
متوسط وقت التركيب
4.2 ثانية
لكل مهمة
6 أمثلة على الأكواد
مثال على مهمة تركيب لاسترداد رسائل البريد الإلكتروني لأعضاء قناة Slack:
// Input specification
Type: ChannelName -> List[Email]
// Synthesized solution
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)
- تكامل أنظمة المؤسسات وتحديث واجهات برمجة التطبيقات القديمة
يشمل العمل المستقبلي دمج التعلم الآلي لتحسين الاستدلال على الأنماط وتوسيع الدعم لأنماط واجهات برمجة التطبيقات غير المتزامنة.
8 التحليل الأصلي
يمثل APIphany تقدمًا كبيرًا في تركيب البرامج لواجهات برمجة التطبيقات الويب، معالجةً التحديات الأساسية التي حدت من النهج السابقة. يخلق دمج الأنماط الدلالية مع التركيب المبنى على المكونات إطار عمل قويًا يربط الفجوة بين الطرق الرسمية ومهام تكامل واجهات برمجة التطبيقات العملية.
تشارك آلية الاستدلال على الأنماط في APIphany أوجه تشابه مفاهيمية مع أنظمة الأنماط المُنقحة في لغات مثل Liquid Haskell [1]، ولكنها تكيف هذه المفاهيم للعالم الديناميكي وشبه المهيكل لواجهات REST APIs. هذا التكيف حاسم لأنه، على عكس اللغات ذات الأنماط الثابتة حيث تكون الأنماط صريحة، تعتمد واجهات REST APIs غالبًا على مخططات JSON التي توفر معلومات كتابية هيكلية ولكنها ليست دلالية.
تقنية التنفيذ المُحاكى مبتكرة بشكل خاص، مستوحاة من التنفيذ الرمزي في التحقق من البرامج [2] ولكن تطبيقها على تركيب واجهات برمجة التطبيقات. يعالج هذا النهج مخاوف السلامة الحرجة لتنفيذ عمليات واجهات برمجة التطبيقات المدمرة المحتملة أثناء عملية التركيب. تم استخدام تقنيات مماثلة في تحسين استعلامات قواعد البيانات [3]، لكن APIphany يكيفها للمجال الأكثر تعقيدًا لتركيب البرامج متعددة واجهات برمجة التطبيقات.
عند المقارنة مع نهج التركيب الأخرى مثل FlashFill [4] لتحويلات السلاسل أو SyPet [5] للتركيب المبنى على المكونات، يوضح APIphany كيف يمكن للمعرفة الخاصة بالمجال (دلالات واجهات REST API) أن تحسن فعالية التركيب بشكل كبير. يتجاوز معدل النجاح البالغ 90.6٪ في المهام الواقعية ما كان متوقعًا من المركبات ذات الأغراض العامة، مما يدعم الفرضية القائلة بأن التركيب الواعي للمجال ضروري للتطبيقات العملية.
يعالج مكون معالجة البيانات تحديًا أساسيًا في تكامل واجهات برمجة التطبيقات: عدم التوافق بين تنسيقات بيانات واجهات برمجة التطبيقات واحتياجات التطبيق. تذكر هذه المشكلة بتحديات تحويل البيانات في عمليات ETL (استخراج، تحويل، تحميل) [6]، لكن APIphany يحلها من خلال التركيب بدلاً من المواصفات اليدوية. يمكن أن يؤثر النهج بشكل محتمل على ممارسات تصميم واجهات برمجة التطبيقات المستقبلية، مشجعًا على معلومات النوع الأكثر منهجية في مواصفات واجهات برمجة التطبيقات.
بالنظر إلى المستقبل، يمكن دمج تقنيات APIphany مع نماذج اللغة الكبيرة لتوليد كود واجهات برمجة التطبيقات. بينما تظهر نماذج مثل 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.