पोलिमोर्फ़िज्म (कंप्यूटर विज्ञान)

कंप्यूटर विज्ञान में, पोलिमोर्फ़िज्म (polymorphism) प्रोग्रामिंग भाषा की एक विशेषता है जो डेटा के भिन्न प्रकारों को एक समान इंटरफेस का उपयोग करते हुए हेंडल करने में मदद करती है। पैरामीट्रिक पोलिमोर्फ़िज्मकी अवधारणा डेटा के प्रकार और फंक्शन (functions) दोनों पर लागू होती है। एक फंक्शन जो भिन्न प्रकारों के मान का मूल्यांकन कर सकता है या इन पर लागू हो सकता है एक बहुरूपी फंक्शन (polymorphic function) कहलाता है।
एक डेटा प्रकार जो एक सामान्यीकृत प्रकार (generalized type) (उदाहरण मनमाने प्रकारों के तत्वों की एक सूची) के रूप में प्रकट हो सकता है, वह सामान्यीकृत प्रकार की तरह निर्दिष्ट बहुरूपी डेटा प्रकार (polymorphic data type) है, जिससे इस प्रकार की विशेषज्ञता का निर्माण होता है।
मूल रूप से पोलिमोर्फ़िज्मके दो भिन्न प्रकार हैं, जिनका वर्णन अनौपचारिक रूप से 1967 में क्रिस्टोफर स्ट्रेची के द्वारा किया गया था। यदि वास्तविक प्रकारों की रेंज जिसे परिमित और संयोजन में प्रयुक्त किया जा सकता है, उसे उपयोग से व्यग्तिगत रूप से निर्दिष्ट किया जाना चाहिए, यह तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism) कहलाती है। यदि सभी कोड किसी विशेष प्रकार के उल्लेख के बिना लेखे गए हैं और इस प्रकार से इन्हें नए प्रकार की किसी भी संख्या के साथ प्रयुक्त किया जा सकता है, यह पैरामीट्रिक पोलिमोर्फ़िज्म (parametric polymorphism) कहलाती है।
जॉन सी. रेनाल्ड्स (और बाद में जीन-यवेस गिरार्ड) ने औपचारिक रूप से पोलिमोर्फ़िज्मकी इस धारणा को लेम्बडा केलकुलस (lambda calculus) के विस्तार के रूप में विकसित किया (यह बहुरूपी लेम्बडा केलकुलस या सिस्टम एफ कहलाती है)
ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग (object-oriented programming) में, तदर्थ पोलिमोर्फ़िज्म (ad-hoc polymorphism) प्रकार सिद्धांत (type theory) में एक अवधारणा है जिसमें नाम कई भिन्न प्रकारों के उदाहरणों को व्यक्त कर सकते हैं, जब तक वे किसी सामान्य सुपर वर्ग (common super class) से सम्बंधित हैं। तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism) आमतौर पर सबटाइपिंग के माध्यम से समर्थन प्राप्त करती है, जैसे भिन्न प्रकार के ऑब्जेक्ट किसी अन्य प्रकार के ऑब्जेक्ट (उनके आधार प्रकार (their base type)) के लिए पूरी तरह से प्रतिस्थापन योग्य होते हैं और इस प्रकार से इन्हें सामान्य इंटरफेस के माध्यम से हेंडल किया जा सकता है।
तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism) फंक्शन और विधि ओवरलोडिंग का प्रयोग करते हुए कई भाषाओँ में भी समर्थन प्राप्त करती है।
पैरामीट्रिक पोलिमोर्फ़िज्म (Parametric polymorphism) को सांख्यिकीय रूप से टाइप की गयी कार्यात्मक प्रोग्रामिंग भाषा (functional programming languages) से भी व्यापक समर्थन प्राप्त होता है।
ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग समुदाय में पैरामीट्रिक पोलिमोर्फ़िज्मका उपयोग करने वाली प्रोग्रामिंग अक्सर जिनेरिक प्रोग्रामिंग (generic programming) कहलाती है।

पैरामीट्रिक पोलिमोर्फ़िज्म (Parametric polymorphism)

पैरामीट्रिक पोलिमोर्फ़िज्मएक भाषा को अधिक अभिव्यक्तिपूर्ण बनाने का एक तरीका है, जबकि फिर भी यह पूर्ण सांख्यिकीय प्रकार-सुरक्षा (type-safety) को बनाये रखता है।
{0{1}}पैरामीट्रिक पोलिमोर्फ़िज्मका उपयोग करते हुए, एक फंक्शन या डेटा प्रकार को जिनेरिक रूप से लिखा जा सकता है ताकि वह मान के प्रकार पर निर्भर न करते हुए, मान को समान रूप से हेंडल कर सके.
उदाहरण के लिए, एक फंक्शन अपेण्ड जो दो सूचियों को जोड़ता है, उसका निर्माण इस तरीके से किया जा सकता है कि इसे तत्व के प्रकार से कोई फर्क नहीं पड़ता: यह पुर्णान्कों की सूची को, वास्तविक संख्याओं की सूची को, श्रृंखला की सूची को और इस प्रकार से कई अन्य सूचियों को संलग्न (append) कर सकता है। माना कि इस सूची में प्रकार चर a तत्व के प्रकार को निरुपित करता है।
तब अपेण्ड को [a ] × [a ] → [a ] रूप में टाइप किया जा सकता है, जहां [a ] प्रकार a के तत्वों की सूची को निरुपित करता है।
हम कहते हैं कि अपेण्ड का प्रकार a के सभी मानों के लिए a के द्वारा पैरामिट्रीकृत होता है। (ध्यान दें कि चूंकि एक ही प्रकार का चर होता है, फंक्शन को सूचियों के किसी भी युग्म पर लागू नहीं किया जा सकता है: युग्म और परिणाम सूची, में समान प्रकार के तत्व होने चाहिए.) हर स्थान के लिए जहां अपेण्ड लागू किया जाता है, a के लिए एक मान को निर्धारित किया जाता है।
पैरामीट्रिक पोलिमोर्फ़िज्मको सबसे पहले 1976 में ML में प्रोग्रामिंग भाषाओँ के लिए शुरू किया गया।
वर्तमान में यह स्टैण्डर्ड ML, OCaml, Ada (आदा), Haskell (हास्केल), C++, विजुअल प्रोलोग और अन्य में मौजूद है। जावा, C#, Visual Basic .NET और डेल्फी (कोड गियर) में से प्रत्येक ने हाल ही में पैरामीट्रिक पोलिमोर्फ़िज्मके लिए "जेनेरिक्स" की शुरुआत की है।
पोलिमोर्फ़िज्मका सबसे सामान्य रूप "उच्च श्रेणी की इमप्रेडीकेटिव पोलिमोर्फ़िज्म (higher-rank impredicative polymorphism)" है।
इस रूप के दो लोकप्रिय प्रतिबन्ध हैं प्रतिबंधित रैंक पोलिमोर्फ़िज्म (restricted rank polymorphism) (उदाहरण के लिए, रैंक-1 या प्रिनेक्स पोलिमोर्फ़िज्म (prenex polymorphism)) और प्रेडीकेटिव पोलिमोर्फ़िज्म (predicative polymorphism).
साथ ही, ये प्रतिबन्ध "प्रेडीकेटिव प्रिनेक्स पोलिमोर्फ़िज्म (predicative prenex polymorphism)" देते हैं, जो आवश्यक रूप से ML और हास्केल के प्रारंभिक संस्करणों में पायी जाने वाली पोलिमोर्फ़िज्मका रूप है।

रैंक-1 (प्रिनेक्स) पोलिमोर्फ़िज्म

एक प्रिनेक्स (prenex) बहुरूपी प्रणाली में, प्रकार चर को बहुरूपी प्रकार से instantiated नहीं किया जा सकता है। यह "ML-शैली (ML-style)" या "लेट-पोलिमोर्फ़िज्म (Let-polymorphism)" के बहुत समान है (तकनीकी रूप से ML की लेट-पोलिमोर्फ़िज्ममें कुछ अन्य वाक्यात्मक प्रतिबंध (syntactic restrictions) होते है).
यह प्रतिबंध बहुरूपी और गैर बहुरूपी प्रकारों के बीच विभेद को बहुत महत्वपूर्ण बनाता है; इस प्रकार से प्रेडीकेटिव प्रणालियों में बहुरूपी प्रकार को सामान्य (एकरूपी) प्रकार से विभेदित करने के लिए कभी कभी टाइप स्कीमाज (type schemas) के रूप में संदर्भित किया जाता है, इन एकरूपी प्रकारों को कभी कभी मोनोटाइप (monotypes) कहा जाता है।
एक परिणाम यह है कि सभी प्रकारों को एक रूप में लिखा जा सकता है, जो सभी क्वान्टीफायर्स (quantifiers) को सबसे बाहरी (प्रिनेक्स) स्थिति में रखता है।
उदाहरण के लिए, ऊपर वर्णित अपेण्ड फंक्शन पर विचार करें, जिसमें प्रकार [a ] × [a ] → [a ] है; इस फंक्शन को सूची के एक युग्म पर लागू करने के लिए, एक प्रकार को फंक्शन के प्रकार में चर a के लिए इस प्रकार से प्रतिस्थापित किया जाना चाहिए, तर्क का प्रकार परिणामी फंक्शन प्रकार से मेल खाए. एक इमप्रेडीकेटिव प्रणाली में, प्रतिस्थापित किया जाने वाला प्रकार कोई भी ऐसा प्रकार हो सकता है, जिसमें एक ऐसा प्रकार शामिल हो जो खुद बहुरूपी हो; इस प्रकार से अपेण्ड को किसी भी प्रकार के तत्वों से युक्त सूची के युग्म पर लागू किया जा सकता है-- यहां तक कि बहुरूपी फंक्शन की सूची जैसे खुद अपेण्ड पर भी लागू किया जा सकता है।
भाषा ML और इसके निकट सम्बन्धियों में पोलिमोर्फ़िज्मप्रेडीकेटिव है। इसका कारण यह है कि प्रेडीकेटिवीटी, अन्य प्रतिबंधों के साथ, प्रकार प्रणाली को इतना साधारण बनाती है कि प्रकार निष्कर्ष संभव हो जाता है। भाषाओं में जहां बहुरूपी फंक्शन को लागू करते समय स्पष्ट प्रकार के एनोटेशन आवश्यक हैं प्रेडीकेटिवीटी प्रतिबन्ध कम महत्वपूर्ण हैं; इस प्रकार से ये भाषाएं सामान्यतया इम प्रेडीकेटिव होती हैं। हास्केल प्रेडीकेटिवीटी के बिना लेकिन कुछ जटिलताओं के साथ प्रकार निष्कर्ष प्राप्त कर लेता है।

रैंक- k पोलिमोर्फ़िज्म

k के किसी निश्चित मान के लिए, रैंक-k पोलिमोर्फ़िज्मएक प्रणाली है जिसमें एक क्वान्टीफायर k एरो से अधिक के बायीं और प्रकट नहीं हो सकता (जब प्रकार को एक पेड़ के रूप में चित्रित किया जाता है).
रैंक-2 पोलिमोर्फ़िज्मके लिए प्रकार पुनर्निमाण को निर्धारित किया जा सकता है, लेकिन रैंक-3 और उपरोक्त का पुनर्निमाण नहीं किया जा सकता है।

रैंक-n ("उच्च-रैंक") पोलिमोर्फ़िज्म

रैंक-n पोलिमोर्फ़िज्मएक ऐसी पोलिमोर्फ़िज्महै जिसमें क्वान्टी फायर्स कई याद्रीचछिक एरो के बायीं और प्रकट होते हैं।

प्रेडीकेटिव पोलिमोर्फ़िज्म (Predicative polymorphism)

एक प्रेडीकेटिव पैरामीट्रिक बहुरूपी प्रणाली में, एक प्रकार चर \alpha से युक्त एक प्रकार \tau का प्रयोग इस तरीके से नहीं किया जा सकता है कि \alpha एक बहुरूपी प्रकार के लिए इन्स टेनीटिएट हो सके.

इमप्रेडीकेटिव पोलिमोर्फ़िज्म (Impredicative polymorphism) ("प्रथम श्रेणी" की बहुरूपता)

इसे प्रथम श्रेणी की पोलिमोर्फ़िज्मकहा जाता है। इमप्रेडीकेटिव बहुरूपता, बहुरूपी प्रकार जैसे खुद \tau सहित किसी भी प्रकार से एक प्रकार \tau में एक चर के इन्सटेनटिएशन में मदद करता है।
प्रकार सिद्धांत में, सबसे ज्यादा अध्ययन किये जाने वाले इमप्रेडीकेटिव प्रकार λ-केल्कुली लेम्बडा घन विशेष रूप से प्रणाली एफ पर आधारित हैं। प्रेडी केटिव प्रकार सिद्धांतों में मार्टिन-Löf प्रकार सिद्धांत और NuPRL शामिल हैं।

बंधित पैरामीट्रिक पोलिमोर्फ़िज्म (Bounded parametric polymorphism)

कार्डेली और वेगनर ने प्रकार पेरामीटर पर बन्ध (bounds) की अनुमति के लाभों को 1985 में पहचाना. कई गतिविधियों (operations) के लिए डेटा प्रकार के कुछ ज्ञान की जरुरत होती है, लेकिन ये फिर भी पैरामीट्रिक रूप से काम कर सकते हैं।
उदाहरण के लिए, एक आइटम एक सूची में शामिल किया गया है या नहीं, इसकी जांच के लिए, हमें समानता के लिए आइटमों की तुलना करनी होती है। मानक ML (Standard ML) में, रूप ’’a के प्रकार पैरामीटर प्रतिबंधित होते हैं जिससे समानता की क्रियाविधि उपलब्ध हो जाती है, इस प्रकार से फंक्शन में प्रकार ’’a × ’’a list → bool होगा और ’’a केवल परिभषित समानता से युक्त एक प्रकार हो सकता है। हास्केल में, बंधन (bounding) की प्राप्ति एक प्रकार वर्ग से सम्बंधित करने के लिए आवश्यक प्रकारों के द्वारा होती है; इस प्रकार से हास्केल में समान फंक्शन में प्रकार {\scriptstyle Eq \, \alpha \, \Rightarrow \alpha \, \rightarrow \left[\alpha \right] \rightarrow Bool} होता है। अधिकांश ऑब्जेक्ट ओरियनटेड प्रोग्रामिंग भाषायें, जो पैरामीट्रिक पोलिमोर्फ़िज्मका समर्थन करती हैं, उनमें पैरामीटर्स को एक दिए गए प्रकार (देखें #नीचे सबटाइपिंग पोलिमोर्फ़िज्मऔरजिनेरिक प्रोग्रामिंग पर लेख) के सबटाइप बनने के लिए विवश किया जा सकता है।

देर से बंधित होने वाली भाषाओँ के लिए तदर्थ पोलिमोर्फ़िज्म (Ad-hoc polymorphism for late bound languages)

पिछले सेक्शन में बताये गए तरीकों के अलावा, ऐसे और भी तरीकें हैं जिनमें तदर्थ पोलिमोर्फ़िज्मकाम कर सकती है।

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