लेट बाइंडिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 27: | Line 27: | ||
? (defun foo () | ? (defun foo () | ||
(bar pi)) ; एक अभी भी अपरिभाषित फंक्शन BAR को कॉल किया जाता है | |||
कंपाइलर चेतावनियां: | कंपाइलर चेतावनियां: | ||
; <nowiki> | ; <nowiki>In FOO: अपरिभाषित फंक्शन बार </nowiki>: | ||
FOO | |||
? ( | ? (defun bar (x) ; अब हम इसे परिभाषित करते हैं | ||
(* x 2)) | (* x 2)) | ||
BAR | |||
? ( | ? (FOO) ; कॉलिंग FOO और यह BAR की परिभाषा का उपयोग करता है | ||
6.283185307179586D0 | 6.283185307179586D0 | ||
? ( | ? (defun bar (x) ; अब हम बार को फिर से परिभाषित करते हैं | ||
(* x 1000)) | (* x 1000)) | ||
BAR | |||
? (FOO); | ? (FOO); FOO अब नए फंक्शन को कॉल करता है, FOO को पुनः संकलित/लिंक/लोड करने की कोई आवश्यकता नहीं होती है | | ||
3141.592653589793D0 | 3141.592653589793D0 | ||
? ( | ? (type-of 'bar) ; BAR एक प्रतीक है | ||
? ( | ? (symbol-function 'bar) ; प्रतीक BAR में एक फंक्शन बाइंडिंग है| | ||
<nowiki>#</nowiki>< | <nowiki>#</nowiki><Compiled-function BAR #x302000D1B21F> | ||
=== C++ में लेट बाइंडिंग === | === C++ में लेट बाइंडिंग === |
Revision as of 21:58, 23 April 2023
कंप्यूटिंग में, लेट बाइंडिंग या डायनेमिक लिंकेज[1] -हालांकि आयातित कोड पुस्तकालयों(लाइब्रेरी) को गतिशील(डायनमिक) रूप से जोड़ने(लिंक) के लिए एक समान प्रक्रिया नहीं है- एक कंप्यूटर प्रोग्रामिंग तंत्र है जिसमें किसी ऑब्जेक्ट पर कॉल की जाने वाली विधि, या फंक्शन को तर्कों(आर्गुमेंट) के साथ कॉल की जाने वाले फंक्शन को रनटाइम पर नाम से देखा जाता है। दूसरे शब्दों में, संकलन के बजाय नाम रनटाइम पर किसी विशेष ऑपरेशन या ऑब्जेक्ट से जुड़ा होता है। गतिशील बाइंडिंग का प्रयोग कभी-कभी किया जाता है[2],लेकिन डायनेमिक स्कोप को संदर्भित करने के लिए इसका अधिक उपयोग किया जाता है।
ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा में अर्ली बाइंडिंग या स्टैटिक बाइंडिंग के साथ, संकलन चरण सभी प्रकार के वेरिएबल्स और एक्सप्रेशंस को ठीक करता है। यह आमतौर पर संकलित कार्यक्रम वास्तविक विधि तालिका (वी-टेबल) में ऑफसेट के रूप में संग्रहीत होता है।[3] इसके विपरीत, लेट बाइंडिंग के साथ, संकलक पर्याप्त जानकारी नहीं पढ़ता है यह सत्यापित करने के लिए कि विधि मौजूद है या वी-टेबल पर इसके स्लॉट को बांधती है। इसके बजाय,इस विधि को रनटाइम पर नाम से देखा जाता है।
कंपोनेंट ऑब्जेक्ट मॉडल (COM) प्रोग्रामिंग में लेट बाइंडिंग का उपयोग करने का प्राथमिक लाभ यह है कि इसके लिए कंपाइलर को उन लाइब्रेरी को संदर्भित करने की आवश्यकता नहीं होती है जिनमें संकलन समय पर ऑब्जेक्ट होता है। यह संकलन प्रक्रिया को संस्करण विरोधों के लिए अधिक प्रतिरोधी बनाता है, जिसमें कक्षा की वी-टेबल को गलती को संशोधित किया जा सकता है।(यह .NET या जावा जैसे समय-समय पर संकलन-संकलित प्लेटफ़ॉर्म में चिंता का विषय नहीं है, क्योंकि वी-टेबल रनटाइम पर वर्चुअल मशीन द्वारा पुस्तकालयों के खिलाफ बनाई जाती है क्योंकि उन्हें चल रहे एप्लिकेशन में लोड किया जा रहा है।[4]
इतिहास
"लेट बाइंडिंग" शब्द कम से कम 1960 के दशक का है, जहां यह ACM के संचार में पाया जा सकता है। लिस्प जैसी भाषाओं में कॉलिंग सम्मेलनों का वर्णन करने के लिए इस शब्द का व्यापक रूप से उपयोग किया गया था, हालांकि आमतौर पर प्रदर्शन के बारे में नकारात्मक अर्थों के साथ।[5]
1980 के दशक में स्मॉलटॉक ने ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) को और इसके साथ लेट बाइंडिंग को लोकप्रिय बनाया ।"एलन के" ने एक बार कहा था, "मेरे लिए ओओपी का अर्थ है केवल संदेश देना, स्थानीय प्रतिधारण, और राज्य-प्रक्रिया का संरक्षण और छिपाना, और सभी वस्तु के लिय लेटबाइंडिंग होती है | यह स्मॉलटाक और एलआईएसपी में किया जा सकता है। संभवतः अन्य प्रणालियाँ हैं जिनमें यह संभव है, लेकिन मुझे उनकी जानकारी नहीं है।[6]
1990 के दशक की शुरुआत में,माइक्रोसॉफ्ट ने अपने कॉम मानक को विभिन्न ओओपी प्रोग्रामिंग भाषाओं के बीच एक बाइनरी इंटरफेस के रूप में प्रचारित किया। COM प्रोग्रामिंग समान रूप से सिंटैक्स स्तर पर दोनों का समर्थन करने वाली कई भाषाओं के साथ शुरुआती और देर से लेटबाइंडिंग को बढ़ावा देती है।
2000 में, एलेक्स मार्टेली ने एक समान अवधारणा को संदर्भित करने के लिए एक अलग जोर के साथ "डक टाइपिंग" शब्द चुना। जबकि लेट बाइंडिंग आम तौर पर कार्यान्वयन विवरण पर केंद्रित होता है, डक टाइपिंग प्रकारों को अनदेखा करने की क्षमता पर ध्यान केंद्रित करती है और वर्तमान में एक वस्तु के तरीकों पर ध्यान केंद्रित करती है।
लेट बाइंडिंग कार्यान्वयन
लेट बाइंडिंग में डायनमिक रूप से टाइप की गई ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषा
अधिकांश गतिशील रूप से टाइप की गई भाषाओं में, किसी ऑब्जेक्ट पर विधियों की सूची को रनटाइम पर बदला जा सकता है। इसके लिए लेट बाइंडिंग की आवश्यकता है।
लिस्प में लेट बाइंडिंग
लिस्प (प्रोग्रामिंग भाषा) में लेट बाउंड ग्लोबल फंक्शन कॉल्स को कुशलता से रनटाइम पर फंक्शन सेल को प्रतीक के माध्यम से देखा जाता है। ये फंक्शन बाइंडिंग परिवर्तनीय हैं।
पारस्परिक क्लोजर कॉमन लिस्प सत्र का उपयोग करने का उदाहरण:
? (defun foo ()
(bar pi)) ; एक अभी भी अपरिभाषित फंक्शन BAR को कॉल किया जाता है
कंपाइलर चेतावनियां:
- In FOO: अपरिभाषित फंक्शन बार
FOO
? (defun bar (x) ; अब हम इसे परिभाषित करते हैं
(* x 2))
BAR
? (FOO) ; कॉलिंग FOO और यह BAR की परिभाषा का उपयोग करता है
6.283185307179586D0
? (defun bar (x) ; अब हम बार को फिर से परिभाषित करते हैं
(* x 1000))
BAR
? (FOO); FOO अब नए फंक्शन को कॉल करता है, FOO को पुनः संकलित/लिंक/लोड करने की कोई आवश्यकता नहीं होती है |
3141.592653589793D0
? (type-of 'bar) ; BAR एक प्रतीक है
? (symbol-function 'bar) ; प्रतीक BAR में एक फंक्शन बाइंडिंग है|
#<Compiled-function BAR #x302000D1B21F>
C++ में लेट बाइंडिंग
C++ में लेट बाइंडिंग (जिसे "डायनमिक बाइंडिंग" भी कहा जाता है) संदर्भित करता है कि सामान्य रूप से क्या होता है जब वर्चुअल कीवर्ड का उपयोग विधि को प्रकट करने में किया जाता है। C++ आभासी तालिका बनाता है, जो ऐसे कार्यों के लिए एक तालिका है जिसे कॉल किय जाने पर हमेशा परामर्श किया जाएगा।[7] आमतौर पर,लेट बाइंडिंग शब्द का उपयोग डायनमिक प्रेषण के पक्ष में किया जाता है।
कॉम भाषाओं में लेट बाइंडिंग
COM प्रोग्रामिंग में आईडीआई स्पैच इंटरफेस का उपयोग करके एक लेट-बाउंड मेथड कॉल किया जाता है। कुछ कॉम-आधारित भाषाएँ जैसे मूल दृश्य 6 में इस इंटरफ़ेस को लागू करने के लिए सिंटैक्टिकल समर्थन है। यह वेरिएबल के प्रकार को ऑब्जेक्ट के रूप में परिभाषित करके किया जाता है।[8] C++ जैसे अन्य लोगों की आवश्यकता है कि आप एक विधि देखने के लिए GetIDsOfNames को स्पष्ट रूप से कॉल करें और इसे कॉल करने के लिए कहे |
NET में लेट बाइंडिंग
.NET में, लेट बाइंडिंग का अर्थ C++ जैसी वर्चुअल विधि को ओवरराइड करना या इंटरफेस लागू करना है। कंपाइलर हर वर्चुअल या इंटरफेस मेथड कॉल के लिए वर्चुअल टेबल बनाता है जिसका उपयोग निष्पादन के कार्यान्वयन को निर्धारित करने के लिए रन-टाइम पर किया जाता है।
कॉम और जावा की तरह, कॉमन लैंग्वेज रनटाइम रिफ्लेक्शन एपीआई प्रदान करता है जो लेट बाइंडिंग कॉल कर सकता है। इन कॉल्स का उपयोग भाषा के अनुसार भिन्न होता है।
सी # 4 के साथ, भाषा ने डायनमिक कूट प्रकार को भी जोड़ा ताकि यह इंगित करने के लिए ऑब्जेक्ट प्रकार के स्थान पर उपयोग किया जाएगा कि लेट बाइंडिंग उपयोगी है। आवश्यक विशिष्ट लेट बाइंडिंग क्रियाबिधि को डायनेमिक भाषा कार्य समय को शुरुआती बिंदु के रूप में उपयोग करते हुए कार्य समय पर निर्धारित किया जाता है।
जब भी वेरिएबल टाइप ऑब्जेक्ट का होता है और कंपाइलर डायरेक्टिव "ऑप्शन स्ट्रिक्ट ऑफ" लागू होता है, तो विजुअल बेसिक उनका उपयोग करता है। यह एक नए वीबी प्रोजेक्ट के लिए न्यूनता समायोजन है। संस्करण 9 से पहले, केवल .NET और COM ऑब्जेक्ट लेट बाउंड हो सकते थे। वीबी 10 के साथ, इसे डीएलआर-आधारित ऑब्जेक्ट तक बढ़ा दिया गया है।
जावा में लेट बाइंडिंग
जावा में लेट बाइंडिंग की तीन परिभाषाएँ हैं।
जावा पर प्रारम्भ में दस्तावेजो पर चर्चा की गई कि कैसे संकलक(कंपाइल) के समय पर क्लासेस को एक साथ नहीं जोड़ा गया था। जबकि प्रकारों को संकलन समय पर सांख्यिकीय रूप से जांचा जाता है, कक्षाओं के लिए अलग-अलग कार्यान्वयनों को रनटाइम से ठीक पहले क्लास फाइल को अधिलेखित करके स्वैप किया जा सकता है। जब तक नई कक्षा की परिभाषा में समान वर्ग और विधि के नाम होते हैं, तब तक कोड काम करेगा। इस अर्थ में यह लेट बाइंडिंग की पारंपरिक परिभाषा के समान है।
वर्तमान में, जावा प्रोग्रामिंग में डायनामिक डिस्पैच के पर्याय के रूप में लेट बाइंडिंग शब्द का उपयोग करना लोकप्रिय है। विशेष रूप से, यह जावा के एकल प्रेषण कार्यबिधि को संदर्भित करता है जिसका उपयोग आभासी विधियों के साथ किया जाता है।
अंत में, जावा अपने प्रतिबिंब एपीआई का उपयोग करके लेट बाइंडिंग का उपयोग कर सकता है और आत्मनिरीक्षण टाइप कर सकता है उसी तरह जैसे यह COM और .NET प्रोग्रामिंग में किया जाता है। आम तौर पर जो केवल जावा में प्रोग्राम करते हैं, वे इस लेट बाइंडिंग को नहीं करते हैं। इसी तरह जावा प्रोग्रामिंग में "डक टाइपिंग" तकनीकों का उपयोग किया जाता है, इसके बजाय अमूर्त इंटरफेस का उपयोग किया जाता है।
जावा के वर्तमान मालिक ओरेकल को "डक टाइपिंग" अर्थ में लेट बाइंडिंग शब्द का उपयोग करने के लिए जाना जाता है, जब एक ही दस्तावेज में जावा और अन्य भाषाओं दोनों पर चर्चा की जाती है।[9]
पीएल/एसक्यूएल और एडीए में लेट बाइंडिंग
Ada और डेटाबेस-संग्रहीत कार्यविधि के बीच अर्ली बाइंडिंग का उपयोग करते समय, यह सत्यापित करने के लिए एक टाइमस्टैम्प की जाँच की जाती है कि संग्रहीत कार्यविधि कोड संकलित होने के बाद से नहीं बदली है। जबकि यह धीमा हो सकता है, यह संग्रहीत प्रक्रिया में परिवर्तन होने पर सभी क्लाइंट अनुप्रयोगों को पुन: संकलित करने की आवश्यकता को हटा देता है।
लेट बाइंडिंग का उपयोग करते समय टाइमस्टैम्प चेक नहीं किया जाता है,और संग्रहीत प्रक्रिया को अज्ञात पीएल/एसक्यूएल ब्लॉक के माध्यम से निष्पादित किया जाता है। जबकि यह धीमा हो सकता है, यह संग्रहीत प्रक्रिया में परिवर्तन होने पर सभी उपभोगता अनुप्रयोगों को पुन: संकलित करने की आवश्यकता को हटा देता है।
यह अंतर पीएल/एसक्यूएल और एडीए के लिए अद्वितीय प्रतीत होता है। अन्य भाषाएँ जो पीएल/एसक्यूएल प्रक्रियाओं को कॉल कर सकती हैं,और साथ ही साथ अन्य डेटाबेस इंजन, केवल लेट बाइंडिंग का उपयोग करती हैं।
आलोचना
प्रारंभिक बाउंड मेथड कॉल की तुलना में लेट बाइंडिंग का प्रदर्शन खराब होता है। अधिकांश कार्यान्वयन के तहत, प्रत्येक कॉल के साथ सही विधि का पता नाम से देखा जाना चाहिए, जिसके लिए अपेक्षाकृत महंगी शब्दकोश खोज और संभवतः ओवरलोड संकल्प तर्क की आवश्यकता होती है। अधिकांश अनुप्रयोगों में, आधुनिक कंप्यूटरों पर आवश्यक अतिरिक्त गणना और समय नगण्य होता है।
कुछ कंपाइलरों के लिए, लेट बाइंडिंग स्थिर प्रकार की जाँच के उपयोग को रोक सकती है। लेट बाउंड कॉल करते समय, कंपाइलर को यह मान लेना चाहिए कि विधि मौजूद है। इसका मतलब है कि एक साधारण वर्तनी त्रुटि रन-टाइम त्रुटि का कारण बन सकती है। आधुनिक संकलक यह सुनिश्चित करके इससे बचते हैं कि संकलन के दौरान हर संभव कॉल का कार्यान्वयन होना चाहिए।
लेटबाइंडिंग एक एकीकृत विकास पर्यावरण (आईडीई) द्वारा आवश्यक स्थिर विश्लेषण के रूपों को रोक सकता है। उदाहरण के लिए, आईडीई की "परिभाषा पर जाएं" सुविधा लेट-बाउंड कॉल पर कार्य नहीं कर सकती है, यदि आईडीई के पास यह जानने का कोई तरीका नहीं है कि कॉल किस वर्ग को संदर्भित कर सकता है। एक आधुनिक आईडीई आसानी से इसे विशेष रूप से ऑब्जेक्ट-ओरिएंटेड भाषाओं के लिए हल करता है क्योंकि लेट-बाउंड विधि हमेशा एक इंटरफेस या बेस क्लास निर्दिष्ट करती है,जहां "परिभाषा पर जाएं" होता है, और "सभी संदर्भ खोजें" का उपयोग सभी कार्यान्वयन या ओवरराइड खोजने के लिए किया जा सकता है।
यह भी देखें
- देर से जुड़ना
- गतिशील लिंकर
- गतिशील प्रेषण
- नाम बंधन
संदर्भ
- ↑ Booch, Grady. Object-oriented Analysis and Design. Addison-Wesley, 1994. p71
- ↑ "Using early binding and late binding in Automation". Microsoft. 2003-09-06. Archived from the original on 2014-06-27. Retrieved 2014-06-27.
- ↑ "The Structure of the Java Virtual Machine: Dynamic Linking". Sun Microsystems. 1999. sec. 3.6.3. Retrieved 2013-09-21.
- ↑ Software engineering techniques, J. N. Buxton, Brian Randell, NATO Science Committee, NATO Science Committee, 1970
- ↑ "Dr. Alan Kay on the Meaning of "Object-Oriented Programming"". Purl.org. Retrieved 2013-08-16.
- ↑ "Using early binding and late binding in Automation". Support.microsoft.com. Retrieved 2011-01-15.
- ↑ "12.5 — The virtual table « Learn C". Learncpp.com. 2008-02-08. Retrieved 2013-08-16.
- ↑ "Early and Late Binding, Oracle SQL *Module for Ada Programmer's Guide". Download.oracle.com. Retrieved 2011-01-15.
- ↑ "Calling into WebLogic Server from a COM Client Application". Download.oracle.com. Retrieved 2013-08-16.