बहुरूपता (कंप्यूटर विज्ञान)

From alpha
Jump to navigation Jump to search

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

  • तदर्थ बहुरूपता: व्यक्तिगत रूप से निर्दिष्ट प्रकारों के मनमाने सेट के लिए एक सामान्य इंटरफ़ेस को परिभाषित करता है।
  • पैरामीट्रिक बहुरूपता: ठोस प्रकारों को निर्दिष्ट नहीं करना और इसके बजाय अमूर्त प्रतीकों का उपयोग करना जो किसी भी प्रकार का स्थानापन्न कर सकते हैं।
  • उपप्रकार (उपप्रकार बहुरूपता या समावेशन बहुरूपता भी कहा जाता है): जब एक नाम कुछ सामान्य सुपरक्लास से संबंधित कई अलग-अलग वर्गों के उदाहरणों को दर्शाता है।[4]


इतिहास

1960 के दशक में बहुरूपी प्रकार की प्रणालियों में रुचि महत्वपूर्ण रूप से विकसित हुई, जिसमें व्यावहारिक कार्यान्वयन दशक के अंत तक दिखाई देने लगे। तदर्थ बहुरूपता और पैरामीट्रिक बहुरूपता मूल रूप से प्रोग्रामिंग भाषाओं में क्रिस्टोफर स्ट्रेची की मौलिक अवधारणाओं में वर्णित थे,[5] जहाँ उन्हें बहुरूपता के दो मुख्य वर्गों के रूप में सूचीबद्ध किया गया है। तदर्थ बहुरूपता एल्गोल 68 की एक विशेषता थी, जबकि पैरामीट्रिक बहुरूपता एमएल (प्रोग्रामिंग भाषा) की प्रकार प्रणाली की मुख्य विशेषता थी।

1985 के एक पेपर में, पीटर वेगनर और लुका कार्डेली ने मॉडल उपप्रकारों और वंशानुक्रम (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) के लिए समावेशन बहुरूपता शब्द की शुरुआत की।[2]इसे लागू करने वाली पहली प्रोग्रामिंग भाषा के रूप में शुरुआत का हवाला देते हुए।

प्रकार

तदर्थ बहुरूपता

क्रिस्टोफर स्ट्रैची ने बहुरूपी कार्यों को संदर्भित करने के लिए तदर्थ बहुरूपता शब्द का चयन किया, जो विभिन्न प्रकार के तर्कों पर लागू किया जा सकता है, लेकिन वे तर्क के प्रकार के आधार पर अलग-अलग व्यवहार करते हैं, जिस पर वे लागू होते हैं (जिसे समारोह अधिभार या ऑपरेटर ओवरलोडिंग भी कहा जाता है)।[5]इस संदर्भ में तदर्थ शब्द अपमानजनक होने का इरादा नहीं है; यह केवल इस तथ्य को संदर्भित करता है कि इस प्रकार का बहुरूपता प्रकार प्रणाली की मूलभूत विशेषता नहीं है। नीचे दिए गए पास्कल (प्रोग्रामिंग भाषा) / डेल्फी (प्रोग्रामिंग भाषा) उदाहरण में, Add आमंत्रणों को देखते समय कार्य विभिन्न प्रकारों पर सामान्य रूप से काम करते प्रतीत होते हैं, लेकिन सभी उद्देश्यों और उद्देश्यों के लिए संकलक द्वारा दो पूरी तरह से अलग कार्य माना जाता है:

<वाक्यविन्यास प्रकाश लैंग = पास्कल> कार्यक्रम तदर्थ;

फ़ंक्शन जोड़ें (एक्स, वाई: पूर्णांक): पूर्णांक; शुरू

   जोड़ := x + y

अंत;

फ़ंक्शन जोड़ें (एस, टी: स्ट्रिंग): स्ट्रिंग; शुरू

   जोड़ें := Concat(s, t)

अंत;

शुरू

   राइटलन (जोड़ें (1, 2)); (* प्रिंट 3 *)
   राइट्लन (जोड़ें ('हैलो,', 'स्तनधारी!')); (* हैलो, स्तनधारियों को प्रिंट करता है! *)

अंत। </वाक्यविन्यास हाइलाइट>

गतिशील रूप से टाइप की गई भाषाओं में स्थिति अधिक जटिल हो सकती है क्योंकि सही फ़ंक्शन को लागू करने की आवश्यकता केवल रन टाइम पर निर्धारित हो सकती है।

अंतर्निहित प्रकार के रूपांतरण को बहुरूपता के एक रूप के रूप में भी परिभाषित किया गया है, जिसे ज़बरदस्ती बहुरूपता कहा जाता है।[2][6]


पैरामीट्रिक बहुरूपता

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

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

पैरामीट्रिक बहुरूपता कार्यात्मक प्रोग्रामिंग में सर्वव्यापी है, जहां इसे अक्सर बहुरूपता के रूप में संदर्भित किया जाता है। हास्केल (प्रोग्रामिंग भाषा) में निम्न उदाहरण एक पैरामीटरयुक्त सूची डेटा प्रकार और उन पर दो पैरामीट्रिक रूप से बहुरूपी कार्य दिखाता है:

<वाक्यविन्यास लैंग = हास्केल> डेटा सूची ए = शून्य | विपक्ष ए (सूची ए)

लम्बाई :: सूची ए -> पूर्णांक लंबाई निल = 0 लंबाई (विपक्ष x xs) = 1 + लंबाई xs

नक्शा :: (ए -> बी) -> सूची ए -> सूची बी नक्शा च शून्य = शून्य मानचित्र f (विपक्ष x xs) = विपक्ष (f x) (नक्शा f xs) </वाक्यविन्यास हाइलाइट>

पैरामीट्रिक बहुरूपता कई वस्तु-उन्मुख भाषाओं में भी उपलब्ध है। उदाहरण के लिए, C++ और D में टेम्पलेट (सी ++)C++), या Java में C#, डेल्फी, जावा और गो में जेनरिक नाम के तहत:

<वाक्यविन्यास प्रकाश लैंग = सीशार्प> वर्ग सूची <टी> {

   क्लास नोड <टी> {
       तत्व;
       नोड <टी> अगला;
   }
   नोड <टी> सिर;
   पूर्णांक लंबाई () {...}

}

सूची <बी> मानचित्र (फंक <ए, बी> एफ, सूची <ए> एक्सएस) {

   ...

} </वाक्यविन्यास हाइलाइट>

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

सबटाइपिंग

बहुरूपता के किसी विशेष मामले में उपयोग किए जा सकने वाले प्रकारों की श्रेणी को प्रतिबंधित करने के लिए कुछ भाषाएं उपप्रकार (उपप्रकार बहुरूपता या समावेशन बहुरूपता भी कहा जाता है) के विचार को नियोजित करती हैं। इन भाषाओं में, उपप्रकार एक निश्चित प्रकार के टी की वस्तु लेने के लिए एक फ़ंक्शन को लिखने की अनुमति देता है, लेकिन यह सही ढंग से काम करता है, अगर किसी प्रकार के एस से संबंधित वस्तु को पारित किया जाता है जो कि टी का एक उपप्रकार है (लिस्कोव प्रतिस्थापन सिद्धांत के अनुसार) . इस प्रकार के संबंध को कभी-कभी S <: T लिखा जाता है। इसके विपरीत, T को S—लिखित T :> S का सुपरटाइप कहा जाता है। उपप्रकार बहुरूपता को आमतौर पर गतिशील रूप से हल किया जाता है (नीचे देखें)।

निम्नलिखित जावा उदाहरण में हम बिल्लियों और कुत्तों को जानवरों के उपप्रकार बनाते हैं। प्रक्रिया letsHear() एक जानवर को स्वीकार करता है, लेकिन यह भी सही ढंग से काम करेगा अगर इसे एक उपप्रकार पास किया जाए:

<वाक्यविन्यास प्रकाश लैंग = जावा> सार वर्ग पशु {

   सार स्ट्रिंग टॉक ();

}

वर्ग बिल्ली पशु का विस्तार करती है {

   स्ट्रिंग टॉक () {
       म्याऊ वापस करो! ;
   }

}

क्लास डॉग एनिमल {

   स्ट्रिंग टॉक () {
       वाह! ;
   }

}

स्थैतिक शून्य LetHear (अंतिम पशु क) {

   प्रिंट्लन (ए टॉक ());

}

स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) {

   LetHear (नई बिल्ली ());
   LetHear (नया कुत्ता ());

} </वाक्यविन्यास हाइलाइट>

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

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

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

वही अधिकांश अन्य लोकप्रिय ऑब्जेक्ट सिस्टम के लिए जाता है। हालांकि, कुछ, जैसे कॉमन लिस्प ऑब्जेक्ट सिस्टम, एकाधिक डिस्पैच प्रदान करते हैं, जिसके तहत सभी तर्कों में विधि कॉल बहुरूपी होती हैं।

पैरामीट्रिक बहुरूपता और उपप्रकार के बीच की बातचीत सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और परिबद्ध परिमाणीकरण की अवधारणाओं की ओर ले जाती है।

पंक्ति बहुरूपता

पंक्ति बहुरूपता[8] उपप्रकार से एक समान, लेकिन अलग अवधारणा है। यह संरचनात्मक प्रकार प्रणाली से संबंधित है। यह उन सभी मूल्यों के उपयोग की अनुमति देता है जिनके प्रकार में कुछ गुण होते हैं, शेष प्रकार की जानकारी खोए बिना।

बहुदेववाद

एक संबंधित अवधारणा बहुदेववाद (या डेटा प्रकार की सामान्यता) है। एक बहुरूपी कार्य बहुरूपी की तुलना में अधिक सामान्य है, और इस तरह के एक समारोह में, हालांकि कोई विशिष्ट डेटा प्रकारों के लिए निश्चित तदर्थ मामले प्रदान कर सकता है, एक तदर्थ संयोजक अनुपस्थित है।[9]


कार्यान्वयन पहलू

स्थिर और गतिशील बहुरूपता

जब कार्यान्वयन का चयन किया जाता है तो बहुरूपता को अलग किया जा सकता है: स्थिर रूप से (संकलन समय पर) या गतिशील रूप से (रन टाइम पर, आमतौर पर आभासी समारोह के माध्यम से)। इसे क्रमशः स्थिर प्रेषण और गतिशील प्रेषण के रूप में जाना जाता है, और बहुरूपता के संबंधित रूपों को तदनुसार स्थिर बहुरूपता और गतिशील बहुरूपता कहा जाता है।

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

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

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


यह भी देखें

संदर्भ

  1. Bjarne Stroustrup (February 19, 2007). "Bjarne Stroustrup's C++ Glossary". polymorphism – providing a single interface to entities of different types.
  2. 2.0 2.1 2.2 Cardelli, Luca; Wegner, Peter (December 1985). "समझने के प्रकार, डेटा अमूर्तता और बहुरूपता पर" (PDF). ACM Computing Surveys. 17 (4): 471–523. CiteSeerX 10.1.1.117.695. doi:10.1145/6041.6042. S2CID 2921816.: "Polymorphic types are types whose operations are applicable to values of more than one type."
  3. "बहुरूपता". The Java™ Tutorials: Learning the Java Language: Interfaces and Inheritance. Oracle. Retrieved 2021-09-08.
  4. Conallen, J.; Engle, M.; Houston, K.; Maksimchuk, R.; Young, B.; Booch, G. (2007). ऑब्जेक्ट-ओरिएंटेड विश्लेषण और अनुप्रयोगों के साथ डिजाइन (3rd ed.). Pearson Education. ISBN 9780132797443.
  5. 5.0 5.1 Strachey, Christopher (2000). "प्रोग्रामिंग भाषाओं में मौलिक अवधारणाएँ". Higher-Order and Symbolic Computation. 13 (1/2): 11–49. CiteSeerX 10.1.1.332.3161. doi:10.1023/A:1010000313106. ISSN 1573-0557. S2CID 14124601.
  6. Tucker, Allen B. (2004). कंप्यूटर साइंस हैंडबुक (2nd ed.). Taylor & Francis. pp. 91–. ISBN 978-1-58488-360-9.
  7. Pierce, B.C. (2002). "23.2 Varieties of Polymorphism". प्रकार और प्रोग्रामिंग भाषाएँ. MIT Press. pp. 340–1. ISBN 9780262162098.
  8. Wand, Mitchell (June 1989). "Type inference for record concatenation and multiple inheritance". Proceedings. Fourth Annual Symposium on Logic in Computer Science. pp. 92–97. doi:10.1109/LICS.1989.39162.
  9. Lämmel, Ralf; Visser, Joost (2002). "Typed Combinators for Generic Traversal". घोषणात्मक भाषाओं के व्यावहारिक पहलू: चौथा अंतर्राष्ट्रीय संगोष्ठी. Springer. pp. 137–154, See p. 153. CiteSeerX 10.1.1.18.5727. ISBN 354043092X.
  10. Beingessner, Alexis. "जहां रस्ट नहीं कर सका वहां स्विफ्ट ने डायनेमिक लिंकिंग कैसे हासिल की".


इस पेज में लापता आंतरिक लिंक की सूची

  • डाटा प्रकार
  • सबटाइपिंग
  • प्रकार प्रणाली
  • प्रोग्रामिंग भाषाओं में मौलिक अवधारणाएँ
  • वंशानुक्रम (वस्तु-उन्मुख प्रोग्रामिंग)
  • इसके लिए
  • गतिशील रूप से टाइप किया गया
  • निहित प्रकार रूपांतरण
  • प्रकार- सुरक्षा
  • जावा में जेनरिक
  • समारोह (प्रोग्रामिंग)
  • देर से बाँधना
  • वर्चुअल टेबल
  • उपवर्ग (कंप्यूटर विज्ञान)
  • एकाधिक प्रेषण
  • पुस्तकालय (कम्प्यूटिंग)

बाहरी कड़ियाँ

श्रेणी: उदाहरण सी शार्प कोड वाले लेख श्रेणी: हास्केल कोड के उदाहरण के साथ लेख श्रेणी: जावा कोड के उदाहरण के साथ लेख श्रेणी: पास्कल कोड उदाहरण के साथ लेख श्रेणी:डेटा प्रकार श्रेणी: कार्यात्मक प्रोग्रामिंग श्रेणी:ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग श्रेणी: प्रोग्रामिंग भाषा अवधारणाएं श्रेणी:प्ररूप सिद्धांत श्रेणी:जेनेरिक प्रोग्रामिंग