प्रकार सिस्टम: नाममात्र बनाम संरचनात्मक, स्पष्ट बनाम निहित


24

मैं नाममात्र और संरचनात्मक प्रकार के सिस्टम के बीच के अंतर के बारे में थोड़ा भ्रमित हूं। क्या कोई यह समझा सकता है कि वे कैसे भिन्न हैं?

मैं जो कुछ समझता हूं:

  • नाममात्र: प्रकार संगतता नाम पर आधारित है।
  • स्ट्रक्चरल: टाइप कम्पैटिबिलिटी टाइप स्ट्रक्चर पर आधारित होती है, जैसे C में अगर 2 वैरिएबल अलग-अलग नामों से स्ट्रक्चर टाइप होते हैं लेकिन एक ही स्ट्रक्चर होता है, तो उनके टाइप कम्पेटिबल होते हैं।

अब स्पष्ट और निहित के बारे में: यह स्थिर और गतिशील टाइपिंग से अलग क्यों है? स्थिर टाइपिंग में, प्रकार स्पष्ट होंगे जबकि गतिशील टाइपिंग में, प्रकार निहित हैं। क्या मैं सही हू?

जवाबों:


29

गतिशील रूप से टाइप की गई प्रणाली में, मान रनटाइम पर टाइप होते हैं, लेकिन चर और फ़ंक्शन नहीं होते हैं। एक सांख्यिकीय रूप से टाइप की गई प्रणाली में, चर और कार्यों को संकलन-समय पर जाना और जांचा जाता है। जैसे पायथन में कुछ भीx हो सकता है ; रनटाइम पर, यदि यह 1एक संख्या है और यदि यह है "foo", तो यह एक स्ट्रिंग है। आप केवल यह जानते होंगे कि xरनटाइम किस प्रकार का था, और यह हर बार जब आप प्रोग्राम चलाते हैं तो अलग हो सकता है। जावा जैसी भाषा में, आप लिखेंगे int xकि क्या xएक नंबर होना चाहिए, और आप संकलन समय पर जानते होंगे कि xहमेशा एक होना चाहिए int

"स्पष्ट" और "निहित" प्रकार दोनों स्थिर प्रकार के सिस्टम को संदर्भित करते हैं। एक स्थैतिक प्रणाली की परिभाषित विशेषता यह है कि प्रकारों को संकलन समय पर जाना जाता है , लेकिन जरूरी नहीं कि उन्हें बाहर लिखा जाना चाहिए। जावा में, प्रकार स्पष्ट हैं - आपको उन्हें लिखना होगा। तो जावा में, एक विधि कुछ इस तरह दिख सकती है:

public int foo(String bar, Object baz) { ... }

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

let foo x = x + 1

जब से आपने उपयोग किया है +, OCaml यह पता लगा सकता है कि सभी को अपने दम पर xहोना चाहिए int। तो के प्रकार foo( foo : int -> int) है सिर्फ जावा उदाहरण की तरह संकलन समय पर जाना जाता है,। यह पूरी तरह से स्थिर है। हालांकि, चूंकि कंपाइलर यह पता लगा सकता है कि किस प्रकार के अपने आप होने हैं, तो आपको उन्हें स्वयं लिखने की ज़रूरत नहीं है: वे निहित हैं।

संक्षेप में: क्या एक प्रकार की प्रणाली स्पष्ट या निहित है, स्थिर प्रणालियों की एक संपत्ति है । यह एक पूरी तरह से अलग सवाल है कि क्या एक प्रकार की प्रणाली गतिशील या स्थिर है।

अक्सर, आपके पास टाइप सिस्टम होते हैं जो कई बार स्पष्ट होते हैं और कई बार निहित होते हैं।

उदाहरण के लिए, मेरा मानना ​​है कि C # आपको varकीवर्ड का उपयोग करते हुए टाइप करने देता है । तो लेखन के बजाय int x = 10, आप लिख सकते हैं var x = 10और है कि बाहर संकलक आंकड़े xएक हो गया है int। C ++ कुछ ऐसा ही करता है auto। ये सिस्टम आमतौर पर स्पष्ट होते हैं, लेकिन कुछ निष्कर्ष हैं।

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


2
वास्तव में, कुछ भाषाएँ हैं जिन्हें आप स्पष्ट गतिशील टाइपिंग कह सकते हैं । आमतौर पर, वे भाषाएँ आपको अभिव्यक्तियों को प्रकारों के साथ एनोटेट करने की अनुमति देती हैं, और फिर उन प्रकारों को रनटाइम प्रकार की अभिव्यक्ति के खिलाफ रनटाइम पर चेक किया जाएगा ।
जॉर्ग डब्ल्यू मित्तग

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

अच्छा जवाब है, लेकिन यह नाममात्र बनाम संरचनात्मक टाइपिंग को संबोधित नहीं करता है। एक संपादन बहुत अच्छा होगा।
लंचमीट 317

7
  • स्टेटिक बनाम डायनामिक वर्णन जब प्रकारों की जाँच की जाती है (संकलन के समय या निष्पादन के समय कम या ज्यादा)

  • नाममात्र बनाम संरचनात्मक वर्णन जब दो प्रकारों को समान माना जाता है।

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

चार संयोजन (स्थिर नाममात्र, स्थिर संरचनात्मक, गतिशील नाममात्र, गतिशील संरचनात्मक) संभव है, और भाषाएं अक्सर एक कक्षा में विशुद्ध रूप से नहीं होती हैं, लेकिन ऐसे पहलू होते हैं जो दूसरों में होते हैं।

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

भाषा जो एक गतिशील प्रकार की प्रणाली है, अक्सर संरचनात्मक टाइपिंग का उपयोग कर रही है, लेकिन नाममात्र पहलुओं के रूप में सीएलओएस।


1

स्ट्रक्चरल: टाइप कम्पैटिबिलिटी टाइप स्ट्रक्चर पर आधारित होती है, जैसे C में अगर 2 वैरिएबल अलग-अलग नामों से स्ट्रक्चर टाइप होते हैं लेकिन एक ही स्ट्रक्चर होता है, तो उनके टाइप कम्पेटिबल होते हैं।

यह आमतौर पर मामला नहीं है। स्ट्रक्चरल टाइपिंग का मतलब है कि अगर यह इंटरफ़ेस को संतुष्ट कर सकता है तो इसका Bएक उपप्रकार है । इसका मतलब आमतौर पर एक ही नाम वाले सदस्य होते हैं; स्मृति में केवल एक ही संरचना नहीं है।AA

यह नामांकित टाइपिंग से अलग है जिसे घोषणा पर निर्दिष्ट करने के लिए सुपर-प्रकार की आवश्यकता होती है।


1

डायनेमिक और स्टैटिक टाइप सिस्टम (वास्तव में सबस्क्राइबर) के बीच के अंतर का सबसे अच्छा विवरण मैंने इस ब्लॉग पोस्ट में ओम हिरन द्वारा दिया गया है:

इसके मुख्य बिंदु को संक्षेप में प्रस्तुत किया जा सकता है:

  • गतिशील भाषाएं केवल एक प्रकार की स्थिर भाषाएं हैं

1
लिंक खराब हो सकते हैं; आपको लेख के सबसे प्रासंगिक बिट्स को उद्धृत करना चाहिए ताकि वे पोस्टपेरिटी के लिए संरक्षित रहें, भले ही ब्लॉग kaput हो।
डोभाल

2
ज़रूर। मुझे लगता है कि इस मामले में मेरे द्वारा जोड़ा गया वाक्य पर्याप्त है :)
एडुआर्डो परेजा टोबेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.