1 Utangulizi

Pamoja na kuongezeka kwa programu-kama-huduma na miundo ya huduma ndogo, API za RESTful zimekuwa zikitumika kila mahali katika programu za kisasa. Huduma kama vile Slack, Stripe, na AWS hutoa API pana zenye mamia za mbinu, na hii inaleta changamoto kubwa kwa watengenezaji programu kupata mchanganyiko sahihi wa mbinu kwa ajili ya kazi zao.

APIphany inashughulikia changamoto hii kupitia usanisi unaozingatia vipengele na umeundwa mahsusi kwa API za RESTful. Mfumo huu hutumia aina maalum za kimaanina kubainisha dhamira ya mtumiaji na kuongoza mchakato wa utafutaji, na hivyo kuwezesha usanisi wa programu uliojaa kutoka kwa vipimo vya kiwango cha juu.

2 Msingi na Kazi Inayohusiana

2.1 Usanisi Unaozingatia Vipengele

Usanisi wa programu unaozingatia vipengele umetumika kwa mafanikio kwa API katika lugha kama Java, Scala, na Haskell. Visanisi hivi huchukua saini za aina na mifano ya pembejeo-pato ili kutoa vipande vya programu vinavyounganisha wito wa API na tabia inayotakiwa.

2.2 Changamoto za API za RESTful

Changamoto tatu kuu hufanya kuwa ngumu kutumia usanisi unaozingatia vipengele kwa API za RESTful: (1) ukosefu wa aina maalum za kimaanina katika vipimo vya API, (2) hitaji la usindikaji data ulio na muundo kiasi, na (3) wasiwasi wa usalama kuhusu utekelezaji wa wito wa API wakati wa usanisi.

3 Muundo wa APIphany

3.1 Ukisiaji wa Aina za Kimaanina

APIphany inaletwa algorithm ya ukisiaji wa aina ambayo huongeza vipimo vya REST kwa aina za kimaanina. Hii huwezesha ubainishaji sahihi zaidi wa dhamira ya mtumiaji na kuongoza mchakato wa usanisi kwa ufanisi zaidi.

3.2 Usanisi wa Usindikaji Data

Mfumo huu unajumuisha mbinu bora za usanisi kwa ajili ya kusindika data iliyo na muundo kiasi ambayo hukutana mara kwa mara wakati wa kufanya kazi na API za RESTful, ikiwemo vitu na safu za JSON.

3.3 Utekelezaji Ulioigwa

APIphany hutumia utekelezaji ulioigwa ili kuepuka kutekeleza wito halisi wa API wakati wa usanisi, na hivyo kushughulikia masuala ya usalama na ufanisi huku ukidumia usahihi wa usanisi.

4 Utekelezaji wa Kiufundi

4.1 Uundaji Rasmi wa Mfumo wa Aina

Mfumo wa aina katika APIphany unapanua mifumo ya kawaida ya aina kwa maelezo ya kimaanina. Uamuzi msingi wa aina umeundwa rasmi kama ifuatavyo:

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

Ambapo $\Gamma$ ni mazingira ya aina, $e$ ni usemi, $\tau$ ni aina ya msingi, na $\phi$ ni uboreshaji wa kimaanina unaokamata tabia ya usemi.

4.2 Algorithm ya Usanisi

Algorithm ya usanisi hutumia utafutaji unaoelekezwa na aina pamoja na kurudi nyuma. Nafasi ya utafutaji inafafanuliwa na:

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

Algorithm huchagua na kuondoa wagombea batili mapema kwa kutumia vikwazo vya aina na uboreshaji wa kimaanina.

5 Tathmini ya Kielelezo

5.1 Mbinu

APIphany ilitathminiwa kwenye API tatu za ulimwengu halisi (Slack, Stripe, GitHub) kwa kazi 32 zilizochaguliwa kutoka kwa hifadhi za GitHub na StackOverflow. Kazi zilijumuisha mazingira ya kawaida ya kuunganisha kama vile kuchukua barua pepe za wanachama kutoka kwenye vituo vya Slack na kusindika data ya malipo kutoka Stripe.

5.2 Matokeo na Ufanisi

APIphany ilipata mafanikio kupata suluhu sahihi kwa kazi 29 kati ya 32 (kiwango cha mafanikio cha 90.6%). Miongoni mwa hizi, suluhu 23 ziliripotiwa kuwa miongoni mwa matokeo kumi bora ya usanisi, na hii inaonyesha ufanisi wa mbinu inayoelekezwa na aina.

Kiwango cha Mafanikio

90.6%

Kazi 29/32 zimetatuliwa

Matokeo 10 Bora

79.3%

Suluhu 23 kwenye 10 bora

Muda wa Wastani wa Usanisi

4.2s

Kwa kila kazi

6 Mifano ya Msimbo

Mfano wa kazi ya usanisi ya kuchukua barua pepe za wanachama wa kituo cha Slack:

// Uainishaji wa pembejeo
Aina: JinaLaKituo -> Orodha[BaruaPepe]

// Suluhu iliyosanisiwa
function pataBaruaPepeZaKituo(jinaLaKituo) {
  const vituo = orodha_ya_mazungumzo();
  const kituoLenyeLengo = vituo.find(k => k.name === jinaLaKituo);
  const vitambulishoVyaWanachama = wanachama_wa_mazungumzo(kituoLenyeLengo.id);
  return vitambulishoVyaWanachama.map(kitambulisho => {
    const mtumiaji = taarifa_za_watumiaji(kitambulisho);
    return mtumiaji.profile.baruaPepe;
  });
}

7 Matumizi na Mwelekeo wa Baadaye

Mbinu ya APIphany inaweza kupanuliwa kwa nyanja zingine ikiwemo:

  • Usanisi wa API za GraphQL kwa kuchunguza aina
  • Uundaji wa huduma ndogo katika programu za wingu
  • Ujumuishaji wa vifaa vya Internet of Things (IoT)
  • Ujumuishaji wa mifumo ya biashara na usasishaji wa API za zamani

Kazi ya baadaye inajumuisha kuunganisha ujifunzaji wa mashine kwa ajili ya ukisiaji bora wa aina na kupanua usaidizi kwa mifumo ya API isiyo ya wakati mmoja.

8 Uchambuzi wa Asili

APIphany inawakilisha maendeleo makubwa katika usanisi wa programu kwa API za wavuti, na inashughulikia changamoto za msingi ambazo zimezuia mbinu za zamani. Ujumuishaji wa aina za kimaanina na usanisi unaozingatia vipengele huunda mfumo wenye nguvu unaovunja pengo kati ya mbinu rasmi na kazi za vitendo za ujumuishaji wa API.

Utaratibu wa ukisiaji wa aina katika APIphany una mfanano wa dhana na mifumo ya aina ya uboreshaji katika lugha kama Liquid Haskell [1], lakini inabadilisha dhana hizi kwa ajili ya ulimwengu wa API za REST wenye mienendo na muundo kiasi. Mabadiliko haya ni muhimu sana kwa sababu, tofauti na lugha zenye aina zilizowekwa wazi ambapo aina zinaonekana wazi, API za REST mara nyingi hutegemea miundo ya JSON ambayo hutoa taarifa ya muundo lakini sio taarifa ya kimaanina ya aina.

Mbinu ya utekelezaji ulioigwa ni ya ubunifu sana, ikichukua msukumo kutoka kwa utekelezaji wa ishara katika uthibitishaji wa programu [2] lakini inaitumia kwa usanisi wa API. Mbinu hii inashughulikia wasiwasi muhimu wa usalama wa kutekeleza shughuli za API zenye uwezekano wa kuharibu wakati wa mchakato wa usanisi. Mbinu kama hizi zimetumika katika uboreshaji wa maswali ya hifadhidata [3], lakini APIphany inazibadilisha kwa ajili ya nyanja ngumu zaidi ya usanisi wa programu yenye API nyingi.

Ikilinganishwa na mbinu zingine za usanisi kama FlashFill [4] kwa mabadiliko ya mfuatano au SyPet [5] kwa usanisi unaozingatia vipengele, APIphany inaonyesha jinsi ujuzi maalum wa nyanja (maana ya API za REST) unaweza kuboresha kwa kiasi kikubwa ufanisi wa usanisi. Kiwango cha mafanikio cha 90.6% kwenye kazi za ulimwengu halisi kinazidi kwa kiasi kikubwa kinachotarajiwa kutoka kwa visanisi vya madhumuni ya jumla, na hii inasaidia dhana kwamba usanisi unaotambua nyanja ni muhimu kwa matumizi ya vitendo.

Kipengele cha usindikaji data kinashughulikia changamoto ya msingi katika ujumuishaji wa API: kutopatana kati ya miundo ya data ya API na mahitaji ya programu. Tatizo hili linakumbusha changamoto za mabadiliko ya data katika michakato ya ETL (Toa, Badilisha, Pakia) [6], lakini APIphany inalitatua kupitia usanisi badala ya uainishaji wa mikono. Mbinu hii inaweza uwezekano kuathiri desturi za baadaye za kubuni API, na hivyo kuhimiza taarifa za aina zilizo na utaratibu zaidi katika vipimo vya API.

Kwa kuangalia mbele, mbinu za APIphany zinaweza kuunganishwa na miundo kubwa ya lugha kwa ajili ya utengenezaji wa msimbo wa API. Ingawa miundo kama GPT-3 [7] inaonyesha uwezo wa kushangaza kwa utengenezaji wa msimbo, haina usahihi wa kimaanina na dhamana za usalama za usanisi unaoelekezwa na aina. Mbinu mseto inayochanganya utengenezaji wa neva na uthibitishaji unaoelekezwa na aina inaweza kuwakilisha mpaka unaofuata katika usanisi wa programu wa vitendo.

9 Marejeo

  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.