कमजोर टाइपिंग के पक्ष में क्या तर्क हैं?


40

यह एक दोस्त के साथ चर्चा में आया, और मैंने खुद को किसी भी अच्छे तर्क के बारे में सोचने के लिए कठोर पाया। कमजोर टाइपिंग कॉन्फ्रेंस के क्या लाभ हैं?


17
कूपर और Torczon's Engineering एक कंपाइलर कमजोर टाइपिंग प्रणाली को नियोजित करने के रूप में कमजोर टाइपिंग को परिभाषित करता है। यह निश्चित है कि यह किसी को भी फायदा होगा जैसे ध्वनि नहीं है।
कॉर्बिन मार्च

@ कोर्बिन मार्च: एक अच्छा। मुझे इसे अपनी सूची में जोड़ना होगा।
जोर्ग डब्ल्यू मित्तग

5
सबसे अच्छा तर्क कॉर्पोरेट अधिकारियों द्वारा दिया जा सकता है: यह मुझे अपने सिस्टम बनाने के लिए सस्ते लोगों को नियुक्त करने की अनुमति देता है
वेक्टर

जवाबों:


46

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

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

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

आमतौर पर इस्तेमाल की जाने वाली परिभाषाओं में से कुछ हैं (और हाँ, मुझे पता है कि उनमें से कोई भी कोई मतलब नहीं है, लेकिन वे परिभाषाएं हैं जिन्हें मैंने देखा है कि लोग वास्तव में उपयोग करते हैं):

  • कमजोर टाइपिंग = असुरक्षित टाइपिंग / मजबूत टाइपिंग = सुरक्षित टाइपिंग
  • कमजोर टाइपिंग = गतिशील टाइपिंग / मजबूत टाइपिंग = स्थिर टाइपिंग
  • कमजोर टाइपिंग = बतख टाइपिंग / मजबूत टाइपिंग = नाममात्र टाइपिंग
  • कमजोर टाइपिंग = संरचनात्मक टाइपिंग / मजबूत टाइपिंग = नाममात्र टाइपिंग
  • कमजोर टाइपिंग = निहित टाइपिंग / मजबूत टाइपिंग = स्पष्ट टाइपिंग
  • कमजोर टाइपिंग = अव्यक्त टाइपिंग / मजबूत टाइपिंग = टाइपिंग टाइपिंग
  • कमजोर टाइपिंग = कोई टाइपिंग / मजबूत टाइपिंग = टाइपिंग नहीं
  • कमजोर टाइपिंग = निहित जाति / मजबूत टाइपिंग = केवल स्पष्ट जाति
  • कमजोर टाइपिंग = निहित या स्पष्ट जाति / मजबूत टाइपिंग = कोई जाति नहीं
  • कमजोर टाइपिंग = निहित रूपांतरण / मजबूत टाइपिंग = केवल स्पष्ट रूपांतरण
  • कमजोर टाइपिंग = निहित या स्पष्ट रूपांतरण / मजबूत टाइपिंग = कोई रूपांतरण नहीं
  • कमजोर टाइपिंग = व्याख्या / मजबूत टाइपिंग = संकलन
  • कमजोर टाइपिंग = धीमी / मजबूत टाइपिंग = तेज
  • कमजोर टाइपिंग = कचरा संग्रहण / मजबूत टाइपिंग = मैनुअल मेमोरी मैनेजमेंट
  • कमजोर टाइपिंग = मैनुअल मेमोरी प्रबंधन / मजबूत टाइपिंग = कचरा संग्रह
  • … और बहुत सारे

हालांकि, तीन परिभाषाएं जो सबसे अधिक व्यापक रूप से उपयोग की जाती हैं, वे हैं

  • कमजोर टाइपिंग = आपकी बेवकूफ गंदी प्रोग्रामिंग भाषा / मजबूत टाइपिंग = मेरी सुपर-कमाल की प्रोग्रामिंग भाषा
  • कमजोर टाइपिंग = हर दूसरी प्रोग्रामिंग लैंग्वेज / मजबूत टाइपिंग = एकमात्र प्रोग्रामिंग लैंग्वेज जिसे मैंने कभी सीखने की जहमत उठाई (आमतौर पर या तो जावा, सी या सी + ++; यह विश्वदृष्टि)
  • कमजोर टाइपिंग = हर भाषा जो मुझे समझ में नहीं आती / मजबूत टाइपिंग = जावा (इच्छानुसार C # या C ++ के साथ स्थानापन्न)

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

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


5
बहुत खौफनाक जवाब! मुझे लगता है कि आप कहाँ से आ रहे हैं, लेकिन मुझे लगता है कि यह "काफी अच्छा" है यह अनुमान लगाने के लिए कि जो कोई भी परिभाषा प्रदान नहीं करता है वह "कमजोर और / या गतिशील टाइपिंग" का उल्लेख कर रहा है, यही कारण है कि मैंने अपने उत्तर में दोनों को शामिल किया। मुझे पता है कि यह सही नहीं है, लेकिन ज्यादातर लोग इस प्रकार के सिस्टम को परिभाषित करने की बात करते हैं।
निकोल

7
@ संदर्भ: मैं इसे "यथार्थवाद" कहूंगा :-) मैंने टाइप सिस्टम के बारे में पर्याप्त चर्चा की है कि यह महसूस करने के लिए कि आधे लोग महसूस नहीं करते कि वे पूरी तरह से अलग-अलग चीजों के बारे में बात कर रहे हैं और दूसरे को पता नहीं है कि वे क्या बात कर रहे हैं। सब के बारे में । कुछ महीने पहले, प्रदर्शन में सुधार के लिए एक वैकल्पिक प्रकार प्रणाली को जोड़ने के बारे में एक भाषा की मुख्य विकास सूची पर चर्चा होगी जिसका मैं नाम नहीं लूंगा। यह चर्चा एक हफ्ते तक चली, जिसमें दर्जनों लोग और सैकड़ों मेल शामिल थे। किसी ने महसूस नहीं किया कि परिभाषा के अनुसार एक वैकल्पिक प्रकार प्रणाली प्रदर्शन में सुधार नहीं कर सकती है। …
Jörg W Mittag

8
Cynism के लिए +1! आप "मजबूत टाइपिंग = जोड़ सकते हैं जब IDE मेरे चर (Intellisense आदि) के प्रकार जानता है, कमजोर टाइपिंग = जब यह नहीं होता है"
user281377

1
टाइपिंग सिस्टम के लिए बेहतर परिभाषित नामों में निहित मूल्य निर्णय की कमी कमजोर और मजबूत है।
ईवा

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

25

याद रखें कि दो प्रमुख अवधारणाएं हैं जो आमतौर पर भ्रमित होती हैं:

गतिशील टाइपिंग

एक प्रोग्रामिंग भाषा को गतिशील रूप से टाइप करने के लिए कहा जाता है, जब इसके प्रकार की अधिकांश जाँच को रन-टाइम पर संकलन-समय के विपरीत किया जाता है। डायनेमिक टाइपिंग में, मानों के प्रकार होते हैं लेकिन चर नहीं होते हैं; वह है, एक चर किसी भी प्रकार के मूल्य को संदर्भित कर सकता है।

यहाँ लाभ अक्सर "नए" प्रोग्रामर के रूप में खारिज कर दिया जाता है, लेकिन किसी भी प्रोग्रामर के लिए भी सुविधाजनक हो सकता है:

if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever

किसी भी मामले में कम कोड जहां आपको अन्यथा एक नया मूल्य डालना या असाइन करना होगा:

if (data is Array)) {
    i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}

ढीली या कमजोर टाइपिंग

कमजोर टाइपिंग का मतलब है कि एक भाषा जब इस्तेमाल की जाती है तो (या जाती) प्रकारों को रूपांतरित करती है।

लाभ:

  • किसी फ़ंक्शन के पैरामीटर के रूप में किसी भी प्रकार का मान पास करें । कॉलबैक के लिए उपयोगी, लचीला एपीआई, और क्लोजर के सरल कार्यान्वयन के लिए बनाता है।
  • निहित बूलियन मूल्यांकन । किसी भी प्रकार का मूल्यांकन बूलियन के रूप में किया जा सकता है। इसके साइड इफेक्ट्स भी हैं जैसे कि ||बूलियन में रूपांतरण के बिना असाइनमेंट में इस्तेमाल किया जा सकता है:

    var a = param || defaultValue;
    
  • फिर से, कम कोड:

    var num = 5;
    var str = "Hello";
    input.innerHTML = input.value = num;
    for (var i=0; i < input.value; i++) { ... }
    

    यहां तक ​​कि जावा को पार्टवे जाना था, .toString()जिसमें ऑब्जेक्ट के साथ संयोजन करते समय निहित कॉल के साथ String; अन्यथा जावा प्रोग्रामर दिन भर इसे कोसते रहेंगे (लॉग स्टेटमेंट नियंत्रण से बाहर होंगे)।


दोनों परिभाषाएँ http://en.wikipedia.org/wiki/Type_system से हैं । इसने कहा कि मैं इससे बेहतर कर सकता था।


1
डायनामिक टाइपिंग भी फायदेमंद है जहाँ एक स्थिर-टाइप की गई भाषा में बहुत सी कोड पीढ़ी की आवश्यकता होगी। डायनामिक-टाइप की गई भाषाओं (PHP, Python, आदि) में C # से ORM पुस्तकालयों के लिए आवश्यक कोड पीढ़ी की मात्रा की तुलना करें। हालांकि कुछ का तर्क हो सकता है कि IDE IntelliSense के संदर्भ में लाभ उस सभी कोड पीढ़ी की लागत को बढ़ा देता है ...
डीन हार्डिंग

3
आपकी टिप्पणी "// नहीं i = ((ऐरे) डेटा) .length या एरे myArr = (एरे) डेटा;" डायनेमिक टाइपिंग से वास्तव में कोई लेना-देना नहीं है, क्योंकि डेटा का एरे-नेस संकलन-समय पर साबित होता है। एक सांख्यिकीय रूप से टाइप की गई भाषा, उदाहरण के लिए प्राप्त ज्ञान का प्रचार कर सकती है।
पीटर टेलर

@Peter टेलर, मुझे लगता है कि यह सरल मामलों में सच है, क्या आपको ऐसा करने वाले किसी के बारे में पता है? इसका डायनेमिक टाइपिंग से कोई लेना-देना नहीं है, चाहे ifब्लॉक का उपयोग किया जाए या कुछ और अधिक जटिल (यहां तक ​​कि रनटाइम या डायनेमिक) तर्क, अगली पंक्ति कानूनी और त्रुटियों से सुरक्षित होगी।
निकोल

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

1
@Peter टेलर सही है। डायनामिक टाइपिंग के कई लाभ बेहतर स्टेटिक टाइपिंग सिस्टम वाली भाषाओं में उपलब्ध हैं, जैसे कुछ मामलों में हास्केल, स्काला या सी #। मैं कहूंगा कि डायनामिक टाइपिंग का प्रमुख लाभ उन चीजों के साथ है जो HTML डोम की तरह स्वाभाविक रूप से टाइपलेस हैं। क्यों नोड के बजाय "[Attr"] नोड लिखें। वे हमेशा रनटाइम पर वैसे भी हल हो जाते हैं।
मैट ओलीनिक

7

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

C सबसे प्रसिद्ध कमजोर टाइप की भाषा है, और यह चर प्रकार की जाँच या संकलन समय की जाँच करने के लिए कोई रन टाइम प्रदर्शन नहीं करती है। संक्षेप में, आप char *एक int *और एक को कास्ट कर सकते हैं और भाषा परवाह नहीं करेगी। तो आप ऐसा क्यों करेंगे?

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

जबकि रन-टाइम प्रकार की जाँच में एक असाधारण बिट ओवरहेड नहीं होता है, कई बार ऐसा होता है जब यह महत्वपूर्ण खंड को बहुत धीमा करने के लिए पर्याप्त होता है। मैं इस मामले में ज्यादातर एम्बेडेड प्रोग्रामिंग और रियल टाइम सिस्टम के बारे में सोच रहा हूं।

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


2
मैं यह नहीं देखता कि एक जोरदार टाइप की गई भाषा सी के रूप में कुशलता से संकलित क्यों नहीं हो सकती है लेकिन कंपाइलर को अधिक जटिल होना चाहिए।
9000

2
C ++ ऐसी ही एक भाषा का एक उदाहरण है। C ++ में सभी प्रकार की जाँच संकलन समय पर की जाती है, और रन टाइम पर कोई भी नहीं किया जाता है ... तब तक जब आप RTTI सक्षम होते हैं।
बेरिन लोरिट्श

2
सुनिश्चित नहीं हैं कि मैं इस प्रदर्शन तर्क से सहमत है, लेकिन यह है एक दिलचस्प दृश्य।
मार्टिन बा

2

कमजोर टाइपिंग आम तौर पर newbies के लिए समझ में आसान है, उदाहरण के लिए एक्सेल, जावास्क्रिप्ट और vbscript जैसी चीजों में। आप संभावित त्रुटियों के लिए कुछ विकास की गति का भी व्यापार करते हैं।

विषय पर अच्छा लेख: मजबूत टाइपिंग बनाम मजबूत परीक्षण


1
मुझे नहीं लगता कि कमजोर टाइप की भाषाओं और नौसिखिया अनुकूल भाषाओं के बीच एक मजबूत पत्राचार है। रूबी और अजगर दृढ़ता से टाइप किए जाते हैं और आमतौर पर नौसिखिया के अनुकूल माने जाते हैं। C कमजोर रूप से टाइप किया जाता है और आमतौर पर नौसिखिया शत्रुतापूर्ण माना जाता है।
sepp2k

नहीं, सामान्य रूप से भाषा नहीं है, मैं सिर्फ टाइपिंग के बारे में बात कर रहा था
होमडे

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

3
@Mchl: जिसका स्थैतिक / गतिशील या मजबूत / कमजोर टाइपिंग से कोई लेना-देना नहीं है। प्रकारों की घोषणा करना स्पष्ट / निहित टाइपिंग के बारे में है।
जोर्ग डब्ल्यू मित्तग

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