संरचनात्मक टाइप प्रणाली
संरचनात्मक टाइप प्रणाली या विश्लेषण आधारित डेटा-टाइप प्रणाली, डेटाटाइप प्रणालियों का एक प्रमुख वर्ग है जिसमें डेटाटाइप की संगतता और समानता डेटाटाइप की वास्तविक संरचना या परिभाषा द्वारा निर्धारित की जाती है अन्य विशेषताओं जैसे कि इसका नाम या घोषणा की संरचनात्मक प्रणालियों का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या डेटाटाइप समतुल्य हैं और क्या एक डेटाटाइप दूसरे का उप-डेटाटाइप है। या नॉमिनेटिव डेटाटाइप प्रणाली के विपरीत है जहां पर समकालिक डेटाटाइप, टाइपिंग या स्पष्ट घोषणाओं के नाम पर आधारित होता है जिसमें रनटाइम पर कार्यान्वयन होने वाली संरचना का केवल एक भाग संगतता के लिए नियंत्रित किया जाता है।
विवरण
संरचनात्मक टाइपिंग में, एक वेरिएबल को दूसरे के साथ संगत माना जाता है यदि दूसरे वेरिएबल के डेटाटाइप के भीतर प्रत्येक सुविधा के लिए पहले वेरिएबल के डेटाटाइप में एक समान विशेषता सम्मिलित होती है। तब विवरण पर कुछ भाषाएँ भिन्न हो सकती हैं, जैसे कि सुविधाओं को नाम से अनुरूप होना चाहिए या नहीं यह परिभाषा सममित नहीं होती है और इसमें उप-डेटाटाइप संगतता सम्मिलित है। यदि प्रत्येक दूसरे के साथ संगत है तो दो डेटाटाइप को समान माना जाता है।
उदाहरण के लिए, ओसीएएमएल ऑब्जेक्ट (वस्तु) डेटाटाइप की अनुकूलता के लिए विधियों पर संरचनात्मक टाइपिंग का उपयोग किया जाता है। गो (प्रोग्रामिंग भाषा) इंटरफ़ेस के साथ एक डेटाटाइप की संगतता निर्धारित करने के तरीकों पर संरचनात्मक टाइपिंग का उपयोग किया जाता है। सी ++ टेम्पलेट फ़ंक्शंन डेटाटाइप तर्कों पर संरचनात्मक टाइपिंग प्रदर्शित करते हैं। जो हैक्स संरचनात्मक टाइपिंग का उपयोग करता है, लेकिन डेटाटाइप-क्लासेस संरचनात्मक रूप से उप-डेटाटाइप नहीं होती हैं।
उप-डेटाटाइप बहुरूपता का समर्थन करने वाली भाषाओं में, उप-डेटाटाइप संबंध को कैसे परिभाषित किया जाता है, इसके आधार पर एक समान द्विभाजित डेटाटाइप बनाया जा सकता है। एक डेटाटाइप दूसरे का उप-डेटाटाइप होता है यदि इसमें आधार डेटाटाइप की सभी विशेषताएं सम्मिलित हैं या इसके उप-डेटाटाइप हैं। जैसे सदस्य आधार डेटाटाइप या अपरिवर्तनीय डेटाटाइप सम्मिलित नही हैं। उप-डेटाटाइप में अतिरिक्त विशेषताएं हो सकती हैं।
अनुमानित और गैर-अनुमानित बहुरूपता के लिए संरचनात्मक प्रतिस्थापन के बीच एक अंतर उपस्थित होता है। कुछ भाषाएँ, जैसे कि हास्केल (प्रोग्रामिंग भाषा), उस स्थिति में संरचनात्मक रूप से स्थापित नहीं करती हैं जहाँ एक अपेक्षित डेटाटाइप घोषित किया जाता है (अर्थात, अनुमानित नहीं), उदाहरण के लिए, केवल उन कार्यों के लिए स्थापित हैं जो हस्ताक्षर-आधारित बहुरूपी डेटाटाइप के अनुमान के माध्यम से प्रदर्शित होते हैं।[1] तब गलती से एक गैर-अनुमानित डेटाटाइप को उप-डेटाटाइप करना संभव नहीं है, हालांकि यह अभी भी एक गैर-अनुमानित डेटाटाइप के लिए एक स्पष्ट रूपांतरण प्रदान करना संभव हो सकता है जिसे निहित रूप से प्रयुक्त किया गया है।
संरचनात्मक सबटाइपिंग नॉमिनेटिव डेटाटाइप की सबटाइपिंग की तुलना में यकीनन अधिक सुगम होया है, क्योंकि यह प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) के निर्माण की स्वीकृति देता है विशेष रूप से, यह एक डेटाटाइप के निर्माण की स्वीकृति देता है जो बाद की परिभाषा को संशोधित किए बिना उपस्थित डेटाटाइप का एक उच्च डेटाटाइप है। हालाँकि, यह वांछनीय नहीं हो सकता है जहाँ प्रोग्रामर अमूर्त डेटाटाइप बनाना चाहता है। संरचनात्मक टाइपिंग बनाम नॉमिनेटिव टाइपिंग की एक कमी यह है कि दो अलग-अलग परिभाषित डेटाटाइप अलग-अलग उद्देश्यों के लिए अभिप्रेत हैं, लेकिन गलती से एक ही विशेषता धारण करते हैं (जैसे दोनों पूर्णांक की एक जोड़ी), डेटाटाइप प्रणाली द्वारा एक ही डेटाटाइप माना जा सकता है प्रत्येक उपयोग के लिए एक बीजगणितीय डेटाटाइप बनाकर केवल इसलिए वे समान संरचना के होते है। 1990 में, विकासक कुक और अन्य ने विकासकों ने सिद्ध किया कि संरचनात्मक रूप से डेटाटाइप की गई वस्तु-उन्मुख प्रोग्रामिंग भाषाओं में इनहेरिटेंस सबटाइपिंग नहीं होती है।[2]
संरचनात्मक टाइपिंग के आधार पर यह जांचना कि दो डेटाटाइप सुसंगत हैं और एक गैर-तुच्छ संचालक डेटाटाइप है, उदाहरण के लिए, पिछले परीक्षण किए गए डेटाटाइप को स्थित रखने की आवश्यकता होती है।[3]
उदाहरण
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके प्रकारों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। Datatype_classes
केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं।
# let x = object val mutable x = 5 method get_x = x method set_x y = x <- y end;; val x : < get_x : int; set_x : int -> unit > = <obj>
यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को print
करता है। इसका डेटाटाइप < get_x : int; set_x : int -> unit >
केवल इसके तरीकों से परिभाषित किया गया है। दूसरे शब्दों में, x के डेटाटाइप को विधि डेटाटाइप get_x : int
और set_x : int -> Unit
के अतिरिक्त किसी भी नाम से परिभाषित किया गया है।[4] किसी अन्य वस्तुओं को परिभाषित करने के लिए, जिसमें समान विधियों और डेटाटाइप के विभिन्न प्रकार होते हैं:
# let y = object method get_x = 2 method set_x y = Printf.printf "%d\n" y end;; val yv: < get_xg: int; set_xs: int -> unit > = <obj>
ओसीएएमएल उन्हें एक ही डेटाटाइप की स्वीकृति करता है। उदाहरण के लिए, समतुल्य ऑपरेटर केवल एक ही डेटाटाइप के दो मान लेने के लिए डेटाटाइप किया गया है:
# x = y;; - : bool = false
ऐसी स्थिति मे वे एक ही डेटाटाइप के होने चाहिए, अन्यथा यह टाइप-परिवर्तन भी नहीं होगा। इससे यह पता चलता है कि प्रकारों की समानता संरचनात्मक है। और कोई एक फ़ंक्शन को परिभाषित कर सकता है जो एक विधि का संचालन करता है:
# let set_to_10 a = a#set_x 10;; val set_to_10 : < set_x : int -> 'a; .. > -> 'a = <fun>
पहले तर्क के लिए अनुमानित डेटाटाइप (< set_x : int -> 'a; .. >)
है। जिसका ..e>
का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक set_x
विधि हो, जो एक int
को तर्क के रूप में प्राप्त करती है। तो इसको वस्तु पर x
के रूप मे प्रयुक्त किया जा सकता है:
# set_to_10 x;; - : unit = ()
एक अन्य वस्तु बनाई जा सकती है जो उस विधि या डेटाटाइप के लिए होती है जिसमे अन्य तरीके अप्रासंगिक होते हैं:
# let z = object method blahblah = 2.5 method set_x y = Printf.printf "%d\n" y end;; val zv: < blahblahh: float; set_xs: int -> unit > = <obj>
Set_to_10 फ़ंक्शन भी इस पर कार्य करता है:
# set_to_10 z;; 10 - : unit = ()
इससे यह पता चलता है कि विधि संचालन जैसी वस्तुओ के लिए अनुकूलता संरचना द्वारा निर्धारित की जाती है। माना कि वस्तुओं के लिए केवल एक get_x
विधि और कोई अन्य विधि के साथ समानार्थी शब्द को परिभाषित करती है:
# type simpler_obj = < get_x : int >;; type simpler_obj = < get_x : int >
जो वस्तु x
इस डेटाटाइप का नहीं है लेकिन संरचनात्मक रूप से x
इस डेटाटाइप का एक उप डेटाटाइप है, चूंकि x
इसके तरीकों का एक उच्च डेटाटाइप सम्मिलित है। इसलिए x
इस डेटाटाइप के लिए निर्धारित किया जा सकता है:
# (x :> simpler_obj);; - : simpler_obj = <obj> # (x :> simpler_obj)#get_x;; - : int = 10
लेकिन ऑब्जेक्ट z
नहीं, क्योंकि यह एक संरचनात्मक उप डेटाटाइप नहीं है:
# (z :> simpler_obj);; This expression cannot be coerced to type simpler_obj = < get_x : int >; it has type < blahblah : float; set_x : int -> unit > but is here used with type < get_x : int; .. > The first object type has no method get_x
इससे यह पता चलता है कि सिंटेक्स को विस्तारित करने की सुसंगतता संरचनात्मक होती है।
संदर्भ
- ↑ "हस्ताक्षर आधारित बहुरूपता".
- ↑ Cook, W.R.; Hill, W.L.; Canning, P.S. (January 1990). "वंशानुक्रम उपप्रकार नहीं है". Proceedings of the Seventeenth Annual ACM Symposium on Principles of Programming Languages. San Francisco, California: 125–135. doi:10.1145/96709.96721. ISBN 978-0897913430. S2CID 8225906.
- ↑ "Type compatibility: name vs structural equivalence".
- ↑ "वस्तु प्रकार".
- Pierce, Benjamin C. (2002). "19.3". Types and Programming Languages. MIT Press. ISBN 978-0-262-16209-8.