चर घोषित करते समय आपको डेटा प्रकार क्यों निर्दिष्ट करना होगा?


41

अधिकांश कोडिंग भाषाओं में (यदि सभी नहीं) तो आपको चर घोषित करने की आवश्यकता है। उदाहरण के लिए C # में यदि उसका नंबर फ़ील्ड है तो

int PhoneNumber

मैं सामान्य अंग्रेजी भाषा का उपयोग कर रहा है, तो मैं यह घोषणा की जरूरत नहीं है PhoneNumberके रूप में intइसका इस्तेमाल करने की। उदाहरण के लिए अगर मैं अपने दोस्त सैम से कहता हूं कि वह मुझे अपना फोन नंबर दे दे तो मैं कह सकता हूं:

"सैम मुझे फोननंबर दे दो"

मैं नहीं कहूंगा

"चार (20) सैम मुझे int फोन दे"

हमें डेटा प्रकार आखिर क्यों निर्दिष्ट करना है?


83
के ऐसा इसलिए है क्योंकि अंग्रेजी निहित टाइपिंग है - तो yourPhoneNumber परोक्ष एक के रूप में लिखा गया PhoneNumber ); - मनुष्य भी गतिशील स्मृति आवंटन है ...
HorusKol

28
आप और सैम जानते हैं कि एक फ़ोन नंबर में अंक होते हैं और आपको इसमें एक अक्षर मिल जाता है। कंप्यूटर को बताने की जरूरत नहीं है।
थोरबजोरन रेव एंडरसन

16
और जब मैं फिल्मों में 1-800-JIMBO जैसी संख्या सुनता हूं, तो मेरा विचार है: यह एक संख्या कैसे है ? ऊ
मुरु

103
आपको phoneNumber को int घोषित नहीं करना चाहिए। अधिकांश प्रोग्रामिंग भाषाओं में यह अग्रणी शून्य हटा देगा।
अरोन_डेक

25
@ हॉर्सकॉल: इंसानों के पास न केवल डायनेमिक मेमोरी एलोकेशन है, बल्कि एक बेहद
नॉनकॉन्सेर्वेटिव

जवाबों:


79

अधिकांश कोडिंग भाषाओं में (यदि सभी नहीं) तो आपको चर घोषित करने की आवश्यकता है।

[...]

हमें डेटा प्रकार आखिर क्यों निर्दिष्ट करना है?

वे दो स्वतंत्र प्रश्न हैं:

  • हमें चर घोषित करने की आवश्यकता क्यों है?
  • हमें प्रकार घोषित करने की आवश्यकता क्यों है?

संयोग से, दोनों का उत्तर है: हम नहीं।

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

उदाहरण के लिए, स्काला में आप कह सकते हैं

val age: Int = 23

या आप बस कह सकते हैं

val age = 23

दो बिल्कुल बराबर हैं: कंपाइलर Intइनिशियलाइज़ेशन एक्सप्रेशन से टाइप होगा 23

इसी तरह, C♯ में, आप इन दोनों में से किसी एक को भी कह सकते हैं, और वे दोनों का मतलब एक ही है:

int age = 23;
var age = 23;

इस सुविधा को प्रकार का अनुमान कहा जाता है , और स्कैला और C it के अलावा कई भाषाओं में यह है: हास्केल, कोटलिन, सीलोन, एमएल, F in, C ++, आप इसे नाम देते हैं। यहां तक ​​कि जावा में सीमित प्रकार के इंजेक्शन भी हैं।

गतिशील रूप से टाइप की गई प्रोग्रामिंग भाषाओं में, चर भी प्रकार नहीं होते हैं। प्रकार केवल रनटाइम पर गतिशील रूप से मौजूद होते हैं, न कि सांख्यिकीय रूप से। केवल मूल्यों और अभिव्यक्तियों के प्रकार होते हैं और केवल रनटाइम पर, चर प्रकार नहीं होते हैं।

जैसे ECMAScript:

const age = 23;
let age = 23;

और अंत में, बहुत सारी भाषाओं में, आपको चर घोषित करने की भी आवश्यकता नहीं है। रूबी में जैसे:

age = 23

वास्तव में, यह अंतिम उदाहरण कई प्रोग्रामिंग भाषाओं में मान्य है। उदाहरण के लिए, कोड की सटीक समान रेखा भी पायथन में काम करेगी।

इसलिए,

  • यहां तक ​​कि वैधानिक रूप से टाइप की जाने वाली भाषाओं में जहां चर प्रकार होते हैं, आपको जरूरी नहीं कि उन्हें घोषित करना है,
  • गतिशील रूप से टाइप की गई भाषाओं में, चर प्रकार नहीं होते हैं, इसलिए जाहिर है कि आप उन्हें घोषित भी नहीं कर सकते ,
  • कई भाषाओं में, आपको चर घोषित करने की आवश्यकता नहीं है

2
इसके अलावा दोनों प्रकार के अनुमान और गतिशील टाइपिंग (देर से बाध्यकारी) को समझाने के लिए एक
dcorking

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

7
@KRyan: यदि आप जानना चाहते हैं कि एक निश्चित भाषा डिजाइनर ने एक निश्चित भाषा डिज़ाइन विकल्प क्यों बनाया है, तो आपको उस भाषा डिजाइनर से पूछना होगा, मुझे डर है। मैं आपको यह नहीं बता सकता कि C♯ के डिजाइनरों ने टाइप इंट्रैक्शन के खिलाफ फैसला क्यों किया, और न ही मैं आपको बता सकता हूं कि उन्होंने बाद में अपने विचार क्यों बदले। भाषा के डिजाइन पर भारी राय है और अक्सर स्वाद के लिए नीचे आता है। यदि, ओटीओएच, आप इसमें शामिल विशिष्ट ट्रेड-ऑफ के बारे में जानना चाहते हैं, तो उत्तर मूल रूप से प्रो। पियर्स के प्रकारों और प्रोग्रामिंग भाषाओं का पुन: प्रिंट होगा जो स्टैक एक्सचेंज के लिए बहुत व्यापक है।
जोर्ग डब्ल्यू मित्तग

2
JörgWMittag: जैसा कि @KRyan ने पहले ही कहा था, "आपके पास" का उत्तर बहुत दिलचस्प नहीं है (यह स्पष्ट रूप से स्पष्ट है - कई भाषाएं कुछ मामलों में प्रकार की घोषणाओं को छोड़ देने की अनुमति देती हैं)। सवाल "आप क्यों घोषित करना चाहते हैं" अधिक दिलचस्प है और बेहतर है मूल प्रश्न की भावना को प्रतिबिंबित करें (आपका जवाब मुझे मजाक की याद दिलाता है: "हम कहां हैं?" - "आप एक गर्म हवा के गुब्बारे में हैं?" ! ” )। आपको यह जानने की जरूरत नहीं है कि उस समय एक विशिष्ट भाषा के एक डिजाइनर ने किस प्रकार के घोषणा के पक्ष में कुछ अच्छे कारण प्रदान किए।
jfs

1
@Zaibis: auto i = 1 // i is inferred to type int, vector<int> vec; auto itr = vec.iterator(); // itr is inferred to type vector<int>::iteratorऔर इतने पर। यदि आप जानना चाहते हैं कि वास्तव में यह कैसे काम करता है, तो आप इसे कल्पना में देख सकते हैं।
जॉर्ग डब्ल्यू मित्तग

53

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

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

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

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

इसके अलावा, जैसा कि कंप्यूटर को नहीं लगता है, क्षेत्र या चर (जैसे phonenumber) का नाम, कंप्यूटर के लिए कुछ भी नहीं है। कंप्यूटर के लिए, उस फ़ील्ड / चर का नाम सिर्फ "blah123" है। इस बारे में सोचें कि यदि सभी चर "ब्लाहएक्सएक्स" हैं तो आपका कार्यक्रम कैसा होगा। ओह। ठीक है, यह वही है जो कंप्यूटर देखता है। एक प्रकार प्रदान करना कंप्यूटर को चर के अर्थ में एक स्याही देता है कि यह केवल अपने नाम से नहीं पता लगा सकता है।

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


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

मुझे लगता है कि आप को उजागर करना चाहिए / बोल्ड इस लाइन: Types are part of a system of checks that ...के बाद से यह सीधे पर ओपी उत्तर देता है Why do we have to specify data type at all?..
txtechhelp

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

@SergioTulentsev यह सच नहीं है - एफ # में, आप उनके प्रकार को स्पष्ट किए बिना सार्वजनिक तरीके रख सकते हैं। कंपाइलर विधि के अंदर उपयोग से प्रकारों का अनुमान लगाएगा। उदाहरण के लिए, निम्नलिखित वैध सार्वजनिक विधि परिभाषाएं दी गई हैं: static member add x y = x + y, member x.Append s = x.Text + s। पहले मामले में, xऔर जोड़ के कारण एस yहोने का अनुमान लगाया जाएगा int। दूसरे मामले में वे उस प्रकार के आधार पर जो कुछ भी मान्य है x.Text- - यदि यह ए है string, तो sएक stringजैसा होगा । मैं इस बात से सहमत हूं कि टाइप एनोटेशन प्रलेखन हैं, हालांकि।
रज्जो

"अंतर्निहित स्थानीय प्रकार, स्पष्ट इंटरफ़ेस प्रकार" , हास्केल जैसी भाषाओं में भी, बहुत सारे लोग कैसे प्रोग्राम करते हैं, जो आपको कंपाइलर के सख्त प्रकारों के होने के बावजूद सभी प्रकारों को छोड़ देने की अनुमति देता है। कई लोग ऐसे होते हैं जो इस बात पर दुखी नहीं होते हैं जब कोई भाषा इस प्रथा को लागू करती है (जैसा कि C # करता है)।
बेन

29

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

26 3A 00 FF

इसका क्या मतलब है ? यह इस तरह से कंप्यूटर द्वारा संग्रहीत किया जाता है, लेकिन किसी भी व्याख्या के बिना, यह सिर्फ बिट्स है । यह 4 अस्सी वर्ण हो सकता है। यह पूर्णांक हो सकता है। यह एक सरणी में कुछ बाइट्स हो सकता है। यह किसी वस्तु का हिस्सा हो सकता है। यह एक संकेतक हो सकता है जहां बिल्ली का वीडियो बफरिंग कर रहा है। असेंबली से बहुत सारी प्रोग्रामिंग भाषाओं को यह जानने के लिए कुछ की जरूरत है कि बिट्स की व्याख्या कैसे की जाए ताकि वे सार्थक गणना कर सकें।

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


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

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

1
कंप्यूटर बहुत सारी संभावनाओं को समझने में सक्षम है लेकिन यहां तक ​​कि चतुर कंपाइलरों को समझने के लिए संदर्भ की आवश्यकता होती है। यह संख्या 0 या "0" समान नहीं है। या स्ट्रिंग "31 दिसंबर" को "1 मई" से पहले आदेश दिया जाएगा क्योंकि इसे स्ट्रिंग के रूप में माना जाता है लेकिन अगर तारीख के रूप में नहीं माना जाता है। या 5/2 लें। यह एक प्रवेश के रूप में 2 है, लेकिन एक डबल के रूप में 2.5 है। इसके अलावा, प्रकार अवांछित रूपांतरणों के खिलाफ एक सुरक्षा उपाय है। अशक्त, NaN, और गोलाई या ओवरफ्लो भी एक समस्या बन सकती है। मजबूत और सांख्यिकीय रूप से टाइप की गई भाषाओं के कुछ फायदे हैं। उदाहरण के लिए, कंपाइलर रीफैक्टरिंग करते समय आपको समस्याओं का पता लगाने में मदद करता है।
बोरजब

1
@Borjab क्या आपका मतलब है "यह एक पूर्णांक के रूप में 2 है "?
रिचर्ड एवरेट

1
@RichardEverett निश्चित रूप से यह एक चूक थी। धन्यवाद लेकिन देर से इसे संपादित करने के लिए।
बोरजब

23

कंप्यूटर को इस जानकारी की आवश्यकता का उत्तर डेटा रिप्रेजेंटेशन के साथ क्यों लेना है ।

"डेटा प्रकार" का नाम उन नियमों का संदर्भ है जो कंप्यूटर स्टोर की मदद करते हैं और कंप्यूटर की मेमोरी में इसकी कच्ची स्थिति और 1 की कच्ची स्थिति से जानकारी प्राप्त करते हैं।

उदाहरण के लिए, आपके नियमित 8-बिट ASCII वर्ण को कंप्यूटर मेमोरी (या तो RAM या डिस्क) में 01000001(अपरकेस वर्ण "A", ASCII कोड 65) या 00001000(प्रतिशत चिह्न), या 0 के किसी भी संयोजन में संग्रहीत किया जाएगा। 1 उन 8 बिट्स में।

एक और उदाहरण के लिए, कुछ 8-बिट अहस्ताक्षरित पूर्णांक को 00000101(संख्या 5) या 00001000(संख्या 8) के रूप में संग्रहीत किया जा सकता है

ध्यान दें कि 8 और% वर्ण का द्विआधारी प्रतिनिधित्व समान कैसे हो सकता है, लेकिन उनका मतलब अलग-अलग चीजों से है क्योंकि उनके प्रकार अलग हैं।

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

यहां तक ​​कि इन डेटा प्रकारों को यह समझने की ज़रूरत है कि 0 और 1 का क्या मतलब है, इसलिए वे उदाहरण के लिए स्ट्रिंग समवर्ती कार्य कर सकते हैं यदि आप दो वर्णों को "जोड़ने" या पूर्णांक जोड़ने की कोशिश करते हैं, तो दो पूर्णांक जोड़ने का प्रयास करें। ।

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

ध्यान दें कि ये संकेत कैसे आपको एक अनुमान के लिए आगे ले गए कि नंबर एक फोन नंबर था, कैसे संकेत एक कंप्यूटर भाषा का नेतृत्व करने के लिए समान हैं जो मूल्य के प्रकार को कम करने के लिए घोषणा की आवश्यकता नहीं है।


3
यह निकटतम उत्तर है। यह सब स्मृति के साथ करना है। आप प्रकार की घोषणा करते हैं इसलिए संकलक जानता है कि रनटाइम में आवेदन को कितनी मेमोरी का अनुरोध करना चाहिए। यह जानना कि बिट्स की व्याख्या कैसे की जानी चाहिए, माध्यमिक है।
ग्रेग बरगार्ड

@GregBurghardt सच। बिट्स की समझ बनाने के लिए पहले से मौजूद बिट्स को डेटा टाइप के अनुसार बाइनरी में कनवर्ट करने के बाद बिट्स को पहले स्थान पर रखना।
पीयूष कुशवाहा

10

कुछ भाषाओं में, आपको डेटा प्रकार निर्दिष्ट करने की आवश्यकता नहीं है।

ऐसी भाषाएं जो प्रकार के अनुमान का समर्थन करती हैं, आमतौर पर आपके उपयोग से डेटा प्रकार का पता लगा सकती हैं। उदाहरण के लिए,

var name = "Ali"

आंतरिक रूप से एक स्ट्रिंग के रूप में टाइप किया जाता है, क्योंकि मूल्य उद्धरण से घिरा हुआ है।

कुछ भाषाओं को आपको चर घोषित करने की आवश्यकता नहीं है; जब इसे पहली बार उपयोग किया जाता है तो चर बनाया जाता है। हालाँकि, इसे कई महत्वपूर्ण कारणों से अपने चर को विशेष रूप से घोषित करने के लिए सबसे अच्छा अभ्यास माना जाता है; ज्यादातर इसलिए क्योंकि ऐसा करना आपके इरादे को बेहतर करता है।


5
var name = "Ali"शैली आधुनिक के लिए वास्तव में आम है स्थिर टाइप किया भाषाओं। सांख्यिकीय रूप से टाइप की गई भाषाओं में, प्रकार निर्माण पर निर्धारित होता है, लेकिन इसे अभी भी इनिशियलाइज़र द्वारा निर्धारित किया जा सकता है। एक गतिशील रूप से टाइप की गई भाषा की परिभाषा यह है कि प्रकार मानों से जुड़ते हैं, चर नहीं। वैरिएबल पर मान असाइन करना इसलिए वैरिएबल के प्रकार को भी सेट करता है।
MSalters

@MSalters: मैंने शब्दांकन में थोड़ा समायोजन किया।
रॉबर्ट हार्वे

5
यहाँ विडंबना यह है कि इस सटीक वाक्य रचना के साथ C # शामिल है।
डेरेक एलकिंस

1
@MSalters एक वैरिएबल पर मान प्रदान करता है इसलिए वैरिएबल के प्रकार को भी सेट करता है। या यह कि चर में कोई अंतर्निहित प्रकार नहीं है और दुभाषिया चर के मान पर जो भी संचालन करने का प्रयास करेगा। क्या कोई डायनामिक रूप से टाइप की गई भाषाएं हैं, जहां निम्नलिखित (जावास्क्रिप्ट) की तरह कोड की अनुमति नहीं होगी var x = 5; x = "";क्योंकि पहले बयान xमें "नंबर" प्रकार का संबंध होता है x? गतिशील टाइपिंग के साथ संघर्ष । और यदि नहीं, तो चर के साथ जुड़े प्रकार का क्या प्रभाव पड़ता है, मूल्य के प्रकार के संघ से परे?
ज़ेव स्पिट्ज

1
@ZevSpitz: पहली तरह का सिस्टम गतिशील रूप से टाइप नहीं किया गया है, लेकिन टाइप नहीं किया गया है। आपका जावास्क्रिप्ट उदाहरण गतिशील रूप से टाइप नहीं किया गया है, ठीक है क्योंकि नंबर प्रकार बदल नहीं सकता है। एक गतिशील रूप से टाइप की गई भाषा में, एक्स x = "";के प्रकार को स्ट्रिंग में बदल देता है, भले ही वह पहले की संख्या थी।
MSalters

9

क्योंकि वही है जो भाषा डिजाइन निर्दिष्ट करता है। इसलिए आपके प्रश्न का उत्तर देने के लिए, हमें C # और C ++ जैसी भाषाओं में स्पष्ट टाइपिंग के पीछे के इरादे को देखना होगा। (ठीक है, सी # ऐसा करता है क्योंकि सी ++ करता है क्योंकि सी यह करता है, इसलिए हमें इरादे को वापस देखने की जरूरत है)।

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

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

इसके अलावा, कुछ भाषाओं में, स्ट्रिंग इनपुट से एक वर्ग को इनिशियलाइज़ करने के लिए इस छद्मकोड जैसा कुछ लिखना संभव है:

PhoneNumber phoneNumber = "(61) 8 8000 8123";

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

PhoneNumber phoneNumber;
...
phoneNumber = "some value from somewhere";

अंत में, यह भ्रम को दूर करता है ... 123 एक पूर्णांक या एक अहस्ताक्षरित पूर्णांक है? उन्हें बाइट्स की समान संख्या की आवश्यकता है, लेकिन दोनों प्रकार के चर में संग्रहीत अधिकतम मूल्य बहुत अलग है ...

यह ऐसा नहीं है कि स्पष्ट रूप से निहित से बेहतर है - लेकिन भाषा डिजाइन इस प्रकार के विकल्पों पर निर्भर करता है, और सी # निहित टाइपिंग के साथ अलग तरह से काम करेगा। PHP और जावास्क्रिप्ट स्पष्ट टाइपिंग के साथ अलग तरह से काम करेगा।


5

क्योंकि सैम कंपाइलर से ज्यादा स्मार्ट है। उदाहरण के लिए, जब आप कहते हैं कि मुझे फ़ोन नंबर दें, तो आप निर्दिष्ट नहीं करते हैं कि आप देश को उपसर्ग चाहते हैं या क्षेत्र कोड चाहे वह कार्य संख्या हो जहाँ केवल अंतिम 4 अंक आवश्यक हों। इसके अलावा, यदि आप स्थानीय पिज्जा संयुक्त की संख्या के लिए पूछते हैं, तो आप उत्तर "पिज्जा 4u" से निपटने में सक्षम होंगे।

सैम, इसे संदर्भ से आंकते हैं। जबकि संकलक इसे संदर्भ से भी समझ सकते हैं, सैम इस पर बेहतर होगा (और स्पष्टीकरण मांगने के लिए प्रक्रिया को बाधित करने में सक्षम है)।

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

प्रत्येक दृष्टिकोण में इसके फायदे और नुकसान हैं। सामान्य तौर पर, कंपाइलर लेखक नुकसान को कम करने और फायदे को अधिकतम करने की कोशिश करते हैं। यही कारण है कि C # उदाहरण के लिए अनुमति देता है var phoneNumber = GetPhoneNumber();और GetPhoneNumber के हस्ताक्षर से फोननंबर के प्रकार को घटा देगा। इसका मतलब है कि आपको विधि के लिए प्रकार घोषित करना होगा, लेकिन परिणाम प्राप्त करने वाले चर नहीं। दूसरी ओर, जावास्क्रिप्ट के लिए विभिन्न प्रकार के संकेत / लागू करने वाली परियोजनाएं हैं। सब कुछ एक व्यापार है।


3

यह डेटा संग्रहीत करने के तरीके की बात है। सैम के साथ आपकी बातचीत बेहतर तुलना करेगी यदि आप पूछ रहे हैं तो आप इसे लिख सकते हैं, लेकिन केवल आठ अक्षरों का मूल्य था।

"सैम, मुझे फोननंबर दे दो।"

"5555555555"

"ओह नहीं मैं कागज से बाहर हूँ। यदि केवल मैं समय से पहले ही जानता था कि मैं कितना डेटा मांग रहा था तो मैं बेहतर तैयारी कर सकता था!"

इसलिए इसके बजाय, अधिकांश भाषाएं आपको एक प्रकार का घोषित करती हैं, इसलिए यह समय से पहले पता चलेगा और तैयार करेगा:

"सैम, कब तक एक टेलीफोन नंबर है?"

"दस अक्षर।"

"ठीक है, फिर मुझे कागज का एक बड़ा टुकड़ा दे दो। अब मुझे फोननंबर दे दो।"

"5555555555"

"समझ गया! धन्यवाद सैम!"

जब आप डेटा को संग्रहित करने वाले वास्तविक मूलभूत तरीकों को देखते हैं तो यह और भी अधिक बालों वाला हो जाता है। यदि आप मेरे जैसे हैं, तो आपके पास विविध नोटों के साथ एक नोटबुक है, संख्याएँ केवल नीचे लिखी हुई हैं, कोई संदर्भ या किसी भी चीज़ के लिए लेबलिंग नहीं है, और आपको कोई सुराग नहीं है कि तीन दिनों के बाद इसका क्या मतलब है। यह कई बार कंप्यूटर के लिए भी एक समस्या है। बहुत सी भाषाओं में "int" प्रकार (int, long, short, byte) और "float" (फ्लोट, डबल) प्रकार होते हैं। ऐसा क्यों जरूरी है?

खैर पहले देखते हैं कि एक पूर्णांक कैसे संग्रहीत किया जाता है, और आम तौर पर कंप्यूटर के भीतर प्रतिनिधित्व किया जाता है। आप शायद जानते हैं कि बुनियादी स्तर पर, यह सभी द्विआधारी (1 और 0) है। बाइनरी वास्तव में एक संख्या प्रणाली है जो हमारे दशमलव संख्या प्रणाली की तरह ही काम करती है। दशमलव में, आप 0 से 9 तक गिनती करते हैं (अनंत निहित अग्रणी शून्य जो आप नहीं लिखते हैं) के साथ, फिर आप वापस 0 पर रोल करते हैं और अगले अंक को बढ़ाते हैं ताकि आपके पास 10. हो। आप 19 से 20 तक रोल करने तक दोहराते हैं, जब तक आप 99 से 100 तक रोल नहीं करते तब तक दोहराएं।

बाइनरी अलग नहीं है, सिवाय इसके कि 0 से 9 के बजाय, आप 0 से 1. 0, 1, 10, 11, 100, 101, 110, 111, 1000 तक गिनती करते हैं। इसलिए जब आप 9 में टाइप करते हैं, तो मेमोरी बाइनरी में दर्ज होती है। as 1001. यह एक वास्तविक संख्या है। यह जोड़ा जा सकता है, घटाया, गुणा, आदि, बिल्कुल उस रूप में। 10 + 1 = 11. 10 + 10 = 100 (1 से 0 पर रोल करें और 1 ले जाएं)। 11 x 10 = 110 (और समतुल्य, 11 + 11 = 110)।

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

आप इसे एनकोड करें। आम तौर पर, सीपीयू या सॉफ्टवेयर की वास्तुकला यह निर्धारित करेगी कि यह कैसे किया जाता है, लेकिन रजिस्टर के पहले बिट में एक चिह्न (+ या -, आमतौर पर 1 नकारात्मक है) संग्रहीत करने के लिए एक सामान्य तरीका एक मंटिसा (आपका नंबर स्थानांतरित) है हालाँकि, कई बार बिट्स की निम्न X संख्या के लिए दशमलव से छुटकारा पाना आवश्यक होता है, और शेष के लिए एक घातांक (जितनी बार आपको इसे शिफ्ट करना होता है)। यह वैज्ञानिक संकेतन के समान है।

टाइपिंग कंपाइलर को यह जानने की अनुमति देता है कि वह क्या देख रहा है। कल्पना कीजिए कि आपने रजिस्टर १ में १.३ का मान जमा किया है। हम यहाँ अपनी स्वयं की फैंसी एन्कोडिंग योजना के साथ आएंगे, साइन के लिए १ बिट, मंटिसा के लिए ४, एक्सप्रेटर के लिए ३ (साइन के लिए १ बिट, परिमाण के लिए २)। यह एक सकारात्मक संख्या है, इसलिए संकेत सकारात्मक है (0)। हमारा मंटिसा 13 (1101) होगा और हमारा प्रतिपादक -1 (101 नकारात्मक के लिए 1, 01 = 1) होगा। इसलिए हम रजिस्टर में 01101101 स्टोर करते हैं। अब हमने इस वेरिएबल को टाइप नहीं किया है, इसलिए जब रनटाइम इसका उपयोग करने के लिए जाता है, तो यह कहता है "निश्चित रूप से, यह एक पूर्णांक क्यों है" इसलिए नहीं जब यह मूल्य को देखता है तो हम 109 (64 +) देखते हैं 32 + 8 + 4 + 1), जो स्पष्ट रूप से सही नहीं है।

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

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


2

प्रोग्रामिंग भाषाएं हैं जहां आपको अपने चर के लिए डेटा प्रकार घोषित करने की आवश्यकता नहीं है। यहां तक ​​कि प्रोग्रामिंग भाषाएं भी हैं जहां आपको हाथ से पहले चर घोषित करने की आवश्यकता नहीं है; आप बस उन्हें तुरंत उपयोग कर सकते हैं ।

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

इसलिए उन्होंने इसे बनाया ताकि आपको उन चर नामों की घोषणा करनी पड़े जिन्हें आप पहले इस्तेमाल कर रहे हैं। और अब जब आप एक नाम गलत लिखते हैं, तो आप एक संकलन समय त्रुटि है, जो तुरंत आपको बताता है कि मिल बिल्कुल जहां बग, है से पहले अपने कार्यक्रम भी चलाता है। क्या यह इतना आसान नहीं है?

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

ये सभी संकलक को बताने के लिए विशेषताएं हैं कि आप क्या करने का इरादा कर रहे थे , इसलिए यह जांच कर सकता है कि आपने वास्तव में क्या किया और सुनिश्चित करें कि यह समझ में आता है। यह कंपाइलर के लिए स्वचालित रूप से आपके लिए बग का पता लगाना संभव बनाता है , जो एक बड़ी डील है।

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


1
C ++ में आप "auto x = 1" डाल सकते हैं और यह जानता है कि यह एक int है। ऑटो वाई = 1.2; ऑटो z = 'Z'; आदि
क्वेंटिनुक

@ क्वेंटिनुक सी # में, आप var x=1समान परिणामों के साथ रख सकते हैं । लेकिन वह कुछ भी नहीं है; हास्केल में, आप अपने पूरे कार्यक्रम को बिना किसी प्रकार के हस्ताक्षरों के साथ लिख सकते हैं, फिर भी यह सब वैधानिक रूप से टाइप किया जाता है, और यदि आप कोई गलती करते हैं, तो भी आपको त्रुटि मिलती है ... (बिल्कुल मुख्यधारा नहीं है।)
मैथमेटिकलऑर्चिड

@QuentinUK लेकिन अगर आप लिखते हैं कि for (auto i=0; i<SomeStdVector.size(); ++i)आपका लिंटर शिकायत करने जा रहा है क्योंकि यह एक हस्ताक्षरित प्रकार को काटता है और आप इसे एक अहस्ताक्षरित प्रकार से तुलना करने के लिए आगे बढ़ते हैं। आपको लिखना होगा auto i=0ul(प्रकार की जानकारी को फिर से स्पष्ट रूप से डालते हुए, इसलिए बस size_t i=0पहले स्थान पर लिखना चाहिए )।
dmckee

1

अगर मैं सामान्य अंग्रेजी भाषा का उपयोग कर रहा हूं तो मुझे PhoneNumber को उपयोग करने के लिए int घोषित करने की आवश्यकता नहीं है। उदाहरण के लिए अगर मैं अपने दोस्त सैम से कहता हूं कि वह मुझे अपना फोन नंबर दे, तो मैं कहता हूं:

"सैम मुझे फोननंबर दे दो"

मैं नहीं कहूंगा>

"चार (20) सैम मुझे int फोन दे"

हमें डेटा प्रकार आखिर क्यों निर्दिष्ट करना है?

MathOverflow या Theoretical Computer Science पर पॉप करें और यह जानने के लिए कुछ समय के लिए पढ़ें कि मनुष्य कैसे एक दूसरे के साथ एक दूसरे के साथ संवाद करते हैं जब वे यह सुनिश्चित करना चाहते हैं कि गलतफहमी की कोई संभावना नहीं है। या कुछ परिपक्व प्रोग्रामिंग भाषा के लिए मानक पढ़ें।

आप पाएंगे कि किसी शब्द को किस प्रकार के मानों को परिभाषित करना वास्तव में मानव-मानव के लिए सटीक संचार अभ्यास का हिस्सा है।

आपने जो देखा है वह यह है कि दिन-प्रतिदिन की बातचीत काफी नियमित होती है और मानव काफी गलत सहनशील होते हैं, इसलिए फोन नंबर के बारे में गलतफहमी आमतौर पर प्रतिभागियों के साझा ज्ञान से बच जाती है।

लेकिन क्या आपने कभी किसी दूसरे देश में किसी के लिए फोन नंबर लेने की कोशिश की है? क्या उन्होंने आपको स्पष्ट रूप से बताया कि अंतर्राष्ट्रीय संबोधन के लिए शून्य को कितनी बार धकेलना है? क्या उन्होंने आपको अपना देश कोड बताया? क्या आपने इसे ऐसे पहचाना? आपने कितने अंकों की उम्मीद की थी? कितने मिले? क्या आप जानते हैं कि अंकों का समूह कैसे बनाया जाता है? या भले ही समूह का महत्व हो?

अचानक समस्या बहुत कठिन है और आपने संभवतः स्पष्ट रूप से जांचने के लिए बहुत अधिक ध्यान रखा है कि प्राप्त संख्या को उस तरीके से समझा जाए जिस तरह से प्रेषक का मतलब था।


0

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

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


0

कई प्रारंभिक प्रोग्रामिंग भाषाओं (विशेष रूप से फोरट्रान) को आपको उपयोग करने से पहले चर घोषित करने की आवश्यकता नहीं थी।

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

longVariableName = 1

// ...

longVaraibleName = longvariableName + anotherLongVariableName

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

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


0

जब आप किसी चर को घोषित करते हैं तो मेमोरी में कुछ स्थान आवंटित किया जाता है, लेकिन मशीन (इस मामले में कंप्यूटर) को पहले से ही पता नहीं है कि उस चर के लिए कितना स्थान आवंटित किया जाना है।

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


इससे पहले किए गए 11 अंकों से अधिक कुछ भी नहीं दिया गया था और पहले ही 11 उत्तरों में समझाया गया था
gnat

1
Gnat आपको एक बार फिर से सभी उत्तरों को अच्छी तरह से पढ़ना चाहिए और देखना चाहिए कि मैंने इस प्रश्न का उत्तर बहुत सरल तरीके से देने की कोशिश की है जिसे कोई भी आसानी से समझ सकता है।
अतुल १47०२

मैंने अभी हाल ही में तीन सबसे हालिया उत्तरों की फिर से जाँच की है जो एक घंटे से पहले पोस्ट किए गए थे और तीनों एक ही बिंदु बना रहे हैं और मेरे पढ़ने के अनुसार इसे यहाँ की तुलना में सरल तरीके से समझाते हैं
gnat

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

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