कमजोर टाइप की गई भाषाओं के बारे में स्पष्ट विरोधाभासों पर स्पष्टीकरण मांगना


178

मुझे लगता है कि मैं मजबूत टाइपिंग को समझता हूं , लेकिन हर बार जब मैं कमजोर टाइपिंग के उदाहरणों की तलाश करता हूं, तो मैं प्रोग्रामिंग भाषाओं के उदाहरण ढूंढता हूं जो बस स्वचालित रूप से सुसंगत / रूपांतरित करते हैं।

उदाहरण के लिए, टाइपिंग: स्ट्रांग बनाम कमजोर, स्टेटिक बनाम डायनामिक नामक इस लेख में कहा गया है कि पायथन दृढ़ता से टाइप किया गया है क्योंकि यदि आप कोशिश करते हैं तो आपको एक अपवाद मिल जाता है:

अजगर

1 + "1"
Traceback (most recent call last):
File "", line 1, in ? 
TypeError: unsupported operand type(s) for +: 'int' and 'str'

हालांकि, जावा और सी # में ऐसी बात संभव है, और हम उन्हें केवल इसके लिए कमजोर रूप से टाइप करने पर विचार नहीं करते हैं।

जावा

  int a = 10;
  String b = "b";
  String result = a + b;
  System.out.println(result);

सी#

int a = 10;
string b = "b";
string c = a + b;
Console.WriteLine(c);

Weakly Type Languages नाम के एक अन्य लेख में लेखक ने कहा है कि पर्ल को केवल इसलिए टाइप किया गया है क्योंकि मैं किसी स्ट्रिंग को संख्या में बदल सकता हूं और बिना किसी स्पष्ट रूपांतरण के उलट सकता हूं।

पर्ल

$a=10;
$b="a";
$c=$a.$b;
print $c; #10a

तो वही उदाहरण पर्ल को कमजोर रूप से टाइप करता है, लेकिन जावा और सी # को नहीं।

जी, यह भ्रामक है यहां छवि विवरण दर्ज करें

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

इसलिए, कुछ बिंदु पर मुझे यह विश्वास करने के लिए प्रेरित किया गया है कि यदि कोई भाषा बहुत अधिक स्वचालित रूपांतरण या प्रकार के बीच बलात्कार प्रदान करती है (जैसा कि perl) अंत में कमजोर टाइप माना जा सकता है, जबकि अन्य भाषा जो केवल कुछ रूपांतरण प्रदान करती हैं, वह समाप्त हो सकती हैं दृढ़ता से टाइप किया हुआ।

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

तो, मेरे सवाल हैं:

  • किसी भाषा के सही मायने में कमजोर होने का क्या मतलब है?
  • क्या आप कमजोर टाइपिंग के किसी भी अच्छे उदाहरण का उल्लेख कर सकते हैं जो भाषा द्वारा किए गए स्वचालित रूपांतरण / स्वचालित जबरदस्ती से संबंधित नहीं है?
  • क्या एक ही समय में एक भाषा को कमजोर और दृढ़ता से टाइप किया जा सकता है?

8
मजबूत बनाम कमजोर टाइपिंग सभी प्रकार के रूपांतरण के बारे में है (इसके बारे में और क्या हो सकता है?) यदि आप एक "बहुत" कमजोर भाषा का उदाहरण चाहते हैं, तो इसे देखें: नष्ट करने वाला . com / .com / tks / wat
Wilduck

2
@Wildduck सभी भाषाएं प्रकार के रूपांतरण प्रदान करती हैं, लेकिन उनमें से सभी को कमजोर प्रकार का नहीं माना जाता है। नीचे दिखाए गए मेरे उदाहरणों से पता चलता है कि कैसे प्रोग्रामर उसी भाषा के आधार पर कमजोर टाइप की गई भाषा पर विचार करते हैं जो अन्य भाषाओं में संभवत: टाइप की गई भाषाओं पर आधारित होती हैं। जैसा कि मेरा सवाल अब भी कायम है। अंतर क्या है?
एडविन दलेरजो

1
संक्षिप्त उत्तर, मुझे लगता है, यह है कि "टंकण" एक द्विआधारी राज्य नहीं है। जावा और C # अधिक दृढ़ता से टाइप किए जाते हैं लेकिन बिल्कुल नहीं।
जोड्रेल

3
मेरा मानना ​​है कि यह सॉफ्टवेयर इंजीनियरिंग के लिए बेहतर अनुकूल है ।
zzzzBov

4
@ ब्रेंडन एक फ्लोट और पूर्णांक के योग के बारे में क्या? क्या पाइथन में तैरता हुआ पूर्णांक नहीं है? क्या आप अब कहेंगे कि पायथन बिल्कुल दृढ़ता से टाइप नहीं हुआ है?
एडविन डेलोरजो

जवाबों:


210

अद्यतन: यह सवाल मेरे ब्लॉग का विषय था 15 अक्टूबर, 2012 को। महान प्रश्न के लिए धन्यवाद!


किसी भाषा के "कमजोर टाइप" होने का वास्तव में क्या मतलब है?

इसका अर्थ है "यह भाषा एक प्रकार की प्रणाली का उपयोग करती है जो मुझे अरुचिकर लगती है"। इसके विपरीत एक "दृढ़ता से टाइप की गई" भाषा एक प्रकार की प्रणाली वाली भाषा है जो मुझे सुखद लगती है।

शब्द अनिवार्य रूप से अर्थहीन हैं और आपको उनसे बचना चाहिए। विकिपीडिया "जोरदार टाइप" के लिए ग्यारह अलग-अलग अर्थों को सूचीबद्ध करता है , जिनमें से कई विरोधाभासी हैं। यह इंगित करता है कि "दृढ़ता से टाइप किया गया" या "कमजोर रूप से टाइप किया गया" शब्द को शामिल करने वाले किसी भी वार्तालाप में भ्रम की संभावना अधिक है।

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

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

C # उन प्रकार के प्रतिबंधों को लगाता है, जिन्हें संकलन-समय और रनटाइम दोनों पर चेक किया जाता है, जिससे यह उन भाषाओं की तुलना में "दृढ़ता से टाइप की गई" भाषा बन जाती है, जो कम संकलन-समय जाँच या कम रनटाइम जाँच करते हैं। सी # आपको विशेष परिस्थितियों में उन प्रतिबंधों के आसपास एक अंत-संचालन करने की अनुमति देता है, जो इसे भाषाओं के साथ तुलना में "कमजोर रूप से टाइप" भाषा बनाता है जो आपको इस तरह के एंड-रन करने की अनुमति नहीं देता है।

यह वास्तव में कौन सा है? कहना असंभव है; यह स्पीकर के दृष्टिकोण और विभिन्न भाषा सुविधाओं के प्रति उनके दृष्टिकोण पर निर्भर करता है।


14
@edalorzo: यह (1) के बारे में स्वाद और व्यक्तिगत राय पर आधारित है कि टाइप थ्योरी के कौन से पहलू प्रासंगिक हैं और जो अप्रासंगिक हैं, और (2) क्या टाइप प्रतिबंधों को लागू करने या प्रोत्साहित करने के लिए किसी भाषा की आवश्यकता है । जैसा कि मैंने बताया, एक व्यक्ति यह कह सकता है कि C # दृढ़ता से टाइप किया जाता है क्योंकि यह स्थिर टाइपिंग को अनुमति देता है और प्रोत्साहित करता है , और कोई यथोचित रूप से यह कह सकता है कि यह कमजोर रूप से टाइप किया गया है क्योंकि यह टाइप सुरक्षा का उल्लंघन करने की संभावना देता है
एरिक लिपर्ट

4
@edalorzo: असेंबली के लिए, फिर से, यह राय का विषय है। एक असेंबली भाषा कंपाइलर आपको स्टैक से 64 बिट डबल को 32 बिट रजिस्टर में स्थानांतरित करने की अनुमति नहीं देगा; यह आपको 32 बिट रजिस्टर को स्टैक से 32 बिट रजिस्टर में 32 बिट पॉइंटर को स्थानांतरित करने की अनुमति देगा। उस अर्थ में भाषा "टाइपसेफ़" है - यह डेटा के एक प्रकार के वर्गीकरण के आधार पर कार्यक्रम की वैधता पर प्रतिबंध लगाता है। चाहे वह प्रतिबन्ध "मज़बूत" हो या "कमज़ोर" यह एक राय का विषय है, लेकिन यह स्पष्ट रूप से एक प्रतिबंध है।
एरिक लिपर्ट

2
मुझे लगता है कि मैं अब आपकी बात देख रहा हूं, वास्तव में कमजोर टाइप की गई भाषा को पूरी तरह से अप्रकाशित या एकरूप होना होगा, जो वास्तविक जीवन में व्यावहारिक रूप से असंभव है। जैसे, किसी भी भाषा में कुछ प्रकार की परिभाषा होती है, जो सुरक्षित होती हैं, और यह इस बात पर निर्भर करता है कि भाषा अपने डेटा या डेटा प्रकारों का उल्लंघन करने या हेरफेर करने के लिए कितनी संख्या प्रदान करती है, आप इसे अधिक या कम प्रकार से कमजोर समझकर समाप्त कर सकते हैं, शायद यहां तक ​​कि केवल कुछ संदर्भ।
एडविन डेलोरजो 29:12

7
@edalorzo: सही है। उदाहरण के लिए, अनकैप्ड लैम्ब्डा कैलकुलस लगभग उतना ही कमजोर होता है जितना कि आप प्राप्त कर सकते हैं। प्रत्येक फ़ंक्शन एक फ़ंक्शन से फ़ंक्शन तक एक फ़ंक्शन है; किसी भी डेटा को किसी भी फ़ंक्शन को बिना किसी प्रतिबंध के पास किया जा सकता है क्योंकि सब कुछ "एक ही प्रकार" का है। अनकैप्ड लैम्ब्डा कैलकुलस में किसी एक्सप्रेशन की वैधता केवल उसके वाक्य-विन्यास रूप पर निर्भर करती है, न कि किसी शब्दार्थ विश्लेषण पर जो कुछ विशेष प्रकारों के रूप में कुछ अभिव्यक्तियों को वर्गीकृत करता है।
एरिक लिपर्ट

3
@ मर्क मैं उन्हें भविष्यवाणी के लिए एक और +1 दूंगा कि हर कोई विषय पर अलग-अलग व्याख्या प्रदान करेगा। यह "कमजोर टाइपिंग" एक "पौराणिक अवधारणा" या "शहरी किंवदंती" प्रतीत होती है, सभी ने इसे देखा है, लेकिन कोई भी यह साबित नहीं कर सकता है कि यह मौजूद है :-)
एडविन डेलोरजो

64

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

मुद्दा यह है कि, पर्ल में, "पूर्णांक चर", "फ्लोट चर", "स्ट्रिंग चर" या "बुलियन चर" जैसी कोई चीज नहीं है। वास्तव में, जहां तक ​​उपयोगकर्ता बता सकता है (आमतौर पर), पूर्णांक, फ्लोट, स्ट्रिंग या बूलियन मान भी नहीं हैं : आपके पास "स्केलर" हैं, जो एक ही समय में ये सभी चीजें हैं। उदाहरण के लिए, आप लिख सकते हैं:

$foo = "123" + "456";           # $foo = 579
$bar = substr($foo, 2, 1);      # $bar = 9
$bar .= " lives";               # $bar = "9 lives"
$foo -= $bar;                   # $foo = 579 - 9 = 570

बेशक, जैसा कि आप सही ढंग से ध्यान दें, यह सब सिर्फ टाइप ज़बरदस्ती के रूप में देखा जा सकता है। लेकिन बात यह है कि, पर्ल में, प्रकार हमेशा मजबूर होते हैं । वास्तव में, एक उपयोगकर्ता के लिए यह बताना काफी कठिन है कि एक चर का आंतरिक "प्रकार" क्या हो सकता है: ऊपर मेरे उदाहरण में लाइन 2 पर, यह पूछना कि क्या $barस्ट्रिंग का मूल्य है "9"या संख्या 9बहुत अधिक अर्थहीन है, चूंकि, जैसा कि जहां तक ​​पर्ल का सवाल है, वे एक ही चीज हैं । दरअसल, यह एक पर्ल स्केलर के लिए आंतरिक रूप से दोनों के लिए भी संभव है एक स्ट्रिंग और एक संख्यात्मक मान एक ही समय में संभव है, जैसा कि $fooऊपर की पंक्ति 2 के लिए मामला है।

इस सब का दूसरा पहलू यह है कि, चूंकि पर्ल वेरिएबल अनपेड हैं (या, बल्कि, उपयोगकर्ता को अपने आंतरिक प्रकार को उजागर नहीं करते हैं), ऑपरेटरों को विभिन्न प्रकार के तर्कों के लिए अलग-अलग चीजें करने के लिए अतिभारित नहीं किया जा सकता है; आप बस यह नहीं कह सकते हैं "यह ऑपरेटर संख्याओं के लिए X और स्ट्रिंग्स के लिए Y करेगा", क्योंकि ऑपरेटर यह नहीं बता सकता है कि इसके तर्क किस प्रकार के मान हैं।

इस प्रकार, उदाहरण के लिए, पर्ल के पास न्यूमेरिक अतिरिक्त ऑपरेटर ( +) और स्ट्रिंग संकेंद्रन ऑपरेटर ( .) दोनों की आवश्यकता है : जैसा कि आपने ऊपर देखा, स्ट्रिंग्स ( "1" + "2" == "3") या समवर्ती संख्याओं को जोड़ने के लिए यह बिल्कुल ठीक है 1 . 2 == 12। इसी तरह, अंकीय तुलना ऑपरेटरों ==, !=, <, >, <=, >=और <=>उनके तर्कों के संख्यात्मक मान की तुलना, जबकि स्ट्रिंग तुलना ऑपरेटरों eq, ne, lt, gt, le, geऔर cmpउन्हें कोषगत तुलना तारों के रूप में। तो 2 < 10, लेकिन 2 gt 10(लेकिन "02" lt 10, जबकि "02" == 2)। (आप पर ध्यान दें, जावास्क्रिप्ट की तरह कुछ अन्य भाषाएं, पर्ल-जैसे कमजोर टाइपिंग को समायोजित करने का प्रयास करती हैंऑपरेटर ओवरलोडिंग भी कर रहा है। यह अक्सर कुरूपता की ओर जाता है, जैसे सहानुभूति की हानि +। "

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

सभी ने कहा कि, एक बहस कर सकते पर्ल कि करता है मजबूत प्रकार है; वे सिर्फ उस प्रकार के प्रकार नहीं हैं जिनकी आप अपेक्षा कर सकते हैं। विशेष रूप से, ऊपर चर्चा की गई "स्केलर" प्रकार के अलावा, पर्ल के दो संरचित प्रकार भी हैं: "सरणी" और "हैड"। वे स्केलर से बहुत अलग हैं , उस बिंदु पर जहां पर्ल चर में अलग-अलग सिगिल होते हैं जो उनके प्रकार ( $स्केलर्स के लिए, ऐरे के @लिए, %हैश के लिए) का संकेत देते हैं 1 । वहाँ रहे हैं ताकि आप, इन प्रकार के बीच बलात्कार नियमों कर सकते हैं जैसे लिखना %foo = @barहै, लेकिन उनमें से कई काफी हानिपूर्ण हैं: उदाहरण के लिए, $foo = @barप्रदान करती लंबाई सरणी के @barलिए$fooनहीं, इसकी सामग्री। (इसके अलावा, टाइपग्लोब और आई / ओ हैंडल जैसे कुछ अन्य अजीब प्रकार हैं, जिन्हें आप अक्सर उजागर नहीं करते हैं।)

इसके अलावा, इस अच्छे डिजाइन में एक मामूली झंकार संदर्भ प्रकारों का अस्तित्व है, जो एक विशेष प्रकार के स्केलर हैं (और जिसे ऑपरेटर का उपयोग करके सामान्य स्केलर से अलग किया जा सकता है ref)। सामान्य स्केलर के रूप में संदर्भों का उपयोग करना संभव है, लेकिन उनके स्ट्रिंग / संख्यात्मक मान विशेष रूप से उपयोगी नहीं हैं, और यदि आप सामान्य स्केलर ऑपरेशन का उपयोग करके उन्हें संशोधित करते हैं, तो वे अपने विशेष संदर्भ-नेस को खो देते हैं। इसके अलावा, कोई भी पर्ल चर 2 प्रतिमान हो सकता है । आम राय यह है कि, यदि आप अपने आप को पर्ल में किसी वस्तु के वर्ग की जाँच करते हुए पाते हैं, तो आप कुछ गलत कर रहे हैं।bless क्लास में एड , इसे उस क्लास के ऑब्जेक्ट में बदल सकते हैं; पर्ल में OO वर्ग प्रणाली ऊपर वर्णित आदिम प्रकार (या टाइपलेसनेस) प्रणाली के लिए कुछ हद तक रूढ़िवादी है, हालांकि यह बतख टाइपिंग के बाद "कमजोर" भी है


1 असल में, sigil एक्सेस किए जा रहे मूल्य के प्रकार को दर्शाता है, ताकि उदाहरण में सरणी में पहला स्केलर @fooनिरूपित हो $foo[0]। अधिक जानकारी के लिए perlfaq4 देखें ।

पर्ल में 2 ऑब्जेक्ट उनके संदर्भ के माध्यम से (सामान्य रूप से) एक्सेस किए जाते हैं, लेकिन वास्तव में जो blessएड होता है वह संदर्भ बिंदुओं को चर (संभवतः अनाम) चर होता है। हालाँकि, आशीर्वाद वास्तव में वैरिएबल की एक संपत्ति है, कि उसके मूल्य की, इसलिए जैसे कि दूसरे को वास्तविक धन्य वैरिएबल प्रदान करना बस आपको उथली, बिना कॉपी की नकल देता है। देखें perlobj अधिक जानकारी के लिए।


19

एरिक ने जो कहा है उसके अलावा, निम्नलिखित सी कोड पर विचार करें:

void f(void* x);

f(42);
f("hello");

पायथन, सी #, जावा या व्हाट्सन जैसी भाषाओं के विपरीत, उपरोक्त प्रकार से कमजोर टाइप किया जाता है क्योंकि हम टाइप जानकारी खो देते हैं। एरिक ने सही ढंग से बताया कि सी # में हम कास्टिंग करके कंपाइलर को दरकिनार कर सकते हैं, प्रभावी रूप से यह बताकर कि "मुझे आपके मुकाबले इस वेरिएबल के प्रकार के बारे में अधिक पता है"।

लेकिन फिर भी, रनटाइम अभी भी प्रकार की जांच करेगा! यदि कास्ट अमान्य है, तो रनटाइम सिस्टम इसे पकड़ लेगा और एक अपवाद फेंक देगा।

प्रकार के क्षरण के साथ, ऐसा नहीं होता है - प्रकार की जानकारी को फेंक दिया जाता है। void*C में एक कलाकार बिलकुल ऐसा ही करता है। इस संबंध में, उपरोक्त मूल रूप से C # विधि घोषणा से अलग है void f(Object x)

(तकनीकी रूप से, C # भी असुरक्षित कोड या मार्शलिंग के माध्यम से प्रकार के क्षरण की अनुमति देता है।)

यह उतना ही कमजोर है जितना इसे टाइप किया जाता है। बाकी सब कुछ केवल स्थैतिक बनाम गतिशील प्रकार की जाँच का विषय है, अर्थात जब किसी प्रकार की जाँच की जाती है।


1
+1 अच्छा बिंदु, आपने अब मुझे एक ऐसी विशेषता के रूप में मिटाए जाने के बारे में सोचा, जो "कमजोर-टाइप्डनेस" को भी प्रभावित कर सकती है। जावा में टाइप इरेज़र भी है, और रनटाइम पर, टाइप सिस्टम आपको उन बाधाओं का उल्लंघन करने देगा जो कंपाइलर कभी भी अनुमोदित नहीं करेगा। बिंदु का वर्णन करने के लिए C उदाहरण उत्कृष्ट है।
एडविन डेलोरजो

1
सहमत, प्याज, या नरक के लिए परतें हैं। ये टाइप कमजोरी की एक अधिक महत्वपूर्ण परिभाषा है।
जोड्रेल

1
@edalorzo मुझे नहीं लगता कि यह काफी समान है, भले ही जावा आपको कंपाइलर को दरकिनार करने की अनुमति देता है, रनटाइम टाइप सिस्टम अभी भी उल्लंघन को पकड़ लेगा। तो जावा रनटाइम प्रकार प्रणाली इस संबंध में दृढ़ता से टाइप की गई है (अपवाद हैं, उदाहरण जहां प्रतिबिंब का उपयोग नियंत्रण को दरकिनार करने के लिए किया जा सकता है)।
कोनराड रुडोल्फ

1
@edalorzo आप केवल कंपाइलर को इस तरह से रोक सकते हैं, न कि रनटाइम सिस्टम को। यह समझना महत्वपूर्ण है कि जावा और सी # (कुछ हद तक सी ++) जैसी भाषाओं में एक प्रकार की प्रणाली है जो दो बार सुनिश्चित की जाती है: एक बार संकलन समय पर, और एक बार रनटाइम पर। void*दोनों प्रकार की जाँच के माध्यम से टूट जाता है। सामान्य प्रकार का क्षरण नहीं करता है, यह केवल संकलन-समय की जाँच करता है। यह बिल्कुल स्पष्ट है कि इस संबंध में (एरिक द्वारा उल्लिखित) जातियां हैं।
कोनराड रुडोल्फ

1
@edalorzo Re आपका भ्रम: हमें नहीं करना चाहिए। भेद धाराप्रवाह है। और हां, टाइप इरिटेशन जावा को इस संबंध में कमजोर बनाता है। मेरा कहना यह था कि सामान्य प्रकार के क्षरण के साथ भी आप रनटाइम प्रकार की जाँच को तब तक नहीं रोक सकते जब तक कि आप भी प्रतिबिंब का उपयोग न करें
कोनराड रुडोल्फ

14

एक आदर्श उदाहरण मजबूत टाइपिंग के विकिपीडिया लेख से आता है :

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

कमजोर टाइपिंग

a = 2
b = "2"

concatenate(a, b) # returns "22"
add(a, b) # returns 4

मजबूत टाइपिंग

a = 2
b = "2"

concatenate(a, b) # Type Error
add(a, b) # Type Error
concatenate(str(a), b) #Returns "22"
add(a, int(b)) # Returns 4

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

यह सब टाइपिंग की व्याख्या पर निर्भर करता है।


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

3
सच। मुझे लगता है कि आप कह सकते हैं कि मजबूत टाइपिंग और कमजोर टाइपिंग की अलग-अलग डिग्री हैं। अंतर्निहित रूपांतरण का मतलब यह हो सकता है कि भाषा उस भाषा की तुलना में कम दृढ़ता से टाइप की गई है जो निहित रूपांतरण नहीं करती है।
शाऊलबैक

4

मैं इस विषय पर अपने स्वयं के अनुसंधान के साथ चर्चा में योगदान करना चाहूंगा, जैसा कि अन्य लोग टिप्पणी करते हैं और योगदान करते हैं कि मैं उनके उत्तर पढ़ रहा हूं और उनके संदर्भों का अनुसरण कर रहा हूं और मुझे दिलचस्प जानकारी मिली है। जैसा कि सुझाव दिया गया है, यह संभावित है कि प्रोग्रामर्स फोरम में इस पर बेहतर चर्चा की जाएगी, क्योंकि यह व्यावहारिक से अधिक सैद्धांतिक प्रतीत होता है।

एक सैद्धांतिक दृष्टिकोण से, मुझे लगता है कि लुका कार्डेली और पीटर वेगनर के लेख ऑन अंडरस्टैंडिंग टाइप्स, डेटा एब्सट्रैक्शन और पॉलीमॉर्फिज़्म के सबसे अच्छे तर्क हैं जो मैंने पढ़ा है।

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

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

लेख जारी है ...

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

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

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

दूसरी ओर, मैं का भत्ता से कह सकते हैं ClassCastExceptionऔर ArrayStoreException(जावा में) और InvalidCastException, ArrayTypeMismatchException(सी # में) संकलन समय पर कमजोर टाइपिंग का एक स्तर, कम से कम संकेत मिलता है? एरिक का जवाब इससे सहमत लगता है।

इस सवाल के जवाब में से एक में प्रदान किए गए संदर्भों में से एक में टाइपफुल प्रोग्रामिंग नामक एक दूसरे लेख में, लुका कार्डेली ने उल्लंघनों की अवधारणा का खुलासा किया है:

अधिकांश सिस्टम प्रोग्रामिंग भाषाएं मनमाने ढंग से उल्लंघन की अनुमति देती हैं, कुछ अंधाधुंध, कुछ केवल एक कार्यक्रम के प्रतिबंधित भागों में। प्रकार के उल्लंघन को शामिल करने वाले संचालन को अनसाउंड कहा जाता है। प्रकार के उल्लंघन कई वर्गों में आते हैं [जिनके बीच हम उल्लेख कर सकते हैं]:

मूल-मूल्य सहसंबंध : इनमें पूर्णांक, बूलियन, वर्ण, सेट आदि के बीच रूपांतरण शामिल हैं, यहाँ प्रकार के उल्लंघनों की कोई आवश्यकता नहीं है, क्योंकि एक प्रकार-ध्वनि तरीके से सहसंबंधों को पूरा करने के लिए अंतर्निहित इंटरफेस प्रदान किए जा सकते हैं।

जैसे, ऑपरेटरों द्वारा प्रदान किए गए उन लोगों की तरह टाइप क्यूरेशन को प्रकार का उल्लंघन माना जा सकता है, लेकिन जब तक वे टाइप सिस्टम की स्थिरता को नहीं तोड़ते, हम कह सकते हैं कि वे एक कमजोर टाइप सिस्टम के लिए नेतृत्व नहीं करते हैं।

इसके आधार पर न तो पायथन, पर्ल, जावा या C # कमजोर टाइप किए गए हैं।

कार्डेली ने दो प्रकार के उल्लंघनों का उल्लेख किया है कि मैं वास्तव में कमजोर टाइपिंग के मामलों पर बहुत अच्छी तरह से विचार करता हूं:

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

C (कोनराड द्वारा उल्लिखित) या .Net (असुरक्षित एरिक द्वारा उल्लिखित) के माध्यम से भाषाओं में इस तरह की चीजें संभवत: वास्तव में कमजोर टाइपिंग होगी।

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


4

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

मजबूत टाइपिंग का मतलब है कि प्रकार को कम नहीं किया जाता है, या कम से कम कम coerced है।

स्टेटिक टाइपिंग का मतलब है कि आपके चर के प्रकार संकलन के समय निर्धारित किए जाते हैं।

कई लोग हाल ही में "दृढ़ता से टाइप" के साथ "प्रकट रूप से टाइप" भ्रमित कर रहे हैं। "मैनिफेस्टली टाइप" का अर्थ है कि आप अपने चर के प्रकार स्पष्ट रूप से घोषित करते हैं।

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

C और C ++ प्रकट रूप से टाइप किया जाता है, स्टेटिकली टाइप किया जाता है, और कुछ हद तक टाइप किया जाता है, क्योंकि आप अपने प्रकारों की घोषणा करते हैं, प्रकार संकलन समय पर निर्धारित किए जाते हैं, और आप पूर्णांक और पॉइंटर्स, या पूर्णांक और डबल्स को मिला सकते हैं, या एक प्रकार में पॉइंटर भी डाल सकते हैं। एक अन्य प्रकार के लिए एक सूचक।

हास्केल एक दिलचस्प उदाहरण है, क्योंकि यह प्रकट रूप से टाइप नहीं किया गया है, लेकिन यह सांख्यिकीय और दृढ़ता से टाइप किया गया है।


+1 क्योंकि मुझे गढ़ा हुआ शब्द "प्रकट रूप से टाइप करना" पसंद है, जो जावा और सी # जैसी भाषाओं को वर्गीकृत करता है, जहाँ आपको स्पष्ट रूप से प्रकारों की घोषणा करनी होगी और उन्हें अन्य सांख्यिकीय प्रकार की भाषाओं जैसे हास्केल और स्काला से अलग करना होगा, जहाँ टाइप निष्कर्ष एक महत्वपूर्ण भूमिका निभाता है और यह आमतौर पर लोगों को भ्रमित करता है, जैसा कि आप कहते हैं, और उन्हें विश्वास है कि ये भाषाएं गतिशील रूप से टाइप की जाती हैं।
एडविन डेलोरजो

3

मजबूत <=> कमजोर टाइपिंग केवल इस बारे में नहीं है कि भाषा के एक-दूसरे के लिए एक डेटाटाइप से कितने या कितने मानों को स्वचालित रूप से ज़ब्त किया जाता है, लेकिन वास्तविक मूल्यों को कितनी दृढ़ता से या कमजोर रूप से को टाइप किया जाता है। पायथन और जावा में, और ज्यादातर C # में, मानों को पत्थर में सेट किया गया है। पर्ल में, इतना नहीं - एक चर में स्टोर करने के लिए वास्तव में केवल कुछ ही अलग-अलग वैल्यूसेटेप हैं।

एक-एक करके मामले खुलते हैं।


अजगर

पायथन उदाहरण में 1 + "1", +ऑपरेटर इसे एक तर्क के रूप में स्ट्रिंग देने वाले __add__प्रकार के लिए कहता है - हालांकि, यह NotImplemented में परिणाम देता है:int"1"

>>> (1).__add__('1')
NotImplemented

इसके बाद, दुभाषिया __radd__str की कोशिश करता है :

>>> '1'.__radd__(1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'str' object has no attribute '__radd__'

जैसे ही यह विफल होता है, +ऑपरेटर परिणाम के साथ विफल हो जाता है TypeError: unsupported operand type(s) for +: 'int' and 'str'। जैसे, अपवाद मजबूत टाइपिंग के बारे में बहुत कुछ नहीं कहता है, लेकिन तथ्य यह है कि ऑपरेटर + को मजबूर नहीं करता है अपने तर्क को एक ही प्रकार से स्वचालित रूप से , इस तथ्य के लिए एक संकेतक है कि पायथन निरंतरता में सबसे कमजोर टाइप की भाषा नहीं है।

दूसरी ओर, पायथन 'a' * 5 में लागू किया गया है:

>>> 'a' * 5
'aaaaa'

अर्थात्,

>>> 'a'.__mul__(5)
'aaaaa'

यह तथ्य कि ऑपरेशन अलग है, इसके लिए कुछ मजबूत टाइपिंग की आवश्यकता होती है - हालाँकि, *संख्याओं को गुणा करने से पहले मानों को जोड़ने के विपरीत अभी भी जरूरी नहीं है कि मान कमजोर रूप से टाइप किए गए हों।


जावा

जावा उदाहरण, String result = "1" + 1;केवल इसलिए काम करता है क्योंकि सुविधा के तथ्य के रूप में, ऑपरेटर +को तार के लिए अतिभारित किया जाता है। जावा +ऑपरेटर एक बनाने के साथ अनुक्रम को बदल देता है StringBuilder(देखें इस ):

String result = a + b;
// becomes something like
String result = new StringBuilder().append(a).append(b).toString()

यह बहुत स्थिर टाइपिंग का एक उदाहरण है, बिना किसी वास्तविक जबरदस्ती के - StringBuilderएक ऐसा तरीका append(Object)है जो विशेष रूप से यहां उपयोग किया जाता है। प्रलेखन निम्नलिखित कहता है:

Objectतर्क के कड़े प्रतिनिधित्व को लागू करता है।

समग्र प्रभाव वैसा ही है जैसे कि विधि द्वारा तर्क को एक स्ट्रिंग में बदल दिया गया था String.valueOf(Object), और फिर उस स्ट्रिंग के वर्णों को इस वर्ण अनुक्रम में जोड़ा गया था।

String.valueOfतब कहां

ऑब्जेक्ट तर्क का स्ट्रिंग प्रतिनिधित्व लौटाता है। [लौटता है] यदि तर्क है null, तो एक स्ट्रिंग के बराबर "null"; अन्यथा, का मान obj.toString()लौटाया जाता है।

इस प्रकार यह भाषा द्वारा बिल्कुल कोई जोर-जबरदस्ती का मामला नहीं है - वस्तुओं को हर चिंता का प्रतिनिधित्व करना।


सी#

जॉन स्कीट के जवाब के अनुसार , ऑपरेटर को जावा के +लिए भी अतिभारित नहीं किया गया है string- जावा के समान, यह केवल संकलक द्वारा उत्पन्न सुविधा है, जो स्थैतिक और मजबूत टाइपिंग दोनों के लिए धन्यवाद है।


पर्ल

जैसा कि प्रतिमा बताते हैं,

पर्ल में तीन अंतर्निहित डेटा प्रकार होते हैं: स्केलर, स्केलर्स की सरणियाँ, और स्केलर्स के साहचर्य सरणियों, जिन्हें "हैश" के रूप में जाना जाता है। एक स्केलर एक एकल स्ट्रिंग है (किसी भी आकार का, केवल उपलब्ध मेमोरी द्वारा सीमित), संख्या, या किसी चीज़ का संदर्भ (जिसकी चर्चा पर्ल में की जाएगी)। सामान्य सरणियों को संख्या द्वारा अनुक्रमित स्केलर की सूची का आदेश दिया जाता है, 0. के साथ शुरू होता है Hashes उनके संबंधित स्ट्रिंग कुंजी द्वारा अनुक्रमित स्केलर मानों के अनियोजित संग्रह हैं।

पर्ल के पास संख्या, बूलियन, स्ट्रिंग्स, नल, undefinedएस, अन्य वस्तुओं के संदर्भ आदि के लिए एक अलग डेटा प्रकार नहीं है - यह इन सभी के लिए एक प्रकार है, स्केलर प्रकार; 0 एक अदिश मान है जितना "0" है। एक स्केलर वैरिएबल जो एक स्ट्रिंग के रूप में सेट किया गया था, वास्तव में एक संख्या में बदल सकता है, और वहां से "बस एक स्ट्रिंग" से अलग व्यवहार करता है करता है अगर यह संख्यात्मक संदर्भ में एक्सेस किया जाता है।,। स्केलर पर्ल में कुछ भी पकड़ सकता है, यह उतना ही ऑब्जेक्ट है जितना कि सिस्टम में मौजूद है। जबकि पायथन में नाम सिर्फ वस्तुओं को संदर्भित करते हैं, पर्ल में नाम में स्केलर मान अस्थिर वस्तु हैं। इसके अलावा, ऑब्जेक्ट ओरिएंटेड टाइप सिस्टम इस के शीर्ष पर सरेस से जोड़ा हुआ है: पर्ल में केवल 3 डेटाटिप्स हैं - स्केलर, सूचियां और हैश।bless एक पैकेज में एड - आप इस तरह का कोई भी मूल्य ले सकते हैं और इसे किसी भी वर्ग को किसी भी पल में आशीर्वाद दे सकते हैं।

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

package Foo;
package Bar;

my $val = 42;
# $val is now a scalar value set from double
bless \$val, Foo;
# all references to $val now belong to class Foo
my $obj = \$val;
# now $obj refers to the SV stored in $val
# thus this prints: Foo=SCALAR(0x1c7d8c8)
print \$val, "\n"; 
# all references to $val now belong to class Bar
bless \$val, Bar;
# thus this prints Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# we change the value stored in $val from number to a string
$val = 'abc';
# yet still the SV is blessed: Bar=SCALAR(0x1c7d8c8)
print \$val, "\n";
# and on the course, the $obj now refers to a "Bar" even though
# at the time of copying it did refer to a "Foo".
print $obj, "\n";

इस प्रकार प्रकार की पहचान कमजोर रूप से चर के लिए बाध्य है, और इसे मक्खी पर किसी भी संदर्भ के माध्यम से बदला जा सकता है। वास्तव में, यदि आप करते हैं

my $another = $val;

\$anotherवर्ग पहचान नहीं है, भले ही \$valअभी भी धन्य संदर्भ देगा।


टी एल; डॉ

Perl के कमजोर टाइपिंग के बारे में बहुत कुछ हैं जो सिर्फ स्वचालित ज़ब्ती की तुलना में अधिक हैं, और यह इस बारे में अधिक है कि पायथन के विपरीत मानों के प्रकार स्वयं पत्थर में सेट नहीं होते हैं, जो गतिशील रूप से अभी तक बहुत दृढ़ता से टाइप की गई भाषा है। अजगर जो देता TypeErrorहै 1 + "1"वह एक संकेत है कि भाषा दृढ़ता से टाइप की जाती है, भले ही कुछ उपयोगी करने के विपरीत हो, जैसा कि जावा या सी # में उन्हें दृढ़ता से टाइप की जाने वाली भाषाएं शामिल नहीं करती हैं।


यह पूरी तरह से भ्रमित है। कि पर्ल 5 वैरिएबल में प्रकार नहीं होते हैं , जो मूल्यों पर कोई असर नहीं डालते हैं , जिनमें हमेशा एक प्रकार होता है।
जिम बाल्टर

@JimBalter अच्छी तरह से, हाँ, एक मान में एक प्रकार है कि यह एक स्ट्रिंग या एक संख्या है, और यह कुछ संदर्भ में अलग तरह से व्यवहार कर सकता है यदि स्केलेर चर में एक स्ट्रिंग या एक संख्या होती है; लेकिन एक चर में निहित मूल्य केवल चर का उपयोग करके प्रकार बदल सकता है, और चूंकि मूल्य स्वयं चर में रहता है , इसलिए मूल्यों को स्वयं प्रकारों के बीच परिवर्तनशील माना जा सकता है।
अंती हापला

मान प्रकार नहीं बदलते हैं - यह असंगत है; एक मान हमेशा एक प्रकार का होता है । एक चर वाले मान को बदल सकते हैं। 1 से "1" का परिवर्तन केवल 1 से 2 के परिवर्तन के रूप में मूल्य में एक बदलाव है।
जिम बेल्टर

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

PS यह दिखाया जा सकता है कि पर्ल में भी, <अंक> और "<अंक>" के अलग-अलग मूल्य हैं, न कि केवल विभिन्न प्रकार। पर्ल <अंक> और "<अंक>" बनाता दिखाई के माध्यम से ज्यादातर मामलों में एक ही मूल्य है करने के लिए अंतर्निहित रूपांतरण , लेकिन भ्रम पूरा नहीं हुआ है; जैसे "12" | "३४" ३६ है जबकि १२ | 34 46 है। एक अन्य उदाहरण यह है कि "00" अधिकांश संदर्भों में संख्यात्मक रूप से 00 के बराबर है, लेकिन बूलियन संदर्भ में नहीं, जहां "00" सत्य है लेकिन 00 गलत है।
जिम बाल्टर

1

जैसा कि कई अन्य लोगों ने व्यक्त किया है, "मजबूत" बनाम "कमजोर" टाइपिंग की पूरी धारणा समस्याग्रस्त है।

एक कट्टरपंथी के रूप में, स्मालटाक बहुत दृढ़ता से टाइप किया गया है - यह हमेशा एक अपवाद उठाएगा यदि दो वस्तुओं के बीच एक ऑपरेशन असंगत है। हालाँकि, मुझे इस सूची में कुछ संदेह है कि स्मॉलटाक को एक जोरदार-टाइप भाषा कहा जाएगा, क्योंकि यह गतिशील रूप से टाइप किया गया है।

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

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

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

एक ऐसी वस्तु चाहते हैं जो रंग नीले रंग का वर्णन करने वाली वस्तु तर्क के साथ "+" संदेश को कुछ सार्थक प्रतिक्रिया दे सके? आप ऐसा डायनेमिक रूप से टाइप की गई भाषाओं में कर सकते हैं, लेकिन यह सांख्यिकीय रूप से टाइप की जाने वाली भाषाओं में एक दर्द है।


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

0

मुझे @Eric Lippert का उत्तर पसंद है , लेकिन प्रश्न को हल करने के लिए - जोरदार टाइप की गई भाषाओं में आमतौर पर कार्यक्रम के प्रत्येक बिंदु पर चर के प्रकारों का स्पष्ट ज्ञान होता है। कमजोर टाइप की भाषाएं नहीं होती हैं, इसलिए वे एक ऑपरेशन करने का प्रयास कर सकते हैं जो एक विशेष प्रकार के लिए संभव नहीं हो सकता है। यह देखने का सबसे आसान तरीका है कि यह एक फ़ंक्शन में है। सी ++:

void func(string a) {...}

वेरिएबल aटाइप स्ट्रिंग के रूप में जाना जाता है और किसी भी असंगत संचालन को संकलन समय पर पकड़ा जाएगा।

अजगर:

def func(a)
  ...

चर aकुछ भी हो सकता है और हमारे पास एक अमान्य पद्धति को कॉल करने वाला कोड हो सकता है, जो केवल रनटाइम पर पकड़ा जाएगा।


12
मुझे लगता है कि आप मजबूत टाइपिंग बनाम कमजोर टाइपिंग के साथ डायनामिक टाइपिंग बनाम स्टेटिक टाइपिंग को भ्रमित कर सकते हैं। आपके कोड के दोनों संस्करणों में, रनटाइम प्रकार सिस्टम बहुत अच्छी तरह से जानता है कि एक स्ट्रिंग है। यह सिर्फ इतना है कि पहले मामले में, कंपाइलर आपको बता सकता है कि, दूसरे में यह नहीं हो सकता है। लेकिन इससे इनमें से कोई भी भाषा कमजोर टाइप की नहीं है।
एडविन डेलोरोज़ो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.