Fyuchers va va'dalar - Futures and promises

Yilda Kompyuter fanlari, kelajak, va'da, kechikishva keyinga qoldirildi uchun ishlatiladigan konstruktsiyalarga murojaat qiling sinxronizatsiya dastur ijro ba'zilarida bir vaqtda dasturlash tillari. Ular dastlab noma'lum bo'lgan natija uchun proksi vazifasini bajaradigan ob'ektni tasvirlaydilar, chunki odatda hisoblash uning qiymati hali to'liq emas.

Atama va'da tomonidan 1976 yilda taklif qilingan Daniel P. Fridman va Devid Uayz,[1]va Piter Xibbard buni chaqirdi oxir-oqibat.[2]Bir oz o'xshash kontseptsiya kelajak tomonidan 1977 yilda qog'ozga kiritilgan Genri Beyker va Karl Xewitt.[3]

Shartlar kelajak, va'da, kechikishva keyinga qoldirildi orasida bir-biridan farq qiladigan bo'lsa-da, ko'pincha bir-birining o'rnida ishlatiladi kelajak va va'da quyida muolaja qilinadi. Xususan, foydalanishni ajratganda, kelajak a faqat o'qish o'zgaruvchini to'ldiruvchi ko'rinishi, va'da esa yozish mumkin, bitta topshiriq kelajak qiymatini belgilaydigan konteyner. Ta'kidlash joizki, kelajakni qaysi o'ziga xos va'da o'z qiymatini belgilamagan holda belgilanishi mumkin va turli xil va'dalar ma'lum bir kelajak qiymatini belgilashi mumkin, ammo bu ma'lum bir kelajak uchun faqat bir marta amalga oshirilishi mumkin. Boshqa hollarda kelajak va va'da birgalikda yaratiladi va bir-biri bilan bog'lanadi: kelajak - bu qiymat, va'da - bu qiymatni belgilaydigan funktsiya - asosan asenkron funktsiya (va'da) ning qaytish qiymati (kelajagi). Kelajak qiymatini belgilash ham deyiladi hal qilish, bajarish, yoki majburiy u.

Ilovalar

Fyuchers va va'dalar kelib chiqishi funktsional dasturlash va tegishli paradigmalar (masalan mantiqiy dasturlash ) qiymatni (kelajakni) qanday hisoblanganligidan (va'da) ajratish, bu hisoblashni yanada moslashuvchan, xususan, uni parallellashtirish orqali amalga oshirishga imkon beradi. Keyinchalik, u foydalanishni topdi tarqatilgan hisoblash, aloqa dumaloq safarlaridan kechikishni kamaytirishda. Keyinchalik, u asenkron dasturlarni yozishga ruxsat berish orqali ko'proq foydalanishga erishdi to'g'ridan-to'g'ri uslub o'rniga, ichida davom ettirish uslubi.

Yashirin va aniq

Fyucherslardan foydalanish bo'lishi mumkin yashirin (kelajakdan har qanday foydalanish odatdagidek o'z qiymatini avtomatik ravishda oladi ma'lumotnoma ) yoki aniq (foydalanuvchi, masalan, qiymatni olish uchun funktsiyani chaqirishi kerak olish usuli java.util.concurrent.Futureyilda Java ). Aniq kelajak qiymatini olish deb atash mumkin chaqmoq yoki majburlash. Aniq fyucherslar kutubxona sifatida amalga oshirilishi mumkin, ammo yashirin fyucherslar odatda tilning bir qismi sifatida amalga oshiriladi.

Asl Baker va Hewitt qog'ozlarida tabiiy ravishda qo'llab-quvvatlanadigan yashirin fyucherslar tasvirlangan aktyor modeli hisoblash va toza ob'ektga yo'naltirilgan dasturlash kabi tillar Kichik munozarasi. Fridman va Uayz gazetasida faqat aniq fyucherslar tasvirlangan, ehtimol aksessuarlardagi yopiq fyucherslarni samarali amalga oshirish qiyinligi aks etgan. Qiyinchilik shundan iboratki, stok apparatlari butun sonlar kabi ibtidoiy ma'lumotlar turlari uchun fyucherslar bilan shug'ullanmaydi. Masalan, qo'shish bo'yicha ko'rsatma qanday ishlashni bilmaydi 3 + kelajak faktorial (100000). Sof aktyor yoki ob'ekt tillarida ushbu muammoni yuborish yo'li bilan hal qilish mumkin kelajak faktorial (100000) xabar +[3], bu kelajakni qo'shishni so'raydi 3 o'z-o'zidan va natijani qaytaring. Xabarni uzatish yondashuvi qachon bo'lishidan qat'iy nazar ishlaydi faktorial (100000) hisoblashni tugatadi va hech qanday chaqish / majburlash kerak emas.

Quvurlarni etkazib berishni va'da qiling

Fyuchersdan foydalanish keskin kamayishi mumkin kechikish yilda tarqatilgan tizimlar. Masalan, fyucherslar imkon beradi quvurlarni etkazib berishni va'da qilish,[4][5] tillarda amalga oshirilgandek E va Joule, deb ham nomlangan chaqiruv oqimi[6] tilda Argus.

An'anaviy ishtirok etgan iborani ko'rib chiqing masofaviy protsedura qo'ng'iroqlari, kabi:

 t3: = (x.a ()) .c (y.b ())

kengaytirilishi mumkin bo'lgan

 t1: = x.a (); t2: = y.b (); t3: = t1.c (t2);

Har bir bayonotga xabar yuborilishi va keyingi bayonot davom etishidan oldin javob olinishi kerak. Masalan, shunday deylik x, y, t1va t2 barchasi bir xil masofadagi mashinada joylashgan. Bunday holda, ushbu operatorga ikkita to'liq tarmoqli sayohat, uchinchi bayonot bajarilishidan oldin amalga oshirilishi kerak. Uchinchi bayonot o'sha uzoqdagi mashinaga yana safarga sabab bo'ladi.

Fyuchers yordamida yuqoridagi ifoda yozilishi mumkin

 t3: = (x <- a ()) <- c (y <- b ())

kengaytirilishi mumkin bo'lgan

 t1: = x <- a (); t2: = y <- b (); t3: = t1 <- c (t2);

Bu erda ishlatiladigan sintaksis E tilida, qaerda x <- a () xabarni yuborishni anglatadi a () asenkron tarzda x. Uchala o'zgaruvchiga darhol ularning natijalari uchun fyucherslar beriladi va ijro keyingi bayonotlarga o'tadi. Keyinchalik qiymatini hal qilishga urinishlar t3 kechikishga olib kelishi mumkin; ammo, truboprovod zarur bo'lgan sayohat sonini kamaytirishi mumkin. Agar oldingi misolda bo'lgani kabi, x, y, t1va t2 barchasi bir xil masofadagi mashinada joylashgan bo'lib, truboprovodli dastur hisoblashi mumkin t3 uch emas, bitta sayohat bilan. Uchta xabar ham bir xil masofadagi mashinada joylashgan ob'ektlarga mo'ljallanganligi sababli, faqat bitta so'rov yuborilishi va natijani o'z ichiga olgan bitta javobni olish kerak. Yuborish t1 <- c (t2) bo'lsa ham bloklamaydi t1 va t2 bir-birlariga turli xil mashinalarda yoki x yoki y.

Va'dadagi quvurlarni parallel ravishda mos kelmaydigan xabar uzatilishidan farq qilish kerak. Parallel xabarni uzatishni qo'llab-quvvatlaydigan tizimda, lekin truboprovod emas, xabar yuboradi x <- a () va y <- b () yuqoridagi misolda parallel ravishda davom etish mumkin, lekin yuborish t1 <- c (t2) ikkalasini ham kutish kerak edi t1 va t2 qabul qilingan edi, hatto qachon ham x, y, t1va t2 bir xil masofadagi mashinada. Ko'plab xabarlarni o'z ichiga olgan murakkab vaziyatlarda truboprovodning nisbatan kechikish afzalligi yanada kuchayadi.

Va'dadagi truboprovodlar bilan ham aralashmaslik kerak truboprovodli xabarlarni qayta ishlash aktyor tizimlarida, bu erda aktyor joriy xabarni qayta ishlashni tugatmasdan oldin keyingi xabar uchun xatti-harakatni belgilashi va bajarishni boshlashi mumkin.

Faqat o‘qish uchun ko‘rishlar

Kabi ba'zi bir dasturlash tillarida Oz, E va AmbientTalk, olish mumkin faqat o'qish uchun ko'rish kelajakda, bu uning qiymatini hal qilishda o'qishga imkon beradi, ammo uni hal qilishga imkon bermaydi:

  • Ozda, !! operatori faqat o'qish uchun ko'rinishni olish uchun ishlatiladi.
  • E va AmbientTalk-da kelajak a qiymatlari juftligi bilan ifodalanadi va'da / hal qiluvchi juftlik. Va'da faqat o'qish uchun mo'ljallangan ko'rinishni anglatadi va kelajakdagi qiymatni belgilash uchun hal qiluvchi kerak.
  • Yilda C ++ 11 a std :: kelajak faqat o'qish uchun ko'rinishni ta'minlaydi. Qiymat to'g'ridan-to'g'ri a yordamida o'rnatiladi std :: va'da, yoki yordamida funktsiya chaqiruvi natijasiga o'rnatiladi std :: packaged_task yoki std :: async.
  • In Dojo Toolkit 1.5-versiyasi bo'yicha kechiktirilgan API, a faqat iste'molchilarga va'da berish ob'ekti faqat o'qish uchun ko'rinishni anglatadi.[7]
  • Yilda Elis ML, fyucherslar a faqat o'qish uchun ko'rishVa'da kelajakni ham, kelajakni hal qilish qobiliyatini ham o'z ichiga oladi[8][9]
  • Yilda .NET 4.0 System.Threading.Tasks.Task faqat o'qish uchun ko'rinishni anglatadi. Qiymatni hal qilish orqali amalga oshirilishi mumkin System.Threading.Tasks.TaskCompletionSource .

Faqat o'qish uchun mo'ljallangan ko'rinishlarni qo'llab-quvvatlash eng kam imtiyoz printsipi, chunki u cheklangan qiymatni belgilash imkoniyatini beradi mavzular buni o'rnatish kerak. Quvurlarni uzatishni ham qo'llab-quvvatlaydigan tizimda, mos kelmaydigan xabarni yuboruvchi (natija bilan) natija uchun faqat o'qish uchun va'da oladi va xabarning maqsadi hal qiluvchini oladi.

Mavzuga oid fyucherslar

Kabi ba'zi tillar Elis ML, kelajak qiymatini hisoblaydigan ma'lum bir ip bilan bog'liq bo'lgan fyucherslarni aniqlang.[9] Ushbu hisoblash ham boshlanishi mumkin g'ayrat bilan kelajak yaratilganda yoki dangasa uning qiymati birinchi zarur bo'lganda. Dangasa kelajak a ga o'xshaydi thunk, kechiktirilgan hisoblash ma'nosida.

Elis ML shuningdek, har qanday mavzu bilan hal qilinishi mumkin bo'lgan fyucherslarni qo'llab-quvvatlaydi va ularni chaqiradi va'dalar.[8] Ushbu foydalanish va'da ta'rif etilganidek, Eda ishlatilishidan farq qiladi yuqorida. Elisda va'da faqat o'qish uchun mo'ljallangan ko'rinish emas va va'da berish quvurlarni qo'llab-quvvatlamaydi. Buning o'rniga, tabiiy ravishda truboprovodlar kelajakda, shu jumladan va'dalar bilan bog'liq bo'lgan taqdirda sodir bo'ladi.

Blokirovka qilish va blokirovka qilmaydigan semantikani taqiqlash

Agar kelajak qiymatiga mos kelmasa, masalan, unga xabar yuborish yoki aniq konstruktsiya yordamida uni kutish orqali. qachon E-da, kelgusida xabar qabul qilinmaguncha yoki kutish tugamaguncha hal qilinguncha kechiktirishda hech qanday qiyinchilik bo'lmaydi. Bu sof aktyor tillari kabi mutlaqo asenkron tizimlarda ko'rib chiqiladigan yagona holat.

Biroq, ba'zi tizimlarda bunga urinish ham mumkin darhol yoki sinxron ravishda kelajak qiymatiga kirish. Keyin dizaynni tanlash kerak:

  • kirish joriy masalani yoki kelajak hal bo'lguncha jarayonni bloklashi mumkin (ehtimol vaqt tugashi bilan). Bu semantikasi ma'lumotlar oqimining o'zgaruvchilari tilda Oz.
  • sinxron kirish urinishi har doim ham xatoga ishora qilishi mumkin, masalan istisno. Bu E.dagi uzoqdan va'dalarning semantikasi.[10]
  • potentsial ravishda, agar kelajak allaqachon hal qilingan bo'lsa, kirish muvaffaqiyatli bo'lishi mumkin, ammo agar bunday bo'lmasa, xato haqida signal beradi. Bu nondeterminizmni joriy etishning salbiy tomoni va potentsiali bo'lishi mumkin poyga shartlari, va odatiy bo'lmagan dizayn tanlovi kabi ko'rinadi.

Birinchi imkoniyatning misoli sifatida C ++ 11, kelajak qiymatiga muhtoj bo'lgan ipni qo'ng'iroq qilib bo'lguncha to'sib qo'yishi mumkin Kutmoq() yoki olish () a'zo funktsiyalari. Bundan tashqari, kutish paytida kutish vaqti tugashini belgilashingiz mumkin Kutmoq() yoki wait_until () noaniq blokirovka oldini olish uchun a'zo funktsiyalari. Agar kelajak chaqiruvdan kelib chiqqan bo'lsa std :: async keyin blokirovka kutish (vaqt tugamay) natijani kutish satrida hisoblash uchun funktsiyani sinxron chaqirilishiga olib kelishi mumkin.

Tegishli tuzilmalar

Kelajak ning alohida holati Voqea (sinxronizatsiya ibtidoiy), bu faqat bir marta bajarilishi mumkin. Umuman olganda, hodisalarni dastlabki bo'sh holatga qaytarish va shu bilan siz xohlagancha bajarish mumkin.[11]

An I-var (tilda bo'lgani kabi) Id ) yuqorida ta'riflangan semantikani blokirovka qiladigan kelajakdir. An I-tuzilish a ma'lumotlar tuzilishi tarkibida I-vars mavjud. Turli xil qiymatlar bilan bir necha marta o'rnatilishi mumkin bo'lgan tegishli sinxronizatsiya konstruktsiyasi deyiladi M-var. M-vars atom operatsiyalarini qo'llab-quvvatlaydi olish yoki qo'yish joriy qiymat, bu erda qiymatni olish ham M-var ni dastlabki holatiga qaytaradi bo'sh davlat.[12]

A bir vaqtning o'zida mantiqiy o'zgaruvchi[iqtibos kerak ] kelajakka o'xshaydi, lekin tomonidan yangilanadi birlashtirish, xuddi shu tarzda mantiqiy o'zgaruvchilar yilda mantiqiy dasturlash. Shunday qilib, uni bir necha bor birlashtirib bo'lmaydigan qiymatlar bilan bog'lash mumkin, ammo uni bo'sh yoki echilmagan holatga qaytarib bo'lmaydi. Oz oqimidagi o'zgaruvchilar bir vaqtning o'zida mantiqiy o'zgaruvchilar sifatida ishlaydi va yuqorida aytib o'tilganidek blokirovka qiluvchi semantikaga ega.

A bir vaqtda cheklash o'zgaruvchisi qo'llab-quvvatlash uchun bir vaqtning o'zida mantiqiy o'zgaruvchilarning umumlashtirilishi cheklash mantiqiy dasturlash: cheklov bo'lishi mumkin toraygan mumkin bo'lgan qiymatlarning kichik to'plamlarini ko'rsatib, bir necha marta. Odatda, cheklov toraygan har doim ishlashi kerak bo'lgan tanani belgilashning bir usuli mavjud; bu qo'llab-quvvatlash uchun kerak cheklovlarni ko'paytirish.

Kelajakning turli shakllarining ekspresivligi o'rtasidagi munosabatlar

Istalgan ipga xos fyucherslar kelajakni yaratish bilan bir vaqtda qiymatni hisoblash uchun ipni yaratish orqali to'g'ridan-to'g'ri ipga xos bo'lmagan fyucherslarda amalga oshirilishi mumkin. Bunday holatda faqat o'qish uchun mo'ljallangan ko'rinishni mijozga qaytarish maqsadga muvofiqdir, shunda faqat yangi yaratilgan ish zarrachasi kelajakni hal qilishi mumkin.

Yalang'och ipga xos fyucherslarni (masalan, Elis ML tomonidan taqdim etilganidek), ipga xos bo'lmagan fyucherslar nuqtai nazaridan amalga oshirish uchun kelajak qiymati birinchi marta qachon zarurligini aniqlaydigan mexanizm kerak (masalan, WaitNeeded Ozda qurish[13]). Agar barcha qiymatlar ob'ektlar bo'lsa, shaffof ekspeditorlik ob'ektlarini amalga oshirish imkoniyati etarli bo'ladi, chunki ekspeditorga yuborilgan birinchi xabar kelajakning qiymati zarurligini ko'rsatadi.

Tizim xabarlarni uzatishni qo'llab-quvvatlaydi deb hisoblagan holda, ipga xos bo'lmagan fyucherslarni kelajakdagi o'z oqimiga xabar yuborish orqali amalga oshirish mumkin. Biroq, bu keraksiz murakkablik sifatida qaralishi mumkin. Mavzularga asoslangan dasturlash tillarida eng ekspresiv yondashuv ipga xos bo'lmagan fyucherslarni, faqat o'qish uchun qarashlarni va WaitNeeded shaffof uzatishni qurish yoki qo'llab-quvvatlash.

Baholash strategiyasi

The baholash strategiyasi muddatli bo'lishi mumkin bo'lgan fyucherslar kelajakka qo'ng'iroq qiling, deterministik emas: kelajakning qiymati kelajak yaratilgandan va uning qiymatidan foydalanilgunga qadar bir muncha vaqt ichida baholanadi, ammo aniq vaqt oldindan belgilanmaydi va yugurishdan yugurishga o'zgarishi mumkin. Hisoblash kelajak yaratilishi bilanoq boshlanishi mumkin (ishtiyoq bilan baholash ) yoki faqat qiymat aslida kerak bo'lganda (dangasa baholash ), va qisman to'xtatib qo'yilishi mumkin yoki bir marotaba bajarilishi mumkin. Kelajakning qiymati tayinlangandan so'ng, kelajakdagi kirishlarda u hisoblanmaydi; bu shunga o'xshash yod olish ichida ishlatilgan ehtiyoj bo'yicha qo'ng'iroq qiling.

A dangasa kelajak - bu deterministik ravishda dangasa baholash semantikasiga ega bo'lgan kelajak: kelajak qiymatini hisoblash, ehtiyoj bo'yicha chaqirilgandek, qiymat birinchi zarur bo'lganda boshlanadi. Dangasa fyucherslar baholash strategiyasi sukut bo'yicha dangasa bo'lmagan tillarda qo'llaniladi. Masalan, ichida C ++ 11 o'tish orqali bu kabi dangasa fyucherslarni yaratish mumkin std :: launch :: kechiktirilgan ishga tushirish siyosati std :: async, qiymatni hisoblash funktsiyasi bilan birga.

Aktyor modelidagi kelajak semantikasi

Aktyor modelida shaklning ifodasi kelajak <Expression> ga qanday javob berishi bilan belgilanadi Baho atrof-muhit bilan xabar E va mijoz C quyidagicha: kelajakdagi ifoda. ga javob beradi Baho mijozni yuborish orqali xabar C yangi yaratilgan aktyor F (baholash uchun javob uchun proksi-server <Expression>) qaytish qiymati sifatida bir vaqtning o'zida yuborish bilan <Expression> an Baho atrof-muhit bilan xabar E va mijoz C. Ning standart harakati F quyidagicha:

  • Qachon F so'rov oladi R, keyin u allaqachon javob olganligini tekshiradi (bu qaytarish qiymati yoki tashlangan istisno bo'lishi mumkin) baholashdan <Expression> quyidagicha davom etadi:
    1. Agar u allaqachon javobga ega bo'lsa V, keyin
      • Agar V qaytish qiymati, keyin so'rov yuboriladi R.
      • Agar V istisno bo'lib, u buyurtmachiga so'rov yuboriladi R.
    2. Agar u allaqachon javobga ega bo'lmasa, unda R ichidagi so'rovlar navbatida saqlanadi F.
  • Qachon F javob oladi V baholashdan <Expression>, keyin V ichida saqlanadi F va
    • Agar V qaytish qiymati, keyin navbatdagi barcha so'rovlar yuboriladi V.
    • Agar V istisno bo'lib, u har bir navbatdagi so'rovlarning xaridoriga beriladi.

Biroq, ba'zi fyucherslar so'rovlar bilan ko'proq parallellikni ta'minlash uchun maxsus usullar bilan hal qilishlari mumkin. Masalan, ifoda 1 + kelajakdagi faktorial (n) raqam kabi o'zini tutadigan yangi kelajak yaratishi mumkin 1 + faktorial (n). Ushbu hiyla-nayrang har doim ham ishlamaydi. Masalan, quyidagi shartli ifoda:

agar m> kelajakdagi faktorial (n) keyin chop etish ("kattaroq") boshqa chop etish ("kichikroq")

kelajakgacha to'xtatib turadi faktorial (n) degan savolga javob berdi m o'zidan kattaroqdir.

Tarix

The kelajak va / yoki va'da kabi dasturlash tillarida birinchi bo'lib konstruktsiyalar amalga oshirildi MultiLisp va 1-harakat. Muloqot uchun mantiqiy o'zgaruvchilardan foydalanish bir vaqtda mantiqiy dasturlash tillar kelajakka juda o'xshash edi. Ular boshlandi Freeze bilan prolog va IC Prolog, va Relational Language bilan bir vaqtda haqiqiy bir vaqtda ibtidoiy bo'lib qoldi Prolog, qo'riqlangan Shoxning gaplari (GHC), Parlog, Strand, Vulkan, Yanus, Oz-Motsart, Oqim Java va Elis ML. Bitta topshiriq I-var dan ma'lumotlar oqimini dasturlash kelib chiqishi tillar Id va Reppy-ga kiritilgan Bir vaqtda ML, bir vaqtning o'zida mantiqiy o'zgaruvchiga o'xshaydi.

Va'da qilingan truboprovod texnikasi (kechikishni engish uchun fyuchers yordamida) ixtiro qilingan Barbara Liskov va Liuba Shrira 1988 yilda,[6] va mustaqil ravishda Mark S. Miller, Din Tribble va Rob Jellingxaus kontekstida Xanadu loyihasi taxminan 1989 yil.[14]

Atama va'da Liskov va Shrira tomonidan ishlab chiqilgan, garchi ular truboprovod mexanizmiga nomi bilan murojaat qilishgan chaqiruv oqimi, hozirda kamdan kam qo'llaniladi.

Liskovda ham, Shrirada ham tasvirlangan dizayn, ham Xanaduda va'da qilingan quvurlarni amalga oshirishda va'da qiymatlari chegarasi yo'q edi. birinchi sinf: argument, yoki qo'ng'iroq yoki jo'natish bilan qaytarilgan qiymat to'g'ridan-to'g'ri va'da bo'lishi mumkin emas edi (shuning uchun ilgari keltirilgan va'da berish liniyasining misoli boshqasiga dalil sifatida yuborilgan natijalar uchun ishlatilgan va'da berish liniyasining misoli bo'lmaydi) to'g'ridan-to'g'ri call-stream dizaynida yoki Xanadu dasturida ifodalanadi). Ko'rinib turibdiki, Argusning biron bir ommaviy nashrida va'dalar va chaqiriqlar hech qachon amalga oshirilmagan,[15] Liskov va Shrira qog'ozlarida ishlatiladigan dasturlash tili. Argus rivojlanishi 1988 yil atrofida to'xtadi.[16] Xanadu va'da qilingan quvur liniyasini amalga oshirish Udanax Gold uchun manba kodi chiqarilgandan keyingina ommaga ma'lum bo'ldi[17] 1999 yilda va hech qachon nashr etilgan hujjatlarda tushuntirib berilmagan.[18] Keyinchalik Joule va E dasturlari birinchi darajadagi va'dalar va qarorlarni to'liq qo'llab-quvvatlaydi.

Aktyorlar seriyasini o'z ichiga olgan bir nechta dastlabki aktyor tillari,[19][20] Parallel xabarlarni uzatishni ham, quvurli xabarlarni qayta ishlashni ham qo'llab-quvvatladi, ammo quvurlarni uzatishni va'da qilmaydi. (Dastlabki ikkitasida ushbu xususiyatlarning oxirgi qismini amalga oshirish texnik jihatdan mumkin bo'lsa-da, qonun tillarida buni amalga oshirganligi to'g'risida hech qanday dalil yo'q).

2000 yildan keyin fyucherslar va va'dalarga bo'lgan qiziqish, ulardan foydalanish tufayli katta darajada jonlandi javob berish foydalanuvchi interfeyslari va boshqalar veb-ishlab chiqish, tufayli so'rov - javob xabarlarni uzatish modeli. Hozirgi kunda bir nechta asosiy tillar kelajak va va'dalar uchun tilni qo'llab-quvvatlaydi, ayniqsa, ular tomonidan ommalashtirilgan FutureTask Java 5-da (2004 yilda e'lon qilingan)[21] va asenkron va kutmoq .NET 4.5-dagi qurilishlar (2010 yilda e'lon qilingan, 2012 yilda chiqarilgan)[22][23] asosan ilhomlangan asenkron ish oqimlari F # ning,[24] bu 2007 yilga to'g'ri keladi.[25] Keyinchalik bu boshqa tillar tomonidan qabul qilingan, xususan Dart (2014),[26] Python (2015),[27] Hack (HHVM) va ECMAScript 7 (JavaScript), Scala va C ++ loyihalari.

Amalga oshirilishlar ro'yxati

Ba'zi dasturlash tillari to'g'ridan-to'g'ri tilni qo'llab-quvvatlash orqali yoki standart kutubxonada fyucherslarni, va'dalarni, mantiqiy o'zgaruvchilarni, ma'lumotlar oqimining o'zgaruvchilarini yoki I-varlarni qo'llab-quvvatlaydi.

Dasturlash tili bo'yicha fyuchers va va'dalar bilan bog'liq tushunchalar ro'yxati

Va'da qilingan quvurlarni qo'llab-quvvatlovchi tillarga quyidagilar kiradi:

Fyucherslarning nostandart, kutubxonaga asoslangan dasturlari ro'yxati

Korutinlar

Fyucherslarni amalga oshirish mumkin korutinlar[27] yoki generatorlar,[95] natijada bir xil baholash strategiyasi (masalan, kooperativ ko'p vazifali yoki dangasa baho).

Kanallar

Fyucherslarni osongina amalga oshirish mumkin kanallar: kelajak - bu bitta elementli kanal, va'da - bu kelajakni amalga oshiradigan kanalga yuboradigan jarayon.[96][97] Bu fyucherslarni CSP va kabi kanallarni qo'llab-quvvatlaydigan bir vaqtda dasturlash tillarida amalga oshirishga imkon beradi Boring. Olingan fyucherslar aniq, chunki ularga faqat baho berish o'rniga kanaldan o'qish orqali kirish kerak.

Shuningdek qarang

Adabiyotlar

  1. ^ Fridman, Doniyor; Devid Uayz (1976). Amaliy dasturlashning ko'p ishlov berishga ta'siri. Parallel ishlov berish bo'yicha xalqaro konferentsiya. 263-272 betlar.
  2. ^ Hibbard, Piter (1976). Parallel ishlov berish moslamalari. Algoritmik tillardagi yangi yo'nalishlar, (tahr.) Stiven A. Shuman, IRIA, 1976 yil.
  3. ^ Genri Beyker; Karl Xyuitt (1977 yil avgust). Jarayonlarni ko'paytiradigan axlat yig'ish. Sun'iy intellektni dasturlash tillari bo'yicha simpozium materiallari to'plami. ACM SIGPLAN Xabarnomalari 12, 8. 55-59 betlar.
  4. ^ Quvurlarni etkazib berishni erights.org saytida va'da qiling
  5. ^ C2 wiki-da quvurlarni etkazib berishni va'da qiling
  6. ^ a b Barbara Liskov; Liuba Shrira (1988). "Va'dalar: tarqatilgan tizimlarda samarali asenkron protsedura qo'ng'iroqlarini lingvistik qo'llab-quvvatlash". Dasturlash tillarini loyihalash va amalga oshirish bo'yicha SIGPLAN '88 konferentsiyasi materiallari; Atlanta, Jorjiya, Amerika Qo'shma Shtatlari. ACM. 260-267 betlar. doi:10.1145/53990.54016. ISBN  0-89791-269-1. Shuningdek nashr etilgan ACM SIGPLAN xabarnomalari 23(7).
  7. ^ Dojo bilan ishonchli va'dalar kechiktirildi, Sayt qalamchasi, 3-may, 2010-yil
  8. ^ a b "Va'da", Elis qo'llanmasi, DE: Uni-SB
  9. ^ a b "Kelajak", Elis qo'llanmasi, DE: Uni-SB
  10. ^ Va'da, Elektron huquqlar
  11. ^ 500 satr yoki undan kam, "Asintsio Koroutinli veb-brauzer" A.Jessi Jiryu Devis va Gvido van Rossum "amalga oshirish bu erda keltirilgan Kelajak o'rniga asyncio.Event-dan foydalanadi. Farq shundaki, Voqeani tiklash mumkin, kelajak esa hal qilinganidan kutilishga o'tishi mumkin emas."
  12. ^ Parallel MVarni boshqarish, Haskell, arxivlangan asl nusxasi 2009 yil 18 aprelda
  13. ^ WaitNeeded, Motsart Oz
  14. ^ Va'da, Quyoshsiz dengiz, arxivlangan asl nusxasi 2007 yil 23 oktyabrda
  15. ^ Argus, MIT
  16. ^ Liskov, Barbara, Tarqatilgan hisoblash va Argus, Og'zaki tarix, IEEE GHN
  17. ^ Oltin, Udanax, arxivlangan asl nusxasi 2008 yil 11 oktyabrda
  18. ^ Quvur liniyasi, Elektron huquqlar
  19. ^ Genri Liberman (1981 yil iyun). "1-aktni oldindan ko'rish". MIT AI memo 625. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering)
  20. ^ Genri Liberman (1981 yil iyun). "Ko'p narsalarni chalkashtirmasdan bir vaqtning o'zida o'ylash: 1-aktdagi paralellik". MIT AI memo 626. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering)
  21. ^ Gets, Brayan (2004 yil 23-noyabr). "JDK 5.0 da moslik".
  22. ^ a b "Async in 4.5: Kutishga arziydi - .NET Blog - Sayt sahifasi - MSDN bloglari". Blogs.msdn.com. Olingan 13 may 2014.
  23. ^ a b v "Async va Await (C # va Visual Basic) bilan mos kelmaydigan dasturlash". Msdn.microsoft.com. Olingan 13 may 2014.
  24. ^ Tomas Petricek (2010 yil 29 oktyabr). "Asenkron C # va F # (I.): bir vaqtning o'zida kirish".
  25. ^ Don Syme; Tomas Petricek; Dmitriy Lomov (2010 yil 21 oktyabr). "F # asinxron dasturlash modeli, PADL 2011".
  26. ^ a b Gilad Bracha (2014 yil oktyabr). "Dart tilidagi asenkronizatsiyani qo'llab-quvvatlash: 1-bosqich".
  27. ^ a b "PEP 0492 - mos kelmaydigan va sintaksisini kutadigan koroutinlar".
  28. ^ Kenjiro Taura; Satoshi Matsuoka; Akinori Yonezava (1994). "ABCL / f: kelajakka asoslangan polimorfik tipdagi bir vaqtda ob'ektga yo'naltirilgan til - uni ishlab chiqish va amalga oshirish." Parallel algoritmlarni spetsifikatsiyasi bo'yicha DIMACS seminari materiallarida, Diskret matematika va nazariy informatika bo'yicha Dimacs seriyasidagi 18-raqam. Amerika matematik jamiyati. 275–292 betlar. CiteSeerX  10.1.1.23.1161.
  29. ^ "Dart SDK dart async Completer".
  30. ^ "Vazifa".
  31. ^ Stiv Dekorte (2005). "Io, dasturlash tili".
  32. ^ Boy Hikki (2009). "changes.txt 1.1.x da Richhickeyning kiyinishidan".
  33. ^ Seyf Xaridi; Nils Franzen. "Oz qo'llanmasi". Mozart Global foydalanuvchi kutubxonasi. Olingan 12 aprel 2011.
  34. ^ Python 3.2 versiyasi
  35. ^ Python 3.5 versiyasi
  36. ^ "Fyuchers bilan parallellik". PLT. Olingan 2 mart 2012.
  37. ^ Perl 6-dagi darsni va'da qiling
  38. ^ Oddiy Lisp Blackbird
  39. ^ Umumiy Lisp g'ayratli kelajak2
  40. ^ Parallel ravishda Lisp - Common Lisp uchun parallel dasturlash kutubxonasi
  41. ^ Umumiy Lisp PCall
  42. ^ "30-bob. Mavzu 4.0.0". Olingan 26 iyun 2013.
  43. ^ "Dlib C ++ Library #thread_pool". Olingan 26 iyun 2013.
  44. ^ "QtCore 5.0: QFuture sinfi". Qt loyihasi. Arxivlandi asl nusxasi 2013 yil 1-iyun kuni. Olingan 26 iyun 2013.
  45. ^ "Seastar". Seastar loyihasi. Olingan 22 avgust 2016.
  46. ^ "GitHub - facebook / folly: ochiq manba C ++ kutubxonasi Facebookda ishlab chiqilgan va ishlatilgan". 8-yanvar, 2019 yil.
  47. ^ "POCO slaydlari" (PDF).
  48. ^ "HPX". 10 fevral 2019 yil.
  49. ^ Groovy GPars Arxivlandi 2013 yil 12 yanvar Orqaga qaytish mashinasi
  50. ^ Cujo.js
  51. ^ JavaScript qachon .js
  52. ^ Va'dalar / A + spetsifikatsiyasi
  53. ^ va'dalar
  54. ^ JavaScript MochKit.Async
  55. ^ Javascript Angularjs
  56. ^ JavaScript tugunni va'da qilish
  57. ^ JavaScript Q
  58. ^ JavaScript RSVP.js
  59. ^ YUI JavaScript sinf kutubxonasi
  60. ^ YUI JavaScript va'da klassi
  61. ^ JavaScript Bluebird
  62. ^ Java JDeferred
  63. ^ Java ParSeq
  64. ^ Maqsad-C MAFuture GitHub
  65. ^ Maqsad-C MAFuture mikeash.com
  66. ^ Maqsad-C RXPromise
  67. ^ ObjC-CollapsingFutures
  68. ^ Maqsad-C PromiseKit
  69. ^ Maqsad-C objc-va'da
  70. ^ Maqsad-C OAPromise
  71. ^ OCaml Lazy
  72. ^ Perl Future
  73. ^ Perl va'da qilmoqda
  74. ^ Perl refleksi
  75. ^ Perl va'dasi :: ES6
  76. ^ PHP reaktsiyasi / va'da
  77. ^ Python-ga o'rnatilgan dastur
  78. ^ pitonfutures
  79. ^ Twisted Muddatlar
  80. ^ R to'plami kelajak
  81. ^ kelajak
  82. ^ Ruby Promise marvaridi
  83. ^ Ruby libuv
  84. ^ Ruby Seluloid marvaridi
  85. ^ Ruby kelajak manbasi
  86. ^ fyuchers-rs sandig'i
  87. ^ Twitterning kutubxonasi
  88. ^ Swift Async
  89. ^ Swift FutureKit
  90. ^ Swift Apple GCD
  91. ^ Swift FutureLib
  92. ^ bignerdranch / Ertelenmiş
  93. ^ Thomvis / BrightFutures
  94. ^ tcl-va'da
  95. ^ Async / kutish haqiqiy muammoni hal qiladimi?
  96. ^ Til namunalariga o'ting Fyuchers
  97. ^ Til naqshlariga o'ting

Tashqi havolalar