सबटाइपिंग: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{short description|Form of type polymorphism}} | {{short description|Form of type polymorphism}} | ||
{{Polymorphism}} | {{Polymorphism}} | ||
[[प्रोग्रामिंग भाषा सिद्धांत]] में, सबटाइपिंग (सबटाइपिंग बहुरूपता या समावेशी बहुरूपता भी) [[बहुरूपता (कंप्यूटर विज्ञान)]] का ऐसा रूप है जिसमें सबटाइपिंग ऐसा [[डेटा प्रकार]] है जो [[प्रतिस्थापन]] की कुछ धारणा द्वारा किसी अन्य डेटाटाइप सुपरटाइप से संबंधित है, जिसका अर्थ है कि प्रोग्राम तत्व, सामान्यतः [[सबरूटीन्स]] या फंक्शन, जो सुपरटाइप के तत्वों पर | [[प्रोग्रामिंग भाषा सिद्धांत]] में, सबटाइपिंग (सबटाइपिंग बहुरूपता या समावेशी बहुरूपता भी) [[बहुरूपता (कंप्यूटर विज्ञान)]] का ऐसा रूप है जिसमें सबटाइपिंग ऐसा [[डेटा प्रकार]] है जो [[प्रतिस्थापन]] की कुछ धारणा द्वारा किसी अन्य डेटाटाइप सुपरटाइप से संबंधित है, जिसका अर्थ है कि प्रोग्राम तत्व, सामान्यतः [[सबरूटीन्स]] या फंक्शन, जो सुपरटाइप के तत्वों पर कार्य करने के लिए लिखे गए हैं, वे सबटाइप के तत्वों पर भी कार्य कर सकते हैं। यदि S, T का सबटाइपिंग है, तो सबटाइपिंग बाइनरी संबंध ( {{math|1=''S'' <: ''T''}}, {{math|1=''S'' ⊑ ''T''}},<ref>Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.</ref> या{{math|1=''S'' ≤: ''T''}} के रूप में लिखा गया है ) का तात्पर्य है कि टाइप S के किसी भी शब्द को किसी भी संदर्भ में सुरक्षित रूप से प्रयोग किया जा सकता है जहां टाइप T की आशा की जाती है। यहां सबटाइपिंग का त्रुटिहीन शब्दार्थ विशेष रूप से इस बात पर निर्भर करता है कि सुरक्षित रूप से कैसे उपयोग किया जाए और किसी भी संदर्भ को किसी औपचारिक भाषा या [[प्रोग्रामिंग भाषा]] द्वारा परिभाषित किया गया है। प्रोग्रामिंग भाषा की [[प्रकार प्रणाली]] अनिवार्य रूप से अपने स्वयं के सबटाइपिंग संबंध को परिभाषित करती है, जो [[पहचान संबंध]] हो सकती है, भाषा को रूपांतरण तंत्र का समर्थन नहीं करना चाहिए। | ||
सबटाइपिंग संबंध के कारण, शब्द कई प्रकार का हो सकता है। सबटाइपिंग इसलिए बहुरूपता का रूप है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में 'पॉलीमॉर्फिज्म' शब्द का प्रयोग सामान्यतः केवल इस सबटाइपिंग पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि [[पैरामीट्रिक बहुरूपता]] की | सबटाइपिंग संबंध के कारण, शब्द कई प्रकार का हो सकता है। सबटाइपिंग इसलिए बहुरूपता का रूप है। [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में 'पॉलीमॉर्फिज्म' शब्द का प्रयोग सामान्यतः केवल इस सबटाइपिंग पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि [[पैरामीट्रिक बहुरूपता]] की प्रौद्योगिकी को [[सामान्य प्रोग्रामिंग]] माना जाता है। | ||
[[कार्यात्मक प्रोग्रामिंग भाषाएं]] प्रायः [[रिकॉर्ड (कंप्यूटर विज्ञान)]] के सबटाइपिंग की अनुमति देती हैं। परिणामतः, केवल टाइप किए गए लैम्ब्डा | [[कार्यात्मक प्रोग्रामिंग भाषाएं]] प्रायः [[रिकॉर्ड (कंप्यूटर विज्ञान)]] के सबटाइपिंग की अनुमति देती हैं। परिणामतः, केवल टाइप किए गए लैम्ब्डा गणना को रिकॉर्ड प्रकारों के साथ विस्तारित करना सबसे सरल सैद्धांतिक समुच्चयिंग है जिसमें सबटाइपिंग की उपयोगी धारणा को परिभाषित और अध्ययन किया जा सकता है।<ref>Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.</ref> क्योंकि परिणामी कलन शब्दों को कई प्रकार की अनुमति देता है, यह अब साधारण प्रकार का सिद्धांत नहीं है। कार्यात्मक प्रोग्रामिंग भाषाओं के पश्चात से, परिभाषा के अनुसार, फ़ंक्शन शाब्दिक का समर्थन करता है, जिसे रिकॉर्ड में भी संग्रहीत किया जा सकता है, सबटाइपिंग के साथ रिकॉर्ड प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की कुछ विशेषताएं प्रदान करते हैं। संभवतः कार्य ात्मक प्रोग्रामिंग भाषाएं सामान्यतः प्रतिबंधित, पैरामीट्रिक बहुरूपता का रूप भी प्रदान करती हैं। सैद्धांतिक समुच्चयिंग में, दो विशेषताओं का सम्बन्ध का अध्ययन करना वांछनीय है; सामान्य सैद्धांतिक समुच्चयिंग प्रणाली F<sub><:</sub> है | ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सैद्धांतिक गुणों को कैप्चर करने का प्रयास करने वाली विभिन्न गणनाएं प्रणाली F<sub><:</sub> से प्राप्त की जा सकती हैंI | ||
सबटाइपिंग की अवधारणा [[सम्मोहन]] और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में [[परिबद्ध परिमाणीकरण]] की अवधारणा से भी संबंधित है ([[आदेश-क्रमबद्ध तर्क]] देखें)। सबटाइपिंग को वस्तु-उन्मुख भाषाओं | सबटाइपिंग की अवधारणा [[सम्मोहन]] और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में [[परिबद्ध परिमाणीकरण]] की अवधारणा से भी संबंधित है ([[आदेश-क्रमबद्ध तर्क]] देखें)। सबटाइपिंग को वस्तु-उन्मुख भाषाओं (वर्ग या वस्तु) [[वंशानुक्रम (कंप्यूटर विज्ञान)]] की धारणा के साथ भ्रमित नहीं होना चाहिए | सबटाइपिंग प्रकारों (ऑब्जेक्ट-ओरिएंटेड पार्लेंस में इंटरफेस) के मध्य संबंध है, जबकि वंशानुक्रम भाषा सुविधा से उपजी कार्य समन्वय के मध्य ऐसा संबंध है जो नई वस्तुओं को उपस्तिथ वस्तुओं से बनाने की अनुमति देता है। कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, सबटाइपिंग को इंटरफ़ेस इनहेरिटेंस कहा जाता है, उत्तराधिकार के साथ कार्य समन्वय उत्तराधिकार के रूप में जाना जाता है। | ||
== उत्पत्ति == | == उत्पत्ति == | ||
प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे [[शुरुआत|प्रारंभ]] में डेरिवेटिव्स में पेश किया गया था। सबटाइपिंग का पहला औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने [[निहित रूपांतरण]] को औपचारिक बनाने के लिए [[श्रेणी सिद्धांत]] का उपयोग किया था, और [[लुका कार्डेली]] (1985)।<ref>Pierce, ch. 15 notes</ref> | प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे [[शुरुआत|प्रारंभ]] में डेरिवेटिव्स में पेश किया गया था। सबटाइपिंग का पहला औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने [[निहित रूपांतरण]] को औपचारिक बनाने के लिए [[श्रेणी सिद्धांत]] का उपयोग किया था, और [[लुका कार्डेली]] (1985)।<ref>Pierce, ch. 15 notes</ref> | ||
ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्यधारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में बहुरूपता के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, [[बारबरा लिस्कोव]] के | ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्यधारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में बहुरूपता के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, [[बारबरा लिस्कोव]] के पश्चात सुरक्षित प्रतिस्थापन के सिद्धांत को अक्सर [[लिस्कोव प्रतिस्थापन सिद्धांत]] कहा जाता है, जिसने इसे 1987 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर सम्मेलन में [[मुख्य भाषण]] में लोकप्रिय बनाया था। क्योंकि इसे परिवर्तनशील वस्तुओं पर विचार करना चाहिए, लिस्कोव और [[जेनेट विंग]] द्वारा परिभाषित सबटाइपिंग की आदर्श धारणा, जिसे [[व्यवहार उपप्रकार|व्यवहार सबटाइपिंग]] कहा जाता है, किसी चेकर में लागू किए जा सकने वाले कार्य ों की तुलना में काफी सबल है। (देखना {{section link||फंक्शन के प्रकार}} विवरण के लिए नीचे।) | ||
== उदाहरण == | == उदाहरण == | ||
Line 43: | Line 43: | ||
सूचना विशिष्टता के संदर्भ में, सबटाइपिंग को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में कम से कम उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह सबटाइपिंग की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या पेश किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का हानि यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो सबटाइपिंग के 'प्रचलन' को कम करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)। | सूचना विशिष्टता के संदर्भ में, सबटाइपिंग को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में कम से कम उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह सबटाइपिंग की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या पेश किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का हानि यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो सबटाइपिंग के 'प्रचलन' को कम करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)। | ||
सदस्यता के संदर्भ में, [[सेट-बिल्डर नोटेशन|समुच्चय-बिल्डर नोटेशन]] का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो समुच्चय को परिभाषित करने के लिए विधेय का उपयोग करता है। विधेय को डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का समुच्चय) {{mvar|D}},विधेय आंशिक कार्य हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए कोई पूर्णांक मान 100 से अधिक या 200 से कम के बराबर है? यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान लौटाता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस पैटर्न का रूप है।) | सदस्यता के संदर्भ में, [[सेट-बिल्डर नोटेशन|समुच्चय-बिल्डर नोटेशन]] का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो समुच्चय को परिभाषित करने के लिए विधेय का उपयोग करता है। विधेय को डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का समुच्चय) {{mvar|D}},विधेय आंशिक कार्य हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए कोई पूर्णांक मान 100 से अधिक या 200 से कम के बराबर है? यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान लौटाता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस पैटर्न का रूप है।) | ||
यदि दो विधेय हैं, <math>P_T</math> जो टाइप टी के लिए चयन मानदंड लागू करता है, और <math>P_s</math> जो प्रकार S के लिए अतिरिक्त मानदंड लागू करता है, फिर दो प्रकार के समुच्चय परिभाषित किए जा सकते हैं: | यदि दो विधेय हैं, <math>P_T</math> जो टाइप टी के लिए चयन मानदंड लागू करता है, और <math>P_s</math> जो प्रकार S के लिए अतिरिक्त मानदंड लागू करता है, फिर दो प्रकार के समुच्चय परिभाषित किए जा सकते हैं: | ||
Line 56: | Line 56: | ||
पहले विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, {{nowrap|'''Felis <: Felinae <: Felidae'''}}. | पहले विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, {{nowrap|'''Felis <: Felinae <: Felidae'''}}. | ||
यदि T, S (T:> S) को समाहित करता है तो एक प्रक्रिया,कार्य या अभिव्यक्ति को एक मान दिया जाता है <math>s \in S</math> एक ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप T में से किस के रूप में | यदि T, S (T:> S) को समाहित करता है तो एक प्रक्रिया,कार्य या अभिव्यक्ति को एक मान दिया जाता है <math>s \in S</math> एक ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप T में से किस के रूप में कार्य करने में सक्षम होगा, क्योंकि <math>s \in T</math> है | उपरोक्त उदाहरण में, हम आशा कर सकते हैं कि सबफैमिली का कार्य सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर लागू होगा। | ||
== सबटाइपिंग योजनाएं == | == सबटाइपिंग योजनाएं == | ||
प्रकार सिद्धांतकार [[नाममात्र प्रकार प्रणाली]] के मध्य अंतर करते हैं, जिसमें केवल निश्चित तरीके से घोषित आपस के सबटाइपिंग हो सकते हैं, और [[संरचनात्मक प्रकार प्रणाली]], जिसमें दो प्रकार की संरचना निर्धारित करती है कि वो दूसरे का सबटाइपिंग है या नहीं है। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख भाषा के लिए संरचनात्मक सबटाइपिंग नियम यह कह सकता है कि यदि प्रकार A की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो B प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं, तो A B का सबटाइपिंग है, भले ही दूसरे से वंशानुक्रम हो या नहीं। यह तथाकथित ''[[बतख टाइपिंग]]'' गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में आम है। वस्तु प्रकार के अलावा अन्य प्रकार के लिए ध्वनि संरचनात्मक सबटाइपिंग नियम भी सर्वविदित हैं।{{citation needed|date=June 2012}} | प्रकार सिद्धांतकार [[नाममात्र प्रकार प्रणाली]] के मध्य अंतर करते हैं, जिसमें केवल निश्चित तरीके से घोषित आपस के सबटाइपिंग हो सकते हैं, और [[संरचनात्मक प्रकार प्रणाली]], जिसमें दो प्रकार की संरचना निर्धारित करती है कि वो दूसरे का सबटाइपिंग है या नहीं है। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख भाषा के लिए संरचनात्मक सबटाइपिंग नियम यह कह सकता है कि यदि प्रकार A की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो B प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं, तो A B का सबटाइपिंग है, भले ही दूसरे से वंशानुक्रम हो या नहीं। यह तथाकथित ''[[बतख टाइपिंग]]'' गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में आम है। वस्तु प्रकार के अलावा अन्य प्रकार के लिए ध्वनि संरचनात्मक सबटाइपिंग नियम भी सर्वविदित हैं।{{citation needed|date=June 2012}} | ||
सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के | सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के कार्यसमन्वय दो सामान्य वर्गों में आते हैं: समावेशी कार्यसमन्वय , जिसमें टाइप ए के किसी भी मूल्य का प्रतिनिधित्व भी टाइप बी पर समान मान का प्रतिनिधित्व करता है | यदि ए <: बी, और जबरदस्त कार्यसमन्वय , जिसमें टाइप ए का मान स्वचालित रूप से प्रकार बी में परिवर्तित किया जा सकता है। वस्तु-उन्मुख भाषा में उपवर्गीकरण द्वारा प्रेरित सबटाइपिंग सामान्यतःसमावेशी होता है; पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों से संबंधित सबटाइपिंग संबंध, जो अलग-अलग प्रतिनिधित्व करते हैं, सामान्यतः ज़बरदस्त होते हैं। | ||
सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की प्रणालियों में, यह रिफ्लेक्सिव (मतलब A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इसे प्रकारों पर [[पूर्व आदेश]] बनाता है। | सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की प्रणालियों में, यह रिफ्लेक्सिव (मतलब A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इसे प्रकारों पर [[पूर्व आदेश]] बनाता है। | ||
Line 77: | Line 77: | ||
दूसरी विधि, जिसे डेप्थ सबटाइपिंग कहा जाता है, विभिन्न क्षेत्रों को उनके सबटाइपिंगों से बदल देती है अर्थात्, सबटाइपिंग के क्षेत्र सुपरटाइप के क्षेत्रों के सबटाइपिंग हैं। चूँकि सुपरटाइप में किसी फ़ील्ड के लिए समर्थित कोई भी ऑपरेशन उसके सबटाइपिंग के लिए समर्थित है, रिकॉर्ड सुपरटाइप पर संभव कोई भी ऑपरेशन रिकॉर्ड सबटाइपिंग द्वारा समर्थित है। गहराई सबटाइपिंग केवल अपरिवर्तनीय रिकॉर्ड के लिए समझ में आता है: उदाहरण के लिए, आप कोई वास्तविक बिंदु (दो वास्तविक क्षेत्रों के साथ रिकॉर्ड) के 'x' फ़ील्ड को 1.5 असाइन कर सकते हैं, लेकिन आप 'x' फ़ील्ड के समान नहीं कर सकते पूर्णांक बिंदु (जो, हालांकि, वास्तविक बिंदु प्रकार का गहरा सबटाइपिंग है) क्योंकि 1.5 पूर्णांक नहीं है ([[सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)]] देखें)। | दूसरी विधि, जिसे डेप्थ सबटाइपिंग कहा जाता है, विभिन्न क्षेत्रों को उनके सबटाइपिंगों से बदल देती है अर्थात्, सबटाइपिंग के क्षेत्र सुपरटाइप के क्षेत्रों के सबटाइपिंग हैं। चूँकि सुपरटाइप में किसी फ़ील्ड के लिए समर्थित कोई भी ऑपरेशन उसके सबटाइपिंग के लिए समर्थित है, रिकॉर्ड सुपरटाइप पर संभव कोई भी ऑपरेशन रिकॉर्ड सबटाइपिंग द्वारा समर्थित है। गहराई सबटाइपिंग केवल अपरिवर्तनीय रिकॉर्ड के लिए समझ में आता है: उदाहरण के लिए, आप कोई वास्तविक बिंदु (दो वास्तविक क्षेत्रों के साथ रिकॉर्ड) के 'x' फ़ील्ड को 1.5 असाइन कर सकते हैं, लेकिन आप 'x' फ़ील्ड के समान नहीं कर सकते पूर्णांक बिंदु (जो, हालांकि, वास्तविक बिंदु प्रकार का गहरा सबटाइपिंग है) क्योंकि 1.5 पूर्णांक नहीं है ([[सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)]] देखें)। | ||
अभिलेखों की सबटाइपिंग को System F<sub><:</sub> में परिभाषित किया जा सकता है जो रिकॉर्ड प्रकारों के सबटाइपिंग के साथ पैरामीट्रिक बहुरूपता को जोड़ती है और कई | अभिलेखों की सबटाइपिंग को System F<sub><:</sub> में परिभाषित किया जा सकता है जो रिकॉर्ड प्रकारों के सबटाइपिंग के साथ पैरामीट्रिक बहुरूपता को जोड़ती है और कई कार्य ात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं। | ||
कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे [[बीजगणितीय डेटा प्रकार]]) के सबटाइपिंग का भी समर्थन करती हैं। चौड़ाई सबटाइपिंग का नियम उलटा है,चौड़ाई सबटाइपिंग में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए। | कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे [[बीजगणितीय डेटा प्रकार]]) के सबटाइपिंग का भी समर्थन करती हैं। चौड़ाई सबटाइपिंग का नियम उलटा है,चौड़ाई सबटाइपिंग में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए। | ||
Line 89: | Line 89: | ||
{S_1 \rightarrow S_2 \leq: T_1 \rightarrow T_2} | {S_1 \rightarrow S_2 \leq: T_1 \rightarrow T_2} | ||
</math> | </math> | ||
पैरामीटर प्रकार {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) कहा जाता है क्योंकि इसके लिए सबटाइपिंग संबंध उल्टा होता है, जबकि वापसी का प्रकार सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) है। अनौपचारिक रूप से, यह उलटा होता है क्योंकि परिष्कृत प्रकार उन प्रकारों में अधिक उदार होता है जिन्हें वह स्वीकार करता है और जिस प्रकार से लौटता है उसमें अधिक रूढ़िवादी होता है। [[स्काला (प्रोग्रामिंग भाषा)]] में यही वास्तव में | पैरामीटर प्रकार {{math|1=''S''<sub>1</sub> → ''S''<sub>2</sub>}} सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) कहा जाता है क्योंकि इसके लिए सबटाइपिंग संबंध उल्टा होता है, जबकि वापसी का प्रकार सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) है। अनौपचारिक रूप से, यह उलटा होता है क्योंकि परिष्कृत प्रकार उन प्रकारों में अधिक उदार होता है जिन्हें वह स्वीकार करता है और जिस प्रकार से लौटता है उसमें अधिक रूढ़िवादी होता है। [[स्काला (प्रोग्रामिंग भाषा)]] में यही वास्तव में कार्य करता है: एन-आरी फ़ंक्शन आंतरिक रूप से वो वर्ग है जो इनहेरिट करता है |<math>\mathtt{ Function_N({-A_1}, {-A_2}, \dots, {-A_n}, {+B})}</math> [[विशेषता (कंप्यूटर प्रोग्रामिंग)]] (जिसे [[जावा (प्रोग्रामिंग भाषा)]] जैसी भाषाओं में एक सामान्य [[अप्लिकेशन प्रोग्रामिंग अंतरफलक]] के रूप में देखा जा सकता है), जहां <math>\mathtt{A_1, A_2, \dots, A_n}</math> पैरामीटर प्रकार हैं, और <math>\mathtt{B}</math> इसका वापसी प्रकार है; − प्रकार से पहले का अर्थ है कि प्रकार प्रतिपरिवर्ती है जबकि + का अर्थ सहपरिवर्ती है। | ||
अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं की तरह साइड इफेक्ट की अनुमति देने वाली भाषाओं में, सबटाइपिंग आम तौर पर यह गारंटी देने के लिए पर्याप्त नहीं है कि किसी फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का | अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं की तरह साइड इफेक्ट की अनुमति देने वाली भाषाओं में, सबटाइपिंग आम तौर पर यह गारंटी देने के लिए पर्याप्त नहीं है कि किसी फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का कार्य व्यवहार सबटाइपिंग पर केंद्रित है, जो इस लेख में चर्चा की गई प्रकार प्रणाली सुरक्षा के अलावा यह भी आवश्यक है कि सबटाइपिंग अनुबंध द्वारा कुछ डिजाइन में सुपरटेप द्वारा गारंटीकृत सभी [[अपरिवर्तनीय (कंप्यूटर विज्ञान)]] को संरक्षित करें।<ref name="LSP">Barbara Liskov, Jeannette Wing, ''[http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.39.1223 A behavioral notion of subtyping]'', ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: {{cite web|url=http://reports-archive.adm.cs.cmu.edu/anon/1999/CMU-CS-99-156.ps|title=Behavioral Subtyping Using Invariants and Constraints|last=Liskov|first=Barbara|author-link=Barbara Liskov|author2=Wing, Jeannette |author-link2=Jeannette Wing |date=July 1999|format=[[PostScript|PS]]|access-date=2006-10-05}}</ref> सबटाइपिंग की यह परिभाषा आम तौर पर [[अनिर्णीत समस्या]] है, इसलिए इसे किसी प्रकार के चेकर द्वारा सत्यापित नहीं किया जा सकता है। | ||
[[अपरिवर्तनीय वस्तु]]ओं का सबटाइपिंग पैरामीटर मानों और वापसी मूल्यों के उपचार के समान है। राइट-ओनली रेफरेंस (या सिंक) कंट्रावेरिएंट हैं, जैसे पैरामीटर मान; रीड-ओनली रेफरेंस (या स्रोत) कॉन्वर्सिएंट हैं, जैसे रिटर्न वैल्यू। परिवर्तनीय संदर्भ जो स्रोत और सिंक दोनों के रूप में कार्य करते हैं, वे अपरिवर्तनीय हैं। | [[अपरिवर्तनीय वस्तु]]ओं का सबटाइपिंग पैरामीटर मानों और वापसी मूल्यों के उपचार के समान है। राइट-ओनली रेफरेंस (या सिंक) कंट्रावेरिएंट हैं, जैसे पैरामीटर मान; रीड-ओनली रेफरेंस (या स्रोत) कॉन्वर्सिएंट हैं, जैसे रिटर्न वैल्यू। परिवर्तनीय संदर्भ जो स्रोत और सिंक दोनों के रूप में कार्य करते हैं, वे अपरिवर्तनीय हैं। | ||
== | == उत्तराधिकार के साथ संबंध == | ||
सबटाइपिंग और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, लेकिन कोई भी दूसरे का विशेष मामला नहीं है। दूसरे शब्दों में, दो प्रकार S और T के बीच, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं: | सबटाइपिंग और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, लेकिन कोई भी दूसरे का विशेष मामला नहीं है। दूसरे शब्दों में, दो प्रकार S और T के बीच, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं: | ||
Line 104: | Line 104: | ||
पहला मामला स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे <code>Boolean</code> और <code>Float</code>. | पहला मामला स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे <code>Boolean</code> और <code>Float</code>. | ||
दूसरे मामले को मध्यके संबंध से चित्रित किया जा सकता है <code>Int32</code> और <code>Int64</code>. अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, <code>Int64</code> <code>Int32</code> | दूसरे मामले को मध्यके संबंध से चित्रित किया जा सकता है <code>Int32</code> और <code>Int64</code>. अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, <code>Int64</code> <code>Int32</code> उत्तराधिकार से संबंधित नहीं हैं हालाँकि <code>Int32</code> को <code>Int64</code> का सबटाइपिंग माना जा सकता है चूंकि किसी भी 32 बिट पूर्णांक मान64 बिट पूर्णांक मान में प्रचारित किया जा सकता है। | ||
तीसरा मामला | तीसरा मामला कार्य ों के सबटाइपिंग का परिणाम है। मान लें कि टाइप टी का सुपर क्लास है जिसमें एकल प्रकार की वस्तु लौटाने वाली विधि एम है (यानी एम का प्रकार टी → टी है, यह भी ध्यान दें कि एम का पहला पैरामीटर यह/स्वयं है) और टी से व्युत्पन्न वर्ग प्रकार एस वंशानुक्रम से, S में m का प्रकार S → S है।{{Citation needed|date=July 2022}} S को T का सबटाइपिंग होने के लिए S में m का प्रकार T में m के प्रकार का सबटाइपिंग होना चाहिए {{Citation needed|date=July 2022}}, दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम अप्रतिवर्ती संबंध है, S, T का सबटाइपिंग नहीं हो सकता। | ||
सबटाइपिंग और वंशानुक्रम तब संगत होते हैं जब सभी | सबटाइपिंग और वंशानुक्रम तब संगत होते हैं जब सभी उत्तराधिकार में मिले क्षेत्र और व्युत्पन्न प्रकार के तरीकों में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के सबटाइपिंग होते हैं और उत्तराधिकार में मिले प्रकार के तरीके होते हैं।{{sfn|Cook|Hill|Canning|1990}} | ||
== ज़बरदस्ती == | == ज़बरदस्ती == | ||
जबरदस्ती सबटाइपिंग प्रणालियों में, सबटाइपिंगों को सबटाइपिंग से सुपरटाइप में अंतर्निहित [[प्रकार रूपांतरण]] | जबरदस्ती सबटाइपिंग प्रणालियों में, सबटाइपिंगों को सबटाइपिंग से सुपरटाइप में अंतर्निहित [[प्रकार रूपांतरण]] कार्य ों द्वारा परिभाषित किया जाता है। प्रत्येक सबटाइपिंग संबंध (S <: T) के लिए, ज़बरदस्ती कार्य बल: S → T प्रदान किया जाता है, और प्रकार S के किसी भी वस्तु को वस्तु बल के रूप में माना जाता है<sub>''S'' → ''T''</sub>(s) टाइप T का है। किसी ज़बरदस्ती फ़ंक्शन को रचना द्वारा परिभाषित किया जा सकता है, यदि S <: T और T <: U तो s को यौगिक ज़बरदस्ती के तहत टाइप यू की वस्तु के रूप में माना जा सकता है<sub>''T'' → ''U''</sub> ∘ ज़बरदस्ती<sub>''S'' → ''T''</sub> ईसी प्रकार से अपने आप में ज़बरदस्ती<sub>''T'' → ''T''</sub> [[पहचान समारोह]] आईडी है<sub>T</sub> | ||
रिकॉर्ड के लिए ज़बरदस्ती कार्य और संघ सबटाइपिंगों को अलग करना घटक के अनुसार परिभाषित किया जा सकता है; चौड़ाई-विस्तारित रिकॉर्ड के मामले में, प्रकार की ज़बरदस्ती केवल उन घटकों को छोड़ देती है जो सुपरटेप में परिभाषित नहीं हैं। फ़ंक्शन प्रकारों के लिए प्रकार का दबाव f'(s) = ज़बरदस्ती द्वारा दिया जा सकता है<sub>''S''<sub>2</sub> → टी<sub>2</sub></ उप> (एफ (ज़बरदस्ती<sub>''T''<sub>1</sub> → एस<sub>1</sub></sub>(t))), पैरामीटर मानों के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और वापसी मूल्यों के सहप्रसरण को दर्शाता है। | रिकॉर्ड के लिए ज़बरदस्ती कार्य और संघ सबटाइपिंगों को अलग करना घटक के अनुसार परिभाषित किया जा सकता है; चौड़ाई-विस्तारित रिकॉर्ड के मामले में, प्रकार की ज़बरदस्ती केवल उन घटकों को छोड़ देती है जो सुपरटेप में परिभाषित नहीं हैं। फ़ंक्शन प्रकारों के लिए प्रकार का दबाव f'(s) = ज़बरदस्ती द्वारा दिया जा सकता है<sub>''S''<sub>2</sub> → टी<sub>2</sub></ उप> (एफ (ज़बरदस्ती<sub>''T''<sub>1</sub> → एस<sub>1</sub></sub>(t))), पैरामीटर मानों के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और वापसी मूल्यों के सहप्रसरण को दर्शाता है। | ||
जबरदस्ती का कार्य विशिष्ट रूप से सबटाइपिंग और [[supertype]] को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई सबटाइपिंग संबंधों को परिभाषित किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि सभी प्रकार के दबाव सुसंगत हैं। उदाहरण के लिए, यदि कोई पूर्णांक जैसे 2: इंट को फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए ज़बरदस्ती किया जा सकता है, तो यह 2.1: फ़्लोट टू 2: इंट के लिए ज़बरदस्ती स्वीकार्य नहीं है, क्योंकि यौगिक ज़बरदस्ती ज़बरदस्ती<sub>''float'' → ''float''</sub> जबरदस्ती दिया गया<sub>''int'' → ''float''</sub> ∘ ज़बरदस्ती<sub>''float'' → ''int''</sub> तब पहचान ज़बरदस्ती आईडी से अलग होता<sub>''float''</sub>.है। | जबरदस्ती का कार्य विशिष्ट रूप से सबटाइपिंग और [[supertype]] को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई सबटाइपिंग संबंधों को परिभाषित किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि सभी प्रकार के दबाव सुसंगत हैं। उदाहरण के लिए, यदि कोई पूर्णांक जैसे 2: इंट को फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए ज़बरदस्ती किया जा सकता है, तो यह 2.1: फ़्लोट टू 2: इंट के लिए ज़बरदस्ती स्वीकार्य नहीं है, क्योंकि यौगिक ज़बरदस्ती ज़बरदस्ती<sub>''float'' → ''float''</sub> जबरदस्ती दिया गया<sub>''int'' → ''float''</sub> ∘ ज़बरदस्ती<sub>''float'' → ''int''</sub> तब पहचान ज़बरदस्ती आईडी से अलग होता<sub>''float''</sub>.है। | ||
== यह भी देखें == | == यह भी देखें == |
Revision as of 17:16, 22 February 2023
Polymorphism |
---|
Ad hoc polymorphism |
Parametric polymorphism |
Subtyping |
प्रोग्रामिंग भाषा सिद्धांत में, सबटाइपिंग (सबटाइपिंग बहुरूपता या समावेशी बहुरूपता भी) बहुरूपता (कंप्यूटर विज्ञान) का ऐसा रूप है जिसमें सबटाइपिंग ऐसा डेटा प्रकार है जो प्रतिस्थापन की कुछ धारणा द्वारा किसी अन्य डेटाटाइप सुपरटाइप से संबंधित है, जिसका अर्थ है कि प्रोग्राम तत्व, सामान्यतः सबरूटीन्स या फंक्शन, जो सुपरटाइप के तत्वों पर कार्य करने के लिए लिखे गए हैं, वे सबटाइप के तत्वों पर भी कार्य कर सकते हैं। यदि S, T का सबटाइपिंग है, तो सबटाइपिंग बाइनरी संबंध ( S <: T, S ⊑ T,[1] याS ≤: T के रूप में लिखा गया है ) का तात्पर्य है कि टाइप S के किसी भी शब्द को किसी भी संदर्भ में सुरक्षित रूप से प्रयोग किया जा सकता है जहां टाइप T की आशा की जाती है। यहां सबटाइपिंग का त्रुटिहीन शब्दार्थ विशेष रूप से इस बात पर निर्भर करता है कि सुरक्षित रूप से कैसे उपयोग किया जाए और किसी भी संदर्भ को किसी औपचारिक भाषा या प्रोग्रामिंग भाषा द्वारा परिभाषित किया गया है। प्रोग्रामिंग भाषा की प्रकार प्रणाली अनिवार्य रूप से अपने स्वयं के सबटाइपिंग संबंध को परिभाषित करती है, जो पहचान संबंध हो सकती है, भाषा को रूपांतरण तंत्र का समर्थन नहीं करना चाहिए।
सबटाइपिंग संबंध के कारण, शब्द कई प्रकार का हो सकता है। सबटाइपिंग इसलिए बहुरूपता का रूप है। ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में 'पॉलीमॉर्फिज्म' शब्द का प्रयोग सामान्यतः केवल इस सबटाइपिंग पॉलीमॉर्फिज्म को संदर्भित करने के लिए किया जाता है, जबकि पैरामीट्रिक बहुरूपता की प्रौद्योगिकी को सामान्य प्रोग्रामिंग माना जाता है।
कार्यात्मक प्रोग्रामिंग भाषाएं प्रायः रिकॉर्ड (कंप्यूटर विज्ञान) के सबटाइपिंग की अनुमति देती हैं। परिणामतः, केवल टाइप किए गए लैम्ब्डा गणना को रिकॉर्ड प्रकारों के साथ विस्तारित करना सबसे सरल सैद्धांतिक समुच्चयिंग है जिसमें सबटाइपिंग की उपयोगी धारणा को परिभाषित और अध्ययन किया जा सकता है।[2] क्योंकि परिणामी कलन शब्दों को कई प्रकार की अनुमति देता है, यह अब साधारण प्रकार का सिद्धांत नहीं है। कार्यात्मक प्रोग्रामिंग भाषाओं के पश्चात से, परिभाषा के अनुसार, फ़ंक्शन शाब्दिक का समर्थन करता है, जिसे रिकॉर्ड में भी संग्रहीत किया जा सकता है, सबटाइपिंग के साथ रिकॉर्ड प्रकार ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की कुछ विशेषताएं प्रदान करते हैं। संभवतः कार्य ात्मक प्रोग्रामिंग भाषाएं सामान्यतः प्रतिबंधित, पैरामीट्रिक बहुरूपता का रूप भी प्रदान करती हैं। सैद्धांतिक समुच्चयिंग में, दो विशेषताओं का सम्बन्ध का अध्ययन करना वांछनीय है; सामान्य सैद्धांतिक समुच्चयिंग प्रणाली F<: है | ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग के सैद्धांतिक गुणों को कैप्चर करने का प्रयास करने वाली विभिन्न गणनाएं प्रणाली F<: से प्राप्त की जा सकती हैंI
सबटाइपिंग की अवधारणा सम्मोहन और पवित्रता की भाषाई धारणाओं से संबंधित है। यह गणितीय तर्क में परिबद्ध परिमाणीकरण की अवधारणा से भी संबंधित है (आदेश-क्रमबद्ध तर्क देखें)। सबटाइपिंग को वस्तु-उन्मुख भाषाओं (वर्ग या वस्तु) वंशानुक्रम (कंप्यूटर विज्ञान) की धारणा के साथ भ्रमित नहीं होना चाहिए | सबटाइपिंग प्रकारों (ऑब्जेक्ट-ओरिएंटेड पार्लेंस में इंटरफेस) के मध्य संबंध है, जबकि वंशानुक्रम भाषा सुविधा से उपजी कार्य समन्वय के मध्य ऐसा संबंध है जो नई वस्तुओं को उपस्तिथ वस्तुओं से बनाने की अनुमति देता है। कई ऑब्जेक्ट-ओरिएंटेड भाषाओं में, सबटाइपिंग को इंटरफ़ेस इनहेरिटेंस कहा जाता है, उत्तराधिकार के साथ कार्य समन्वय उत्तराधिकार के रूप में जाना जाता है।
उत्पत्ति
प्रोग्रामिंग भाषाओं में सबटाइपिंग की धारणा 1960 के दशक की है; इसे प्रारंभ में डेरिवेटिव्स में पेश किया गया था। सबटाइपिंग का पहला औपचारिक उपचार 1980 में जॉन सी. रेनॉल्ड्स द्वारा दिया गया था, जिन्होंने निहित रूपांतरण को औपचारिक बनाने के लिए श्रेणी सिद्धांत का उपयोग किया था, और लुका कार्डेली (1985)।[3] ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग की मुख्यधारा अपनाने के साथ सबटाइपिंग की अवधारणा ने दृश्यता (और कुछ हलकों में बहुरूपता के साथ समानार्थक शब्द) प्राप्त की है। इस संदर्भ में, बारबरा लिस्कोव के पश्चात सुरक्षित प्रतिस्थापन के सिद्धांत को अक्सर लिस्कोव प्रतिस्थापन सिद्धांत कहा जाता है, जिसने इसे 1987 में ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग पर सम्मेलन में मुख्य भाषण में लोकप्रिय बनाया था। क्योंकि इसे परिवर्तनशील वस्तुओं पर विचार करना चाहिए, लिस्कोव और जेनेट विंग द्वारा परिभाषित सबटाइपिंग की आदर्श धारणा, जिसे व्यवहार सबटाइपिंग कहा जाता है, किसी चेकर में लागू किए जा सकने वाले कार्य ों की तुलना में काफी सबल है। (देखना § फंक्शन के प्रकार विवरण के लिए नीचे।)
उदाहरण
आरेख में सबटाइपिंगों का सरल व्यावहारिक उदाहरण दिखाया गया है। इस प्रकार के पक्षी के तीन सबटाइपिंग बतख, कोयल और शुतुरमुर्ग होते हैं। संकल्पनात्मक रूप से, इनमें से प्रत्येक मूल प्रकार के पक्षी की ऐसी किस्म है जो कई पक्षी विशेषताओं को प्राप्त करता है लेकिन कुछ विशिष्ट अंतर हैं। इस आरेख में यूनिफाइड मॉडलिंग लैंग्वेज नोटेशन का उपयोग किया जाता है, जिसमें ओपन-हेडेड एरो सुपरटाइप और उसके सबटाइपिंगों के मध्य संबंध की दिशा और प्रकार दिखाते हैं।
अधिक व्यावहारिक उदाहरण के रूप में, ऐसी भाषा जहां भी फ़्लोटिंग पॉइंट मानों की अपेक्षा की जाती है, पूर्णांक मानों का उपयोग करने की अनुमति दे सकती है (Integer
<: Float
), या यह सामान्य प्रकार Number को पूर्णांकों और वास्तविक के सामान्य सुपरटाइप के रूप में परिभाषित कर सकता है। इस दूसरे विषय में, हमारे पास ही है Integer
<: Number
और Float
<: Number
, लेकिन Integer
और Float
एक दूसरे के सबटाइपिंग नहीं हैं।
प्रोग्रामर इसके बिना संभव होने की तुलना में सबटाइपिंग अमूर्त सिद्धांत (प्रोग्रामिंग) का लाभ उठा सकते हैं। निम्नलिखित उदाहरण पर विचार करें:
<वाक्यविन्यास लैंग = वीबी> function max (x as Number, y as Number) is
if x < y then
return y else return x end
यदि पूर्णांक और वास्तविक दोनों Number
के सबटाइपिंग हैं और किसी मनमाना संख्या के साथ तुलना के ऑपरेटर को दोनों प्रकारों के लिए परिभाषित किया गया है, फिर इस फ़ंक्शन को किसी भी प्रकार के मान पास किए जा सकते हैं। चूँकि, इस प्रकार के ऑपरेटर को लागू करने की संभावना संख्या प्रकार को अत्यधिक बाधित करती है (उदाहरण के लिए, कोई जटिल संख्या के साथ पूर्णांक की तुलना नहीं कर सकता है) और वास्तव में केवल पूर्णांक के साथ पूर्णांक और वास्तविक के साथ वास्तविक की तुलना करना समझ में आता है। इस फ़ंक्शन को पुनर्लेखन करना जिससे यह केवल उसी प्रकार के 'x' और 'y' को स्वीकार करे, जिसके लिए बाध्य बहुरूपता की आवश्यकता होती है।
सबमिशन
टाइप थ्योरी में सबसम्प्शन की अवधारणा[4] परिभाषित या मूल्यांकन करने के लिए प्रयोग किया जाता है कि क्या प्रकार S, प्रकार T का सबटाइपिंग है| टाइप मूल्यों का समुच्चय है। समुच्चय के सभी मूल्यों को सूचीबद्ध करके 'व्यापक रूप से' वर्णित किया जा सकता है, या संभावित मूल्यों के एक डोमेन पर विधेय द्वारा समुच्चय की सदस्यता बताते हुए इसे 'आशयपूर्वक' वर्णित किया जा सकता है। सामान्य प्रोग्रामिंग लैंग्वेज में एन्यूमरेशन टाइप्स को लिस्टेड वैल्यूज द्वारा व्यापक रूप से परिभाषित किया जाता है। उपयोगकर्ता-परिभाषित प्रकार जैसे रिकॉर्ड (संरचनाएं, इंटरफेस) या कक्षाएं स्पष्ट प्रकार की घोषणा या उपस्तिथ मूल्य का उपयोग करके जानबूझकर परिभाषित की जाती हैं, जो कॉपी या विस्तारित किए जाने वाले प्रोटोटाइप के रूप में जानकारी को एन्कोड करती है।
उपधारणा की अवधारणा पर चर्चा करते हुए, एक प्रकार के मूल्यों के समुच्चय को गणितीय इटैलिक T में उसका नाम लिखकर इंगित किया जाता है | उसी प्रकार, जिसे डोमेन पर विधेय के रूप में देखा जाता है, उसका नाम बोल्ड T में लिखकर इंगित किया जाता है। पारंपरिक प्रतीक <: का अर्थ सबटाइपिंग है, और :> का अर्थ सुपरटाइप है।
- यदि मानों का समुच्चय है तो किसी प्रकार टी सबस्यूम एस T जो इसे परिभाषित करता है, वह समुच्चय का सुपरसमुच्चय है S, ताकि इसका हर सदस्य S का भी सदस्य है T.
- एक प्रकार को कई प्रकार से सम्मिलित किया जा सकता है: S के सुपरटाइप्स पर S प्रतिच्छेद करते हैं|
- यदि S<:T(और इसलिए S ⊆ T ), फिर T, वह विधेय जो समुच्चय को सेट T परिचालित करता है, विधेय S (समान डोमेन पर) का हिस्सा होना चाहिए जो S परिभाषित करता है | यदि S, T को समाहित करता है, और T, S को समाहित करता है, तो दो प्रकार समान होते हैं (हालाँकि वे एकल प्रकार के नहीं हो सकते हैं यदि प्रकार प्रणाली नाम से प्रकारों को अलग करती है)।
सूचना विशिष्टता के संदर्भ में, सबटाइपिंग को इसके किसी भी सुपरटाइप की तुलना में अधिक विशिष्ट माना जाता है, क्योंकि यह उनमें से प्रत्येक के रूप में कम से कम उतनी ही जानकारी रखता है। इसके अधिक सामान्य सुपरटाइप की तुलना में यह सबटाइपिंग की प्रयोज्यता, या 'प्रासंगिकता' (उन स्थितियों की संख्या जहां इसे स्वीकार या पेश किया जा सकता है) को बढ़ा सकता है। इस अधिक विस्तृत जानकारी के होने का हानि यह है कि यह सम्मिलित विकल्पों का प्रतिनिधित्व करता है जो सबटाइपिंग के 'प्रचलन' को कम करता है (उन स्थितियों की संख्या जो इसे उत्पन्न या उत्पन्न करने में सक्षम हैं)।
सदस्यता के संदर्भ में, समुच्चय-बिल्डर नोटेशन का उपयोग करके टाइप परिभाषाओं को व्यक्त किया जा सकता है, जो समुच्चय को परिभाषित करने के लिए विधेय का उपयोग करता है। विधेय को डोमेन पर परिभाषित किया जा सकता है (संभावित मानों का समुच्चय) D,विधेय आंशिक कार्य हैं जो मूल्यों की तुलना चयन मानदंड से करते हैं। उदाहरण के लिए कोई पूर्णांक मान 100 से अधिक या 200 से कम के बराबर है? यदि कोई मान मापदंड से मेल खाता है तो फ़ंक्शन मान लौटाता है। यदि नहीं, तो मान का चयन नहीं किया जाता है और कुछ भी वापस नहीं किया जाता है। (सूची की समझ कई प्रोग्रामिंग भाषाओं में उपयोग किए जाने वाले इस पैटर्न का रूप है।)
यदि दो विधेय हैं, जो टाइप टी के लिए चयन मानदंड लागू करता है, और जो प्रकार S के लिए अतिरिक्त मानदंड लागू करता है, फिर दो प्रकार के समुच्चय परिभाषित किए जा सकते हैं:
विधेय साथ लगाया जाता है यौगिक विधेय एस परिभाषित करने के भाग के रूप में S. दो विधेय संयुक्त हैं, इसलिए दोनों का चयन करने के लिए मूल्य के लिए सत्य होना चाहिए। विधेय विधेय T को ग्रहण करता है, इसलिए S <: T. उदाहरण के लिए: फेलिना नामक बिल्ली प्रजातियों की उपप्रजाति है, जो फेलिडे परिवार का हिस्सा है। जीनस फेलिस, जिससे घरेलू बिल्ली प्रजाति फेलिस कैटस संबंधित है, उस उपपरिवार का भाग है।
पहले विधेय के अनुरूप मूल्यों के डोमेन पर दूसरे विधेय के अनुप्रयोग के माध्यम से विधेय के संयोजन को यहाँ व्यक्त किया गया है। प्रकार के रूप में देखा, Felis <: Felinae <: Felidae.
यदि T, S (T:> S) को समाहित करता है तो एक प्रक्रिया,कार्य या अभिव्यक्ति को एक मान दिया जाता है एक ऑपरेंड के रूप में (पैरामीटर मान या शब्द) इसलिए उस मान पर टाइप T में से किस के रूप में कार्य करने में सक्षम होगा, क्योंकि है | उपरोक्त उदाहरण में, हम आशा कर सकते हैं कि सबफैमिली का कार्य सभी तीन प्रकारों 'फेलिडे', 'फेलिना' और 'फेलिस' के मूल्यों पर लागू होगा।
सबटाइपिंग योजनाएं
प्रकार सिद्धांतकार नाममात्र प्रकार प्रणाली के मध्य अंतर करते हैं, जिसमें केवल निश्चित तरीके से घोषित आपस के सबटाइपिंग हो सकते हैं, और संरचनात्मक प्रकार प्रणाली, जिसमें दो प्रकार की संरचना निर्धारित करती है कि वो दूसरे का सबटाइपिंग है या नहीं है। ऊपर वर्णित वर्ग-आधारित ऑब्जेक्ट-ओरिएंटेड सबटाइपिंग नाममात्र है; किसी वस्तु-उन्मुख भाषा के लिए संरचनात्मक सबटाइपिंग नियम यह कह सकता है कि यदि प्रकार A की वस्तुएं उन सभी संदेशों को संभाल सकती हैं जो B प्रकार की वस्तुएं संभाल सकती हैं (अर्थात, यदि वे सभी समान विधि को परिभाषित करते हैं, तो A B का सबटाइपिंग है, भले ही दूसरे से वंशानुक्रम हो या नहीं। यह तथाकथित बतख टाइपिंग गतिशील रूप से टाइप की गई वस्तु-उन्मुख भाषाओं में आम है। वस्तु प्रकार के अलावा अन्य प्रकार के लिए ध्वनि संरचनात्मक सबटाइपिंग नियम भी सर्वविदित हैं।[citation needed] सबटाइपिंग के साथ प्रोग्रामिंग भाषाओं के कार्यसमन्वय दो सामान्य वर्गों में आते हैं: समावेशी कार्यसमन्वय , जिसमें टाइप ए के किसी भी मूल्य का प्रतिनिधित्व भी टाइप बी पर समान मान का प्रतिनिधित्व करता है | यदि ए <: बी, और जबरदस्त कार्यसमन्वय , जिसमें टाइप ए का मान स्वचालित रूप से प्रकार बी में परिवर्तित किया जा सकता है। वस्तु-उन्मुख भाषा में उपवर्गीकरण द्वारा प्रेरित सबटाइपिंग सामान्यतःसमावेशी होता है; पूर्णांक और फ़्लोटिंग-पॉइंट नंबरों से संबंधित सबटाइपिंग संबंध, जो अलग-अलग प्रतिनिधित्व करते हैं, सामान्यतः ज़बरदस्त होते हैं।
सबटाइपिंग संबंध को परिभाषित करने वाली लगभग सभी प्रकार की प्रणालियों में, यह रिफ्लेक्सिव (मतलब A <: A किसी भी प्रकार A के लिए) और सकर्मक (अर्थात् यदि A <: B और B <: C तो A <: C) है। यह इसे प्रकारों पर पूर्व आदेश बनाता है।
रिकॉर्ड प्रकार
चौड़ाई और गहराई सबटाइपिंग
रिकॉर्ड के प्रकार (कंप्यूटर विज्ञान) चौड़ाई और गहराई सबटाइपिंग की अवधारणाओं को जन्म देते हैं। ये नए प्रकार के रिकॉर्ड को प्राप्त करने के दो अलग-अलग तरीकों को व्यक्त करते हैं जो मूल रिकॉर्ड प्रकार के समान संचालन की अनुमति देता है।
याद रखें कि रिकॉर्ड (नामित) फ़ील्ड का कोई संग्रह है। चूंकि सबटाइपिंग ऐसा प्रकार है जो मूल प्रकार पर अनुमत सभी परिचालनों की अनुमति देता है, रिकॉर्ड सबटाइपिंग को फ़ील्ड पर उसी संचालन का समर्थन करना चाहिए जो मूल प्रकार समर्थित है।
इस तरह के समर्थन को प्राप्त करने का तरीका, जिसे चौड़ाई सबटाइपिंग कहा जाता है, रिकॉर्ड में और फ़ील्ड जोड़ता है। अधिक औपचारिक रूप से, प्रत्येक (नामित) क्षेत्र जो कि चौड़ाई सुपरटाइप में प्रदर्शित होता है, चौड़ाई सबटाइपिंग में दिखाई देगा। इस प्रकार, सुपरटाइप पर व्यवहार्य कोई भी ऑपरेशन सबटाइपिंग द्वारा समर्थित होगा।
दूसरी विधि, जिसे डेप्थ सबटाइपिंग कहा जाता है, विभिन्न क्षेत्रों को उनके सबटाइपिंगों से बदल देती है अर्थात्, सबटाइपिंग के क्षेत्र सुपरटाइप के क्षेत्रों के सबटाइपिंग हैं। चूँकि सुपरटाइप में किसी फ़ील्ड के लिए समर्थित कोई भी ऑपरेशन उसके सबटाइपिंग के लिए समर्थित है, रिकॉर्ड सुपरटाइप पर संभव कोई भी ऑपरेशन रिकॉर्ड सबटाइपिंग द्वारा समर्थित है। गहराई सबटाइपिंग केवल अपरिवर्तनीय रिकॉर्ड के लिए समझ में आता है: उदाहरण के लिए, आप कोई वास्तविक बिंदु (दो वास्तविक क्षेत्रों के साथ रिकॉर्ड) के 'x' फ़ील्ड को 1.5 असाइन कर सकते हैं, लेकिन आप 'x' फ़ील्ड के समान नहीं कर सकते पूर्णांक बिंदु (जो, हालांकि, वास्तविक बिंदु प्रकार का गहरा सबटाइपिंग है) क्योंकि 1.5 पूर्णांक नहीं है (सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) देखें)।
अभिलेखों की सबटाइपिंग को System F<: में परिभाषित किया जा सकता है जो रिकॉर्ड प्रकारों के सबटाइपिंग के साथ पैरामीट्रिक बहुरूपता को जोड़ती है और कई कार्य ात्मक प्रोग्रामिंग भाषाओं के लिए सैद्धांतिक आधार है जो दोनों सुविधाओं का समर्थन करती हैं।
कुछ प्रणालियाँ लेबल किए गए असंयुक्त संघ प्रकारों (जैसे बीजगणितीय डेटा प्रकार) के सबटाइपिंग का भी समर्थन करती हैं। चौड़ाई सबटाइपिंग का नियम उलटा है,चौड़ाई सबटाइपिंग में दिखाई देने वाला प्रत्येक टैग चौड़ाई सुपरटाइप में दिखाई देना चाहिए।
समारोह प्रकार
अगर T1 → T2 कोई फ़ंक्शन प्रकार है, तो इसका उप प्रकार कोई फ़ंक्शन प्रकार है S1 → S2 उस संपत्ति के साथ T1 <: S1 और S2 <: T2. निम्नलिखित टाइपिंग नियम का उपयोग करके इसे संक्षेप में प्रस्तुत किया जा सकता है:
अधिकांश ऑब्जेक्ट-ओरिएंटेड भाषाओं की तरह साइड इफेक्ट की अनुमति देने वाली भाषाओं में, सबटाइपिंग आम तौर पर यह गारंटी देने के लिए पर्याप्त नहीं है कि किसी फ़ंक्शन को दूसरे के संदर्भ में सुरक्षित रूप से उपयोग किया जा सकता है। इस क्षेत्र में लिस्कोव का कार्य व्यवहार सबटाइपिंग पर केंद्रित है, जो इस लेख में चर्चा की गई प्रकार प्रणाली सुरक्षा के अलावा यह भी आवश्यक है कि सबटाइपिंग अनुबंध द्वारा कुछ डिजाइन में सुपरटेप द्वारा गारंटीकृत सभी अपरिवर्तनीय (कंप्यूटर विज्ञान) को संरक्षित करें।[5] सबटाइपिंग की यह परिभाषा आम तौर पर अनिर्णीत समस्या है, इसलिए इसे किसी प्रकार के चेकर द्वारा सत्यापित नहीं किया जा सकता है।
अपरिवर्तनीय वस्तुओं का सबटाइपिंग पैरामीटर मानों और वापसी मूल्यों के उपचार के समान है। राइट-ओनली रेफरेंस (या सिंक) कंट्रावेरिएंट हैं, जैसे पैरामीटर मान; रीड-ओनली रेफरेंस (या स्रोत) कॉन्वर्सिएंट हैं, जैसे रिटर्न वैल्यू। परिवर्तनीय संदर्भ जो स्रोत और सिंक दोनों के रूप में कार्य करते हैं, वे अपरिवर्तनीय हैं।
उत्तराधिकार के साथ संबंध
सबटाइपिंग और वंशानुक्रम स्वतंत्र (ऑर्थोगोनल) संबंध हैं। वे संयोग कर सकते हैं, लेकिन कोई भी दूसरे का विशेष मामला नहीं है। दूसरे शब्दों में, दो प्रकार S और T के बीच, सबटाइपिंग और वंशानुक्रम के सभी संयोजन संभव हैं:
- S न तो सबटाइपिंग है और न ही T का व्युत्पन्न प्रकार है
- S सबटाइपिंग है लेकिन T का व्युत्पन्न प्रकार नहीं है
- S सबटाइपिंग नहीं है, बल्कि T का व्युत्पन्न प्रकार है
- S उप प्रकार और T का व्युत्पन्न प्रकार दोनों है
पहला मामला स्वतंत्र प्रकारों द्वारा चित्रित किया गया है, जैसे Boolean
और Float
.
दूसरे मामले को मध्यके संबंध से चित्रित किया जा सकता है Int32
और Int64
. अधिकांश वस्तु उन्मुख प्रोग्रामिंग भाषाओं में, Int64
Int32
उत्तराधिकार से संबंधित नहीं हैं हालाँकि Int32
को Int64
का सबटाइपिंग माना जा सकता है चूंकि किसी भी 32 बिट पूर्णांक मान64 बिट पूर्णांक मान में प्रचारित किया जा सकता है।
तीसरा मामला कार्य ों के सबटाइपिंग का परिणाम है। मान लें कि टाइप टी का सुपर क्लास है जिसमें एकल प्रकार की वस्तु लौटाने वाली विधि एम है (यानी एम का प्रकार टी → टी है, यह भी ध्यान दें कि एम का पहला पैरामीटर यह/स्वयं है) और टी से व्युत्पन्न वर्ग प्रकार एस वंशानुक्रम से, S में m का प्रकार S → S है।[citation needed] S को T का सबटाइपिंग होने के लिए S में m का प्रकार T में m के प्रकार का सबटाइपिंग होना चाहिए[citation needed], दूसरे शब्दों में: S → S ≤: T → T. फ़ंक्शन सबटाइपिंग नियम के बॉटम-अप एप्लिकेशन द्वारा, इसका अर्थ है: S ≤: T और T ≤: S, जो केवल तभी संभव है जब S और T समान हों। चूँकि वंशानुक्रम अप्रतिवर्ती संबंध है, S, T का सबटाइपिंग नहीं हो सकता।
सबटाइपिंग और वंशानुक्रम तब संगत होते हैं जब सभी उत्तराधिकार में मिले क्षेत्र और व्युत्पन्न प्रकार के तरीकों में ऐसे प्रकार होते हैं जो संबंधित क्षेत्रों के सबटाइपिंग होते हैं और उत्तराधिकार में मिले प्रकार के तरीके होते हैं।[6]
ज़बरदस्ती
जबरदस्ती सबटाइपिंग प्रणालियों में, सबटाइपिंगों को सबटाइपिंग से सुपरटाइप में अंतर्निहित प्रकार रूपांतरण कार्य ों द्वारा परिभाषित किया जाता है। प्रत्येक सबटाइपिंग संबंध (S <: T) के लिए, ज़बरदस्ती कार्य बल: S → T प्रदान किया जाता है, और प्रकार S के किसी भी वस्तु को वस्तु बल के रूप में माना जाता हैS → T(s) टाइप T का है। किसी ज़बरदस्ती फ़ंक्शन को रचना द्वारा परिभाषित किया जा सकता है, यदि S <: T और T <: U तो s को यौगिक ज़बरदस्ती के तहत टाइप यू की वस्तु के रूप में माना जा सकता हैT → U ∘ ज़बरदस्तीS → T ईसी प्रकार से अपने आप में ज़बरदस्तीT → T पहचान समारोह आईडी हैT
रिकॉर्ड के लिए ज़बरदस्ती कार्य और संघ सबटाइपिंगों को अलग करना घटक के अनुसार परिभाषित किया जा सकता है; चौड़ाई-विस्तारित रिकॉर्ड के मामले में, प्रकार की ज़बरदस्ती केवल उन घटकों को छोड़ देती है जो सुपरटेप में परिभाषित नहीं हैं। फ़ंक्शन प्रकारों के लिए प्रकार का दबाव f'(s) = ज़बरदस्ती द्वारा दिया जा सकता हैS2 → टी2</ उप> (एफ (ज़बरदस्तीT1 → एस1(t))), पैरामीटर मानों के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) और वापसी मूल्यों के सहप्रसरण को दर्शाता है।
जबरदस्ती का कार्य विशिष्ट रूप से सबटाइपिंग और supertype को देखते हुए निर्धारित किया जाता है। इस प्रकार, जब कई सबटाइपिंग संबंधों को परिभाषित किया जाता है, तो यह सुनिश्चित करने के लिए सावधानी बरतनी चाहिए कि सभी प्रकार के दबाव सुसंगत हैं। उदाहरण के लिए, यदि कोई पूर्णांक जैसे 2: इंट को फ्लोटिंग पॉइंट नंबर (जैसे, 2.0: फ्लोट) के लिए ज़बरदस्ती किया जा सकता है, तो यह 2.1: फ़्लोट टू 2: इंट के लिए ज़बरदस्ती स्वीकार्य नहीं है, क्योंकि यौगिक ज़बरदस्ती ज़बरदस्तीfloat → float जबरदस्ती दिया गयाint → float ∘ ज़बरदस्तीfloat → int तब पहचान ज़बरदस्ती आईडी से अलग होताfloat.है।
यह भी देखें
- सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान)
- वृत्त-दीर्घवृत्त समस्या (मूल्य-प्रकारों के समान आधार पर चर-प्रकारों को सबटाइपिंग करने के खतरों के लिए)
- कक्षा आधारित प्रोग्रामिंग
- शीर्ष प्रकार
- शोधन प्रकार
- व्यवहार सबटाइपिंग
टिप्पणियाँ
- ↑ Copestake, Ann. Implementing typed feature structure grammars. Vol. 110. Stanford: CSLI publications, 2002.
- ↑ Cardelli, Luca. A semantics of multiple inheritance. In G. Kahn, D. MacQueen, and G. Plotkin, editors, Semantics of Data Types, volume 173 of Lecture Notes in Computer Science, pages 51–67. Springer-Verlag, 1984. Full version in Information and Computation, 76(2/3):138–164, 1988.
- ↑ Pierce, ch. 15 notes
- ↑ Benjamin C. Pierce, Types and Programming Languages, MIT Press, 2002, 15.1 "Subsumption", p. 181-182
- ↑ Barbara Liskov, Jeannette Wing, A behavioral notion of subtyping, ACM Transactions on Programming Languages and Systems, Volume 16, Issue 6 (November 1994), pp. 1811–1841. An updated version appeared as CMU technical report: Liskov, Barbara; Wing, Jeannette (July 1999). "Behavioral Subtyping Using Invariants and Constraints" (PS). Retrieved 2006-10-05.
- ↑ Cook, Hill & Canning 1990.
संदर्भ
Textbooks
- Benjamin C. Pierce, Types and programming languages, MIT Press, 2002, ISBN 0-262-16209-1, chapter 15 (subtyping of record types), 19.3 (nominal vs. structural types and subtyping), and 23.2 (varieties of polymorphism)
- C. Szyperski, D. Gruntz, S. Murer, Component software: beyond object-oriented programming, 2nd ed., Pearson Education, 2002, ISBN 0-201-74572-0, pp. 93–95 (a high-level presentation aimed at programming language users)
Papers
- Reynolds, John C. Using category theory to design implicit conversions and generic operators. In N. D. Jones, editor, Proceedings of the Aarhus Workshop on Semantics-Directed Compiler Generation, number 94 in Lecture Notes in Computer Science. Springer-Verlag, January 1980. Also in Carl A. Gunter and John C. Mitchell, editors, Theoretical Aspects of Object-Oriented Programming: Types, Semantics, and Language Design (MIT Press, 1994).
अग्रिम पठन
- John C. Reynolds, Theories of programming languages, Cambridge University Press, 1998, ISBN 0-521-59414-6, chapter 16.
- Martín Abadi, Luca Cardelli, A theory of objects, Springer, 1996, ISBN 0-387-94775-2. Section 8.6 contrast the subtyping of records and objects.