Thunk - Thunk

Yilda kompyuter dasturlash, a thunk a subroutine qo'shimcha hisoblashni boshqa subroutinaga kiritish uchun ishlatiladi. Thunks birinchi navbatda hisoblashni uning natijasi kerak bo'lguncha kechiktirish yoki boshqa subroutinning boshida yoki oxirida operatsiyalarni kiritish uchun ishlatiladi. Ularda ko'plab boshqa dasturlar mavjud kompilyator kodini yaratish va modulli dasturlash.

Bu atama kulgili, noto'g'ri, O'tgan sifatdosh "o'ylayman" ning. Ya'ni, "tejamkor qiymat" uni hisoblash tartibi o'ylangandan yoki bajarilgandan so'ng paydo bo'ladi.[1]

Fon

Ning dastlabki yillari kompilyator tadqiqotlar boshqalari bilan keng tajriba o'tkazdi baholash strategiyalari. Agar argumentlar doimiy emas, balki ixtiyoriy matematik ifodalar bo'lishi mumkin bo'lsa, subroutine chaqiruvini qanday kompilyatsiya qilish kerakligi asosiy savol edi. "Yagona yondashuv" nomi bilan tanilganqiymati bo'yicha qo'ng'iroq qilish ", qo'ng'iroqdan oldin barcha argumentlarni hisoblab chiqadi va natijada olingan qiymatlarni pastki dasturga o'tkazadi. Raqibda"ism bilan qo'ng'iroq qiling "yondashuvi, pastki dastur baholanmagan argument ifodasini oladi va uni baholashi kerak.

"Ism bilan qo'ng'iroq qilish" ning sodda tadbiri subproginadagi mos keladigan parametrning har bir ko'rinishi uchun argument ifodasi kodini almashtirishi mumkin, ammo bu dasturning bir nechta versiyasini va ifoda kodining bir nechta nusxasini yaratishi mumkin. Yaxshilash sifatida kompilyator a deb nomlangan yordamchi subroutine yaratishi mumkin thunk, bu argument qiymatini hisoblab chiqadi. Manzil va atrof-muhit[a] ushbu yordamchi subroutin keyinchalik asl dalil o'rniga asl subroutinaga uzatiladi, bu erda kerak bo'lganda uni ko'p marta chaqirish mumkin. Piter Ingerman birinchi navbatda trunklarni ALGOL 60 chaqiriq bo'yicha baholashni qo'llab-quvvatlaydigan dasturlash tili.[3]

Ilovalar

Funktsional dasturlash

Garchi dasturiy ta'minot sanoati asosan chaqiriq bo'yicha standartlashtirilgan va qo'ng'iroq orqali baholash,[4] da qo'ng'iroqlarni faol o'rganish davom etdi funktsional dasturlash jamiyat. Ushbu tadqiqot bir qator ishlab chiqardi dangasa baho qo'ng'iroqning ba'zi bir variantlari standart baholash strategiyasi bo'lgan dasturlash tillari. Kabi bu tillar uchun kompilyatorlar Glasgow Haskell kompilyatori, asosan thunklarga umid bog'lashdi, shu bilan birga tannarxlar dastlabki natijalarini qayta hisoblashdan saqlanishlari uchun tejashlari xususiyati qo'shildi;[5] bu sifatida tanilgan yod olish yoki ehtiyoj bo'yicha qo'ng'iroq.

Funktsional dasturlash tillari, shuningdek, dasturchilarga aniq zarbalarni yaratishga imkon berdi. Bu amalga oshiriladi manba kodi argumentli iborani an-ga o'rash orqali noma'lum funktsiya o'z parametrlariga ega bo'lmagan. Bu qabul qilish funktsiyasi noma'lum funktsiyani chaqirguncha ifodani baholashga imkon bermaydi va shu bilan chaqiruv nomi bilan bir xil samaraga erishadi.[6] Anonim funktsiyalarni boshqa dasturlash tillariga qabul qilish ushbu imkoniyatni keng ommalashtirdi.

Quyida JavaScript (ES6) da oddiy namoyish mavjud:

// 'gipot' - bu ikkilik funktsiyakonst gipoteza = (x, y) => Matematika.kv(x * x + y * y);// 'thunk' - bu argumentlarni talab qilmaydigan va chaqirilganda potentsial jihatdan qimmat funktsiyani bajaradigan funktsiya// operatsiya (bu misolda kvadrat ildizni hisoblash) va / yoki ba'zi bir yon ta'sirlarni keltirib chiqaradikonst thunk = () => gipoteza(3, 4);// keyinchalik tanani baholanmasdan o'tkazish mumkin ...doSomethingWithThunk(thunk);// ... yoki baholanganthunk(); // === 5

Ob'ektga yo'naltirilgan dasturlash

Thunks foydalidir ob'ektga yo'naltirilgan dasturlash ruxsat beruvchi platformalar sinf ga bir nechta interfeyslarni meros qilib oling, xuddi shunday holatlarga olib keladi usul har qanday interfeys orqali chaqirilishi mumkin. Quyidagi kodda bunday holat tasvirlangan C ++.

sinf A { jamoat:  virtual int Kirish() konst { qaytish qiymat_; } xususiy:  int qiymat_;};sinf B { jamoat:  virtual int Kirish() konst { qaytish qiymat_; } xususiy:  int qiymat_;};sinf C : jamoat A, jamoat B { jamoat:  int Kirish() konst bekor qilish { qaytish yaxshi_value_; } xususiy:  int yaxshi_value_;};int foydalanish(B *b) { qaytish b->Kirish(); }int asosiy() {  // ...  B bir_b;  foydalanish(&bir_b);  C bir_c;  foydalanish(&bir_c);}

Ushbu misolda A, B va C sinflarining har biri uchun yaratilgan kod a ni o'z ichiga oladi jo'natish jadvali qo'ng'iroq qilish uchun ishlatilishi mumkin Kirish shu turdagi ob'ektda, xuddi shu turga ega bo'lgan ma'lumotnoma orqali. C sinfida qo'ng'iroq qilish uchun ishlatiladigan qo'shimcha dispetcherlik jadvali bo'ladi Kirish B tipidagi mos yozuvlar orqali C tipidagi ob'ektda b-> kirish () b ob'ektining turiga qarab B-ning o'z dispetcherlik jadvalidan yoki qo'shimcha C jadvalidan foydalanadi. Agar u S tipidagi ob'ektga ishora qilsa, kompilyator C ning ekanligini ta'minlashi kerak Kirish amalga oshirish qabul qiladi misol manzili ushbu ob'ektning meros qilib olingan B qismi o'rniga butun C ob'ekti uchun.[7]

Ushbu ko'rsatgichni sozlash muammosiga to'g'ridan-to'g'ri yondashuv sifatida kompilyator har bir jo'natma jadvalining yozuviga butun sonli ofsetni kiritishi mumkin. Ushbu ofset ma'lumotni manzili va usulni amalga oshirish uchun zarur bo'lgan manzil o'rtasidagi farqdir. Ushbu jo'natma jadvallari orqali har bir qo'ng'iroq uchun yaratilgan kod keyinchalik ofsetni olish va uni chaqirishdan oldin misol manzilini sozlash uchun ishlatishi kerak.

Yuqorida tavsiflangan echim ilgari tavsiflangan chaqiriqlarni sodda tarzda amalga oshirishga o'xshash muammolarga duch keladi: kompilyator argumentni (misol manzili) hisoblash uchun kodning bir nechta nusxasini yaratadi, shuningdek, ofsetlarni ushlab turish uchun dispetcherlik jadvalining o'lchamlarini oshiradi. Shu bilan bir qatorda, kompilyator an yaratishi mumkin sozlagich thunk bilan birgalikda C ning bajarilishi Kirish misol manzilini kerakli miqdorga moslashtiradigan va keyin usulni chaqiradigan. Magistral B ning dispetcherlik jadvalida paydo bo'lishi mumkin va shu bilan qo'ng'iroq qiluvchilar manzilni o'zlari sozlashlari kerak emas.[8]

Bir nechta nuqtalarda baholashni talab qiladigan raqamli hisob-kitoblar

Integratsiya kabi hisoblash tartiblari ifodani bir nechta nuqtada hisoblashi kerak. Shu maqsadda nomlash bilan qo'ng'iroq qo'llab-quvvatlamaydigan tillarda ishlatilgan yopilish yoki protsedura parametrlari.

Birgalikda ishlash

Thunks dasturlari bir-biriga bevosita qo'ng'iroq qila olmaydigan dasturiy ta'minot modullari o'rtasida o'zaro ishlashni ta'minlash uchun keng qo'llanilgan. Bu tartiblar boshqacha bo'lganligi sababli sodir bo'lishi mumkin konventsiyalarni chaqirish, boshqacha ishlating CPU rejimlari yoki manzil bo'shliqlari, yoki kamida bittasi a da ishlaydi virtual mashina. Kompilyator (yoki boshqa vosita) ushbu muammoni argumentlarni o'zgartirishi, ularni boshqa joyga ko'chirishi yoki protsessor rejimini almashtirishidan qat'i nazar, maqsadli tartibni chaqirish uchun zarur bo'lgan qo'shimcha qadamlarni avtomatizatsiya qilish orqali hal qilishi mumkin. Muvaffaqiyatli magistral oddiy qo'ng'iroq bilan taqqoslaganda amalga oshiradigan qo'shimcha ishni kamaytiradi.

Birgalikda ishlashga oid ko'plab adabiyotlar turli xil narsalarga tegishli Vintel platformalar, shu jumladan MS-DOS, OS / 2,[9] Windows[10][11][12][13] va .NET va dan o'tish 16-bit ga 32-bit xotira manzili. Mijozlar bir platformadan ikkinchisiga ko'chib o'tganligi sababli, tanga qo'llab-quvvatlash uchun juda muhimdir eski dasturiy ta'minot eski platformalar uchun yozilgan.

X86-da 32-bitdan 64-bitli kodga o'tishda thunking (WoW64) shakli ham qo'llaniladi. Biroq, x86-64 manzil maydoni 32 bitli koddan kattaroq bo'lgani uchun, eski "umumiy thunk" mexanizmidan 32 bitli koddan 64 bitli kodni chaqirish uchun foydalanib bo'lmadi.[14] 64 bitli kodni chaqiradigan 32 bitli kodning yagona holati - Windows API-larini WoW64-ning 32 bitga o'rnatishi.

Qoplamalar va dinamik bog'lanish

Avtomatik bo'lmagan tizimlarda virtual xotira apparat, thunklar ma'lum bo'lgan virtual xotiraning cheklangan shaklini amalga oshirishi mumkin qoplamalar. Qatlamlar yordamida ishlab chiquvchi dastur kodini mustaqil ravishda yuklanishi va tushirilishi mumkin bo'lgan segmentlarga ajratadi va kirish nuqtalari har bir segmentga. Boshqa segmentga qo'ng'iroq qiladigan segment buni bilvosita a orqali amalga oshirishi kerak filiallar jadvali. Segment xotirada bo'lsa, uning jadval jadval yozuvlari segmentga sakraydi. Segment tushirilganda, uning yozuvlari talabga binoan uni qayta yuklashi mumkin bo'lgan "qayta yuklashlar" bilan almashtiriladi.[15]

Xuddi shunday, tizimlar dinamik ravishda bog'lang dasturning modullari birgalikda ish vaqtida modullarni ulash uchun magistrallardan foydalanishi mumkin. Har bir modul boshqalarni qo'ng'iroq qilishi mumkin, bu ulagich modulni yuklaganda to'ldiradigan razvedka jadvali orqali. Shu tarzda modullar o'zlarining xotirada qaerdaligini oldindan bilmasdan o'zaro ta'sir qilishi mumkin.[16]

Shuningdek qarang

Thunk texnologiyalari

Tegishli tushunchalar

Izohlar

  1. ^ Thunk - bu erta cheklangan turdagi yopilish. Thunk uchun o'tadigan muhit odatdagidek emas, balki iboradir.[2]

Adabiyotlar

  1. ^ Erik Raymond "ushbu atamaning kelib chiqishi to'g'risida tarqalgan bir nechta onomatopoeik afsonalarni" rad etadi va "ixtirochilar" ushbu atama "ular munozarali soatlardan keyin bir necha soat ichida) anglab etgandan keyin o'ylab topilganligini eslatadi. Algol-60-da kompilyatsiya vaqtini biroz o'ylab oldindan bilib olish mumkin edi [...] Boshqacha qilib aytganda, bu "allaqachon o'ylab topilgan"; shuning uchun u suvga cho'mgan thunk, bu "tungi soat ikkida" o'ylash "ning o'tgan vaqtidir". Qarang: Raymond, Erik S. (1996). Raymond, Erik S. (tahrir). Yangi xakerlar lug'ati. MIT Press. p. 445. ISBN  9780262680929. Olingan 2015-05-25.
  2. ^ E. T. Dazmollar (1961-01-01). "ALGOLda rekursiv protseduralar va bloklarni amalga oshirish bo'yicha sharhlar". ACM aloqalari. Hisoblash texnikasi assotsiatsiyasi (ACM). 4 (1): 65–69. doi:10.1145/366062.366084. ISSN  0001-0782.
  3. ^ Ingerman, P. Z. (1961-01-01). "Thunks: protsedura deklaratsiyasiga ba'zi izohlar bilan protsedura bayonotlarini tuzish usuli". ACM aloqalari. Hisoblash texnikasi assotsiatsiyasi (ACM). 4 (1): 55–58. doi:10.1145/366062.366084. ISSN  0001-0782.
  4. ^ Skott, Maykl (2009). Dasturlash tili pragmatikasi. p. 395.
  5. ^ Marlow, Simon (2013). Haskell-da parallel va parallel dasturlash. p. 10.
  6. ^ Queinnec, Christian (2003). Kichik qismlarda Lisp. p. 176.
  7. ^ Stroustrup, Bjarne (1989 yil kuz). "C ++ uchun bir nechta meros" (PDF). Hisoblash tizimlari. USENIX. 1 (4). Olingan 2014-08-04.
  8. ^ Drisen, Karel; Xölzl, Urs (1996). "Virtual funktsiyaning to'g'ridan-to'g'ri narxi C ++ da qo'ng'iroq qiladi" (PDF). OOPSLA. Olingan 2011-02-24. Iqtibos jurnali talab qiladi | jurnal = (Yordam bering)
  9. ^ Kalkot, Jon (1995 yil may). "Thunking: OS / 2 2.0 da 16 bitli kutubxonalardan foydalanish". OS / 2 Developer Magazine. 7 (3).
  10. ^ King, Adrian (1994). Microsoft Windows 95 ichida (2-nashr). Redmond, Vashington, AQSh: Microsoft Press. ISBN  1-55615-626-X.
  11. ^ Microsoft Windows 95 dasturchilar uchun qo'llanma: Microsoft Windows Development Team-dan Windows uchun dasturlash bo'yicha asosiy mavzular. Texnik ma'lumot (1-nashr). Redmond, Vashington, AQSh: Microsoft Press. 1995-07-01. ISBN  1-55615-834-3. Olingan 2016-05-26.
  12. ^ Xazza, Karen (1997). Windows VxD va Device Drivers-ni yozish - Virtual Device Drivers uchun dasturlash sirlari (2-nashr, 2-nashr). Lourens, Kanzas, AQSh: Ar-ge kitoblari / Miller Freeman, Inc. ISBN  0-87930-438-3.
  13. ^ Kauler, Barri (1997 yil avgust). Windows Assambleyasi tili va tizimlarini dasturlash - kompyuter va Windows uchun past darajadagi 16 va 32 bitli dasturlash (2-nashr). Lourens, Kanzas, AQSh: Ar-ge kitoblari / Miller Freeman, Inc. ISBN  0-87930-474-X.
  14. ^ "Nega siz 32-bitdan 64-bitgacha bo'lgan Windows-lar orasida tejamaysiz?". Eski yangi narsa. 2008-10-20.
  15. ^ Yorqin, Uolter (1990-07-01). "640K DOS uchun virtual xotira". Doktor Dobbning jurnali. Olingan 2014-03-06.
  16. ^ Levin, Jon R. (2000) [1999 yil oktyabr]. Birlashtiruvchi va yuklagichlar. Dasturiy ta'minot va dasturlash bo'yicha Morgan Kaufmann seriyasi (1 nashr). San-Fransisko, AQSh: Morgan Kaufmann. ISBN  1-55860-496-0. OCLC  42413382. ISBN  978-1-55860-496-4. Arxivlandi asl nusxasidan 2012-12-05. Olingan 2020-01-12. Kod: [1][2] Xato: [3]