लेट बाइंडिंग

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

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

कंपोनेंट ऑब्जेक्ट मॉडल (COM) प्रोग्रामिंग में लेट बाइंडिंग का उपयोग करने का प्राथमिक लाभ यह है कि इसके लिए कंपाइलर को उन लाइब्रेरी को संदर्भित करने की आवश्यकता नहीं होती है जिनमें संकलन समय पर ऑब्जेक्ट होता है। यह संकलन प्रक्रिया को संस्करण विरोधों के लिए अधिक प्रतिरोधी बनाता है, जिसमें कक्षा की वी-टेबल को गलती को संशोधित किया जा सकता है।(यह .NET या जावा जैसे समय-समय पर संकलन-संकलित प्लेटफ़ॉर्म में चिंता का विषय नहीं है, क्योंकि वी-टेबल रनटाइम पर वर्चुअल मशीन द्वारा पुस्तकालयों के खिलाफ बनाई जाती है क्योंकि उन्हें चल रहे एप्लिकेशन में लोड किया जा रहा है।

इतिहास
"लेट बाइंडिंग" शब्द कम से कम 1960 के दशक का है, जहां यह ACM के संचार में पाया जा सकता है। लिस्प जैसी भाषाओं में कॉलिंग सम्मेलनों का वर्णन करने के लिए इस शब्द का व्यापक रूप से उपयोग किया गया था, हालांकि आमतौर पर प्रदर्शन के बारे में नकारात्मक अर्थों के साथ।

1980 के दशक में स्मॉलटॉक ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) को और इसके साथ लेट बाइंडिंग को लोकप्रिय बनाया ।"एलन के" ने एक बार कहा था, "मेरे लिए ओओपी का अर्थ है केवल संदेश देना, स्थानीय प्रतिधारण, और राज्य-प्रक्रिया का संरक्षण और छिपाना, और सभी वस्तु के लिय लेटबाइंडिंग होती है | यह स्मॉलटाक और एलआईएसपी में किया जा सकता है। संभवतः अन्य प्रणालियाँ हैं जिनमें यह संभव है, लेकिन मुझे उनकी जानकारी नहीं है।

1990 के दशक की शुरुआत में,माइक्रोसॉफ्ट ने अपने कॉम मानक को विभिन्न ओओपी प्रोग्रामिंग भाषाओं के बीच एक बाइनरी इंटरफेस के रूप में प्रचारित किया। COM प्रोग्रामिंग समान रूप से सिंटैक्स स्तर पर दोनों का समर्थन करने वाली कई भाषाओं के साथ शुरुआती और देर से लेटबाइंडिंग को बढ़ावा देती है।

2000 में, एलेक्स मार्टेली ने एक समान अवधारणा को संदर्भित करने के लिए एक अलग जोर के साथ "डक टाइपिंग" शब्द चुना। जबकि लेट बाइंडिंग आम तौर पर कार्यान्वयन विवरण पर केंद्रित होता है, डक टाइपिंग प्रकारों को अनदेखा करने की क्षमता पर ध्यान केंद्रित करती है और वर्तमान में एक वस्तु के तरीकों पर ध्यान केंद्रित करती है।

लेट बाइंडिंग में डायनमिक रूप से टाइप की गई ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा
अधिकांश गतिशील रूप से टाइप की गई भाषाओं में, किसी ऑब्जेक्ट पर विधियों की सूची को रनटाइम पर बदला जा सकता है। इसके लिए लेट बाइंडिंग की आवश्यकता है।

लिस्प में लेट बाइंडिंग
लिस्प (प्रोग्रामिंग भाषा) में लेट बाउंड ग्लोबल फंक्शन कॉल्स को कुशलता से रनटाइम पर फंक्शन सेल को प्रतीक के माध्यम से देखा जाता है। ये फंक्शन बाइंडिंग परिवर्तनीय हैं।

पारस्परिक क्लोजर कॉमन लिस्प सत्र का उपयोग करने का उदाहरण:

? (डिफन फू    (बार पाई)); एक अभी भी अपरिभाषित फ़ंक्शन बार को बुलाया किया जाता है कंपाइलर चेतावनियां: फू
 * खाद्य में: अपरिभाषित समारोह बार

? (डिफ़न बार (x); अब हम इसे परिभाषित करते हैं   (* x 2)) बार

? (फू); कॉलिंग फू और यह बार की हालिया परिभाषा का उपयोग करता है

6.283185307179586D0

? (डिफ़न बार (x); अब हम बार को फिर से परिभाषित करते हैं   (* x 1000)) बार

? (फू); एफओओ अब नए फ़ंक्शन को बुलाता है,एफओओ को पुनः संकलित/लिंक/लोड करने की कोई आवश्यकता नहीं है

3141.592653589793D0

? (टाइप-ऑफ 'बार); बार एक प्रतीक है

प्रतीक

? (प्रतीक-फ़ंक्शन 'बार); प्रतीक बार में एक समारोह जुड़ा है


 * 1) <संकलित-समारोह बार #x302000D1B21F>

C++ में लेट बाइंडिंग
C++ में लेट बाइंडिंग (जिसे "डायनमिक बाइंडिंग" भी कहा जाता है) संदर्भित करता है कि सामान्य रूप से क्या होता है जब वर्चुअल कीवर्ड का उपयोग विधि को प्रकट करने में किया जाता है। C++ आभासी तालिका बनाता है, जो ऐसे कार्यों के लिए एक तालिका है जिसे कॉल किय जाने पर हमेशा परामर्श किया जाएगा। आमतौर पर,लेट बाइंडिंग शब्द का उपयोग डायनमिक प्रेषण के पक्ष में किया जाता है।

कॉम भाषाओं में लेट बाइंडिंग
COM प्रोग्रामिंग में आईडीआई स्पैच इंटरफेस का उपयोग करके एक लेट-बाउंड मेथड कॉल किया जाता है। कुछ कॉम-आधारित भाषाएँ जैसे मूल दृश्य 6 में इस इंटरफ़ेस को लागू करने के लिए सिंटैक्टिकल समर्थन है। यह वेरिएबल के प्रकार को ऑब्जेक्ट के रूप में परिभाषित करके किया जाता है।  C++ जैसे अन्य लोगों की आवश्यकता है कि आप एक विधि देखने के लिए GetIDsOfNames को स्पष्ट रूप से कॉल करें और इसे कॉल करने के लिए कहे |

NET में लेट बाइंडिंग
.NET में, लेट बाइंडिंग का अर्थ C++ जैसी वर्चुअल विधि को ओवरराइड करना या इंटरफेस लागू करना है। कंपाइलर हर वर्चुअल या इंटरफेस मेथड कॉल के लिए वर्चुअल टेबल बनाता है जिसका उपयोग निष्पादन के कार्यान्वयन को निर्धारित करने के लिए रन-टाइम पर किया जाता है।

कॉम और जावा की तरह, कॉमन लैंग्वेज रनटाइम रिफ्लेक्शन एपीआई प्रदान करता है जो लेट बाइंडिंग कॉल कर सकता है। इन कॉल्स का उपयोग भाषा के अनुसार भिन्न होता है।

सी # 4 के साथ, भाषा ने डायनमिक कूट प्रकार को भी जोड़ा ताकि यह इंगित करने के लिए ऑब्जेक्ट प्रकार के स्थान पर उपयोग किया जाएगा कि लेट बाइंडिंग उपयोगी है। आवश्यक विशिष्ट लेट बाइंडिंग क्रियाबिधि को डायनेमिक भाषा कार्य समय  को शुरुआती बिंदु के रूप में उपयोग करते हुए कार्य समय पर निर्धारित किया जाता है।

जब भी वेरिएबल टाइप ऑब्जेक्ट का होता है और कंपाइलर डायरेक्टिव "ऑप्शन स्ट्रिक्ट ऑफ" लागू होता है, तो विजुअल बेसिक उनका उपयोग करता है। यह एक नए वीबी प्रोजेक्ट के लिए न्यूनता समायोजन है। संस्करण 9 से पहले, केवल .NET और COM ऑब्जेक्ट लेट बाउंड हो सकते थे। वीबी 10 के साथ, इसे डीएलआर-आधारित ऑब्जेक्ट तक बढ़ा दिया गया है।

जावा में लेट बाइंडिंग
जावा में लेट बाइंडिंग की तीन परिभाषाएँ हैं।

जावा पर प्रारम्भ में दस्तावेजो पर चर्चा की गई कि कैसे  संकलक(कंपाइल) के समय पर क्लासेस को एक साथ नहीं जोड़ा गया था। जबकि प्रकारों को संकलन समय पर सांख्यिकीय रूप से जांचा जाता है, कक्षाओं के लिए अलग-अलग कार्यान्वयनों को रनटाइम से ठीक पहले क्लास फाइल को अधिलेखित करके स्वैप किया जा सकता है। जब तक नई कक्षा की परिभाषा में समान वर्ग और विधि के नाम होते हैं, तब तक कोड काम करेगा। इस अर्थ में यह लेट बाइंडिंग की पारंपरिक परिभाषा के समान है।

वर्तमान में, जावा प्रोग्रामिंग में डायनामिक डिस्पैच के पर्याय के रूप में लेट बाइंडिंग शब्द का उपयोग करना लोकप्रिय है। विशेष रूप से, यह जावा के एकल प्रेषण कार्यबिधि को संदर्भित करता है जिसका उपयोग आभासी विधियों के साथ किया जाता है।

अंत में, जावा अपने प्रतिबिंब एपीआई का उपयोग करके लेट बाइंडिंग का उपयोग कर सकता है और आत्मनिरीक्षण टाइप कर सकता है उसी तरह जैसे यह COM और .NET प्रोग्रामिंग में किया जाता है। आम तौर पर जो केवल जावा में प्रोग्राम करते हैं, वे इस लेट बाइंडिंग को नहीं करते हैं। इसी तरह जावा प्रोग्रामिंग में "डक टाइपिंग" तकनीकों का उपयोग किया जाता है, इसके बजाय अमूर्त इंटरफेस का उपयोग किया जाता है।

जावा के वर्तमान मालिक ओरेकल को "डक टाइपिंग" अर्थ में लेट बाइंडिंग शब्द का उपयोग करने के लिए जाना जाता है, जब एक ही दस्तावेज में जावा और अन्य भाषाओं दोनों पर चर्चा की जाती है।

पीएल/एसक्यूएल और एडीए में शुरुआती बनाम लेट बाइंडिंग
एडीए और एक डेटाबेस-संग्रहीत प्रक्रिया के बीच शुरुआती बंधन का उपयोग करते समय, यह सत्यापित करने के लिए एक टाइमस्टैम्प की जाँच की जाती है कि कोड संकलित होने के बाद से संग्रहीत प्रक्रिया नहीं बदली है। यह तेजी से निष्पादन की अनुमति देता है और और आवेदन को एक संग्रहीत प्रक्रिया के गलत संस्करण के खिलाफ चलने से रोकता है।

देर से बाध्यकारी का उपयोग करते समय टाइमस्टैम्प चेक नहीं किया जाता है, और संग्रहीत प्रक्रिया को अज्ञात पीएल/एसक्यूएल ब्लॉक के माध्यम से निष्पादित किया जाता है। जबकि यह धीमा हो सकता है, यह संग्रहीत प्रक्रिया में परिवर्तन होने पर सभी उपभोगता अनुप्रयोगों को पुन: संकलित करने की आवश्यकता को हटा देता है।

यह भेद पीएल/एसक्यूएल और एडीए के लिए अद्वितीय प्रतीत होता है। अन्य भाषाएँ जो पीएल/एसक्यूएल प्रक्रियाओं को कॉल कर सकती हैं, साथ ही साथ अन्य डेटाबेस इंजन, केवल लेट बाइंडिंग का उपयोग करती हैं।

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

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

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

इसी तरह की समस्या यह है कि टाइपिंग जानकारी की संभावित कमी निर्भरता ग्राफ के निर्माण को रोक सकती है। हालाँकि, अन्य प्रोग्रामिंग विधियों जैसे अमूर्त इंटरफेस के परिणामस्वरूप समान समस्याएं हो सकती हैं। एक आधुनिक आईडीई इस तरह के निर्भरता ग्राफ को आसानी से बना सकता है क्योंकि यह सभी संदर्भों को ढूंढता है।

यह भी देखें

 * देर से जुड़ना
 * गतिशील लिंकर
 * गतिशील प्रेषण
 * नाम बंधन