'थंक ’क्या है?


130

मैंने इसे प्रोग्रामिंग में इस्तेमाल किया है (विशेष रूप से C ++ डोमेन में) और मुझे पता नहीं है कि यह क्या है। संभवतः यह एक डिज़ाइन पैटर्न है, लेकिन मैं गलत हो सकता है। क्या कोई ठग का अच्छा उदाहरण दे सकता है?


10
एक FYI के रूप में, एक थंक को कभी-कभी 'trampoline' भी कहा जाता है (सामान्य स्थिति में, शायद C ++ में नहीं)।
माइकल बूर

@MichaelBurr, एकमात्र संदर्भ जो मैंने देखा है कि "ट्रम्पोलिन" शब्द का इस्तेमाल डेट्रॉइट्स के रूप में किया गया है और इस संदर्भ में ट्रम्पोलिन एक थन नहीं है।
उपयोगकर्ता 34660

1
शब्द एक प्रकार की चीज़ है जिसमें एक विशिष्ट परिभाषा नहीं होती है इसलिए यह परिभाषा में भिन्न होता है।
user34660

जवाबों:


132

एक thunkआम तौर पर, कोड का एक छोटा सा टुकड़ा है कि एक समारोह के रूप में कहा जाता है को संदर्भित करता है कुछ छोटे काम करता है, और उसके बाद JUMPके बजाय अपने फोन करने वाले की ओर लौटने का एक और स्थान (आमतौर पर एक समारोह) के लिए है। JUMP टारगेट को मान लेना एक सामान्य कार्य है, जब यह वापस आएगा, तो यह थंक के कॉलर पर वापस आ जाएगा।

बहुत सी उपयोगी चीजों को कुशलता से लागू करने के लिए थ्रॉक्स का उपयोग किया जा सकता है

  • प्रोटोकॉल ट्रांसलेशन - कोड से कॉल करते समय जो एक कॉलिंग कन्वेंशन को कोड का उपयोग करता है जो एक अलग कॉलिंग कन्वेंशन का उपयोग करता है, का thunkउपयोग तर्कों का उचित अनुवाद करने के लिए किया जा सकता है। यह केवल तभी काम करता है यदि रिटर्न कन्वेंशन संगत हैं, लेकिन अक्सर ऐसा होता है

  • वर्चुअल फ़ंक्शन हैंडलिंग - C ++ में बहु-विरासत वाले बेस क्लास के वर्चुअल फ़ंक्शन को कॉल करते समय, thisइसे सही स्थान पर इंगित करने के लिए पॉइंटर को ठीक करने की आवश्यकता होती है । A यह thunkकर सकता है।

  • डायनेमिक क्लोजर - जब आप एक डायनेमिक क्लोजर का निर्माण करते हैं, तो क्लोजर फ़ंक्शन को उस संदर्भ में प्राप्त करने में सक्षम होने की आवश्यकता होती है जहां इसे बनाया गया था। एक छोटा thunkबनाया जा सकता है (आमतौर पर स्टैक पर) जो कुछ रजिस्टर (ओं) में संदर्भ जानकारी सेट करता है और फिर कोड के एक स्थिर टुकड़े पर कूदता है जो क्लोजर के फ़ंक्शन को लागू करता है। यहां थंक प्रभावी रूप से फ़ंक्शन को एक या एक से अधिक छिपे हुए अतिरिक्त तर्क प्रदान कर रहा है जो कॉल साइट द्वारा प्रदान नहीं किए गए हैं।


13
क्योंकि यह बताता है कि thunk यह सबसे अच्छा विवरण है है बजाय क्या यह आम तौर पर की करता है अलग अलग बातें लागू करने के लिए सामान्य उपयोग के मामलों में। अन्य उत्तर सामान्य विचार के बजाय उन विशेष कार्यान्वयनों पर बहुत अधिक ध्यान केंद्रित करते हैं।
सासक्यू

अन्य संकलक के बारे में निश्चित नहीं है, लेकिन विज़ुअल स्टूडियो विशेष रूप से थ्रक्स के बहुत शौकीन हैं। मेरे ज्ञान के लिए, यह उपयोग करता है: एडजस्टर थ्रक्स (एडजस्ट करने के लिए this), डिफॉल्ट / कॉपी कंस्ट्रक्टर क्लोजर (डिफॉल्ट मापदंडों के साथ मुख्य रूप से DLL एक्सपोर्ट या कंस्ट्रक्शन vcallएरियर्स के लिए यूजर- प्रोवाइड के बेहतर CRT इंटीग्रेशन के लिए), थ्रक्स (सुनिश्चित करने के लिए शटर-टू -स्मार्ट-फ़ंक्शंस वर्चुअल फ़ंक्शंस के साथ ठीक से काम करते हैं), vtordispथ्रक्स (उन कक्षाओं के लिए जो वर्चुअल बेस से वर्चुअल फ़ंक्शंस को इनहेरिट और ओवरराइड करते हैं, और इसमें उपयोगकर्ता-प्रदान किए गए सीज़र और / या डार्टर्स भी हैं), मूल रैपर (प्रबंधित C ++ / CLI
जस्टिन टाइम

देशी आईएसओ सी ++ कोड से कार्य करता है, और कुछ " UDT returning" (जो ऑपरेटर द्वारा लौटाए गए उपयोगकर्ता-परिभाषित प्रकारों को समायोजित करने के लिए एक ठग प्रतीत होता है, लेकिन मुझे यकीन नहीं है कि यह कैसे उत्पन्न होता है? मुझे लगता है कि यह पदावनत है)। शायद दूसरे भी हैं। मुझे लगता है कि आप Microsoft को कभी नहीं कह सकते thunkहैं; देकार्त को गर्व होगा।
जस्टिन टाइम -

80

कंप्यूटर विज्ञान में थंक शब्द के कम से कम तीन संबंधित अर्थ हैं। एक "ठग" हो सकता है:

  • एक देरी की गणना करने के लिए कोड का एक टुकड़ा (एक बंद करने के समान)
  • कुछ आभासी फ़ंक्शन तालिका कार्यान्वयन की सुविधा (एक आवरण फ़ंक्शन के समान)
  • आमतौर पर अनुकूलता कारणों के लिए एक सिस्टम-विशिष्ट फॉर्म से दूसरे में मशीन डेटा का मानचित्रण

मैंने आमतौर पर इसे तीसरे संदर्भ में इस्तेमाल किया है।

http://en.wikipedia.org/wiki/Thunk


3
दिलचस्प; मैं आमतौर पर दूसरा रूप में सुना है, लेकिन मैं इसे निर्भर करता है कि क्या जिस तरह का काम आप अधिक बार लगता है
माइकल Mrozek

विशेष रूप से, स्वचालित रूप से मशीन कोड के बहुत कम ब्लॉक उत्पन्न होने से संबंधित है - यहां तक ​​कि पहला मामला सामान्य रूप से सिर्फ एक precompiled कार्यान्वयन फ़ंक्शन के संदर्भ में है।
शमौन बुकान

21

शब्द थंक मूल रूप से उनके अल्गोल 60 में पास-बाय-नाम के रॉयल रडार स्थापना कार्यान्वयन द्वारा उपयोग किए जाने वाले तंत्र को संदर्भित करता है संकलक करता है। सामान्य तौर पर यह किसी भी तरह से गतिशील व्यवहार को प्रेरित करने के लिए संदर्भित करता है जब एक स्पष्ट रूप से स्थिर वस्तु को संदर्भित करता है। इस शब्द का आविष्कार ब्रायन विचमन द्वारा किया गया था, जिन्होंने पास-पास के नाम को समझाने के लिए कहा था, "वैसे आप स्मृति से मूल्य को लोड करने के लिए बाहर जाते हैं और फिर अचानक - थंक - वहां आप एक अभिव्यक्ति का मूल्यांकन कर रहे हैं।"

थर्क्स को हार्डवेयर (cf. केडीएफ 9, बरोज मेनफ्रेम) में डाला गया है। सॉफ्टवेयर में उन्हें लागू करने के कई तरीके हैं, सभी बहुत मशीन, भाषा और संकलक विशिष्ट।

यह शब्द पास-बाय-नेम से परे सामान्यीकृत किया गया है, जिसमें किसी भी स्थिति को शामिल करना है जिसमें एक जाहिरा तौर पर या नाममात्र स्थैतिक डेटा संदर्भ गतिशील व्यवहार को प्रेरित करता है। संबंधित शब्दों में "ट्रम्पोलिन" और "भविष्य" शामिल हैं।


2
व्युत्पत्ति के लिए धन्यवाद। मुझे उन प्रोग्रामिंग शब्दों से नफरत है जिनकी परिभाषा एक तालिका में एक मनमाना लुकअप लगती है।
रोस रोजर्स 21

17

C ++ जैसी ऑब्जेक्ट-ओरिएंटेड भाषाओं के लिए कुछ कंपाइलर कई या वर्चुअल इनहेरिटेंस की मौजूदगी में वर्चुअल फंक्शन कॉल्स के ऑप्टिमाइज़ेशन के रूप में "थ्रोस" नामक फ़ंक्शन उत्पन्न करते हैं।

इससे लिया गया: http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming


7

उपयोग में काफी भिन्नता है। लगभग सार्वभौमिक रूप से, एक थंक एक ऐसा कार्य है जो (कम से कम वैचारिक रूप से) असामान्य रूप से छोटा और सरल है। यह आमतौर पर किसी प्रकार का एडेप्टर होता है जो आपको कुछ या अन्य (कुछ डेटा, किसी अन्य फ़ंक्शन आदि) के लिए सही इंटरफ़ेस देता है, लेकिन कम से कम कुछ और करने के रूप में देखा जाता है।

यह लगभग सिंटैक्टिक शुगर के एक रूप की तरह है, सिवाय इसके कि (कम से कम आमतौर पर इस्तेमाल किया जाने वाला) सिंटैक्टिक शुगर चीजों को बनाने के लिए माना जाता है जिस तरह से मानव पाठक उन्हें देखना चाहता है, और एक कांटा कुछ ऐसा दिखना है जिस तरह से कंपाइलर चाहता है। इसे देखें।


2
मेरे लिए सिंथैटिक शुगर के विपरीत लगता है :)
लेज़रलैन

2
संकलक के लिए सिंथेटिक चीनी तो? लगभग, लेकिन काफी नहीं, पूरी तरह से सिंटैक्टिक चीनी के विपरीत।
डंकन

2
शायद एक सिंथैटिक सॉफ़्नर?
जस्टिन टाइम -

7

यह प्रश्न पहले ही SO पर पूछा जा चुका है, देखें:

'थंक' क्या है, जैसा कि स्कीम में या सामान्य तौर पर इस्तेमाल किया जाता है?

मैं जो बता सकता हूं, वह एक लंबोदर के कथन की तरह है, जहां आप उस मूल्य को वापस नहीं करना चाहते जब तक कि आपको उसका मूल्यांकन करने की आवश्यकता न हो; या इसकी तुलना एक संपत्ति पाने वाले से भी की जा सकती है जो डिज़ाइन द्वारा कुछ कोड निष्पादित करता है ताकि वैल्यू लौटाने के लिए अभी तक इंटरफ़ेस रूप हो जो एक चर की तरह अधिक हो, लेकिन इसमें बहुरूपिक व्यवहार भी हो सकता है जिसे स्वैप किया जा सकता है चाहे विरासत द्वारा या फ़ंक्शन पॉइंटर को स्वैप करके, जो संकलन-समय या पर्यावरणीय विशेषताओं के आधार पर रनटाइम पर एक मूल्य का मूल्यांकन करेगा और लौटाएगा।


5

मुझे इस शब्द की कोई सामान्य 'कंप्यूटर विज्ञान' परिभाषा नहीं मिली, जो ऐतिहासिक रूप से मेरे लिए वास्तविक रूप में इसके वास्तविक उपयोग से मेल खाता हो। पहला वास्तविक जीवन मुठभेड़ मैं याद कर सकता हूं कि वास्तव में कहां बुलाया गया था जो ओएस / 2 दिनों में था और 16-32 बिट संक्रमण था। यह प्रतीत होता है "थुंकिंग" आज अपने आवेदन में विडंबना की तरह है।

मेरी मोटे तौर पर सामान्य समझ यह है कि यह ठूंठ एक नियमित दिनचर्या है, जो उल्लेखित ऐतिहासिक मामलों की तरह सिस्टम के बीच कुछ मूलभूत सीमाओं के पार कुछ भी नहीं करता है।

तो भाव एक पर्यावरण से दूसरे मेकिंग (रूपक / एक उपमा के रूप में) को "थंक" ध्वनि के रूप में गिराए जाने के एक पर्याय की तरह है।


1
दिलचस्प टिप। मैं इस शब्द की वास्तविक व्युत्पत्ति के बारे में भी सोच रहा था, और मैंने लोगों को "बुश टेलीग्राफ" खेलने की कल्पना की, जहां धारा में एक व्यक्ति चुपचाप (और कई मामलों में अनजाने में) संदेश को रास्ते में बदल देता है।
1

5

मैं इसे देखने जा रहा हूं, लेकिन मैंने सोचा कि थ्रांकिंग एक 32-बिट प्रोसेसर द्वारा विरासत 16-बिट कोड को चलाने के लिए नियोजित प्रक्रिया थी।

मैंने इसका उपयोग एक सादृश्य के रूप में किया कि आपको कैसे बात करने के लिए कितनी तेजी से प्रतिबंधित करना है और लोगों को गूंगा करने के लिए आप किन शब्दों का उपयोग करते हैं।

हाँ, यह विकिपीडिया लिंक में है (लगभग 32-बिट वाला हिस्सा, न कि मेरी नीरोगली )।

https://en.wikipedia.org/wiki/Thunk

इंटरऑपरेबिलिटी थ्रो पर साहित्य का अधिकांश हिस्सा एमएस-डॉस, ओएस / 2, [8] विंडोज [9] [10] और .NET सहित विभिन्न विंटल प्लेटफार्मों से संबंधित है, और 16-बिट से 32-बिट मेमोरी एड्रेसिंग में संक्रमण के लिए। । चूंकि ग्राहक एक प्लेटफ़ॉर्म से दूसरे प्लेटफ़ॉर्म पर चले गए हैं, पुराने प्लेटफ़ॉर्म के लिए लिखी गई विरासत सॉफ़्टवेयर का समर्थन करने के लिए थ्रॉक्स आवश्यक है।

(मेरे द्वारा जोर दिया गया)


1

फ़ंक्शन कॉल में Algol60 पास-बाय-नाम तर्क मूल्यांकन के संदर्भ में "थंक" का सबसे पहला उपयोग मुझे पता है कि देर से 50 के दशक से है। अल्गोल मूल रूप से एक विनिर्देशन भाषा थी, प्रोग्रामिंग भाषा नहीं थी, और कुछ प्रश्न थे कि कंप्यूटर पर पास-बाय-नाम कैसे लागू किया जा सकता है।

इसका समाधान यह था कि अनिवार्य रूप से लंबोदर के प्रवेश बिंदु को पास किया जाए। जब कैलली ने पैरामीटर का मूल्यांकन किया, तो नियंत्रण के माध्यम से गिर गया - थंक! - कॉल करने वाले के संदर्भ में जहां लैम्ब्डा का मूल्यांकन किया गया था और यह कैलेले में पैरामीटर का मान बन गया है।

टैग किए गए हार्डवेयर में, जैसे कि बर्रोज़ मशीनें, मूल्यांकन निहित था: एक तर्क को डेटा मान के रूप में पारित किया जा सकता है जैसा कि साधारण पास-बाय-वैल्यू में, या पास-बाय-नाम के लिए थंक द्वारा, तर्क मेटाडेटा में अलग-अलग टैग के साथ किया जाता है। । लोड ऑपरेशन हार्डवेयर ने टैग की जाँच की और या तो साधारण मान लौटाया या स्वचालित रूप से लैंबडा थंक को आमंत्रित किया।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.