Кіріспе

Компьютерлік термин

Компьютерлік бағдарламалауда, thunk – есептеуді басқа бір процедураға қосу үшін қолданылатын процедура. Thunk-тар көбінесе есептеудің нәтижесі қажет болғанға дейін оны кейінге қалдыруға немесе басқа процедураның басына немесе соңына операцияларды енгізуге пайдаланылады. Олар компилятор кодты құру және модулдік бағдарламалауда көптеген басқа да қолданыстарға ие. Бұл термин "ойлау" етістігінің әдемі әрі ерекше түрі ретінде туындаған. Ол ALGOL 60 компиляторларында thunk-тардың алғашқы қолданылуына сілтеме жасайды, онда қандай типті процедураны жасау керектігін анықтау үшін арнайы талдау (ойлау) қажет болды.

Өмірбаян

Компиляторларды зерттеудің алғашқы жылдары әртүрлі бағалау стратегияларымен кең ауқымды тәжірибелер жүргізілді. Басты сұрақ – аргументтер тұрақты емес, кез келген математикалық өрнектер болса, кіші бағдарламаны қалай құрастыру керек еді. "Ман бойынша шақыру" деп аталатын бір тәсіл шақыру алдында барлық аргументтерді есептеп, нәтижесінде алынған мәндерді кіші бағдарламаға жібереді. Ал "атау бойынша шақыру" тәсілінде кіші бағдарлама бағаланбаған аргумент өрнегін қабылдайды және оны өзі бағалауы тиіс. "Атау бойынша шақыру" тәсілін қарапайым түрде іске асыру аргумент өрнегінің кодын кіші бағдарламадағы сәйкес параметрдің әр пайда болуымен алмастыруы мүмкін, бірақ бұл кіші бағдарламаның бірнеше нұсқасын және өрнек кодын бірнеше рет көшіруге әкелуі мүмкін. Жақсарту ретінде компилятор аргументтің мәнін есептейтін, "thunk" деп аталатын көмекші кіші бағдарламаны жасай алады. Осы көмекші кіші бағдарламаның адресі мен ортасы бастапқы аргументтің орнына бастапқы кіші бағдарламаға жіберіледі, онда оны қажет болғанша шақыруға болады. Питер Ингерман алғаш рет "thunk" терминін ALGOL 60 бағдарламалау тіліне қатысты сипаттады, ол атау бойынша шақыру бағалауын қолдайды.

Бірнеше нүктеде бағалауды қажет ететін сандық есептеулер

Интеграция сияқты есептеулер үшін реттік амалдар бірнеше нүктеде өрнекті есептеуді қажет етеді. Жабылуларды немесе процедуралық параметрлерді қолдамайтын тілдерде осы мақсатта есім бойынша шақыру қолданылды.

Өзара әрекеттесу мүмкіндігі

Thunks бағдарламалық модульдер арасындағы өзара іс-қимыл мүмкіндігін қамтамасыз ету үшін кеңінен қолданылады, егер олардың процедуралары бір-бірін тікелей шақыра алмайтын болса. Мұндай жағдай әртүрлі шақыру конвенцияларының болуына, әртүрлі CPU режимдерінде немесе адрестік кеңістіктерде жұмыс істеуіне, немесе кем дегенде біреуі виртуалды машинада жұмыс істеуіне байланысты болуы мүмкін. Компилятор (немесе басқа құрал) бұл мәселені thunk арқылы шеше алады, ол мақсатты процедураны шақыру үшін қажетті қосымша қадамдарды автоматтандырады, оған аргументтерді түрлендіру, оларды басқа орынға көшіру немесе CPU режимін өзгерту кіруі мүмкін. Сәтті жасалған thunk шақырушының қалыпты шақырумен салыстырғанда атқаруға тиіс қосымша жұмысты азайтады. Өзара іс-қимыл thunk-тарына қатысты көптеген әдебиеттер әртүрлі Wintel платформаларына, соның ішінде MS DOS, OS/2, Windows және .NET, сондай-ақ 16 биттен 32 биттік жад адрестеуге өтуге арналған. Клиенттер бір платформадан екіншісіне көшкен кезде, thunk-тар ескі платформалар үшін жазылған ескі бағдарламалық жасақтаманы қолдау үшін маңызды рөл атқарды. x86 архитектурасында 32 биттен 64 биттік кодқа өту кезінде де thunking (WoW64) механизмі қолданылады. Алайда, x86-64 адрестік кеңістігі 32 биттік кодқа қарағанда үлкен болғандықтан, ескі "жалпы thunk" механизмін 32 биттік кодтан 64 биттік кодты шақыру үшін пайдалану мүмкін емес. 32 биттік кодтың 64 биттік кодты шақыруының жалғыз жағдайы – WoW64-тің Windows API-ін 32 биттікке түрлендіруі.

Қалқалар мен динамикалық байланысу

Автоматты виртуалды жад аппараттары жоқ жүйелерде, thunks виртуалды жадтың шектеулі түрін – үстіңгі жадыны (overlays) іске асыра алады. Үстіңгі жадыны қолдану арқылы, бағдарламашы бағдарлама кодын тәуелсіз жүктеліп, түсірілетін сегменттерге бөледі және әр сегментке кіру нүктелерін анықтайды. Егер бір сегмент басқа сегментке шақыру жасаса, ол бұл шақыруды тармақталу кестесі арқылы тура емес жолмен жасауы керек. Сегмент жадта болғанда, оның тармақталу кестесінің жазбалары сол сегментке секіреді. Сегмент жадтан түсірілгенде, оның жазбалары оны қажет болғанда қайта жүктеуге мүмкіндік беретін "қайта жүктеу thunkтарымен" алмастырылады. Сол сияқты, бағдарлама модульдерін орындалу кезінде динамикалық түрде байланыстыратын жүйелер модульдерді байланыстыру үшін thunks-ты пайдалана алады. Әр модуль басқа модульдерді линкер жүктеген кезде толтыратын thunks кестесі арқылы шақыра алады. Бұл модульдердің жадта қайда орналасқанын бұрыннан білмей өзара әрекеттесуіне мүмкіндік береді.