आपके द्वारा कई टिप्पणियों में पोस्ट किए गए प्रश्न को संबोधित करने के लिए (जो मुझे लगता है कि आपको अपनी पोस्ट में संपादित करना चाहिए):
मुझे समझ में नहीं आता है कि कंप्यूटर को कैसे पता चलता है जब यह एक चर या मूल्य से पता करता है जैसे कि 10001 अगर कोई इंट या चार है। कल्पना कीजिए कि मैं anyprog.exe नामक एक कार्यक्रम पर क्लिक करता हूं। तुरंत कोड निष्पादित करना शुरू कर देता है। क्या इस exe फ़ाइल में चर या चार के रूप में संग्रहीत होने के बारे में जानकारी शामिल है?
तो इसमें कुछ कोड डाल देता है। मान लीजिए आप लिखते हैं:
int x = 4;
और मान लें कि यह रैम में संग्रहीत हो जाता है:
0x00010004: 0x00000004
पहला भाग पते का, दूसरा भाग मान का। जब आपका प्रोग्राम (जो मशीन कोड के रूप में निष्पादित होता है) चलता है, तो यह सब देखता 0x00010004
है कि यह मूल्य है 0x000000004
। यह इस डेटा के प्रकार को 'नहीं' जानता है, और यह नहीं जानता कि इसका उपयोग कैसे किया जाता है।
तो, आपका कार्यक्रम सही काम करने के लिए कैसे पता लगाता है? इस कोड पर विचार करें:
int x = 4;
x = x + 5;
हमारे यहां एक रीड एंड राइट है। जब आपका प्रोग्राम x
मेमोरी से पढ़ता है, तो यह 0x00000004
वहां मिल जाता है। और आपका प्रोग्राम 0x00000005
इसे जोड़ना जानता है । और जिस कारण से आपका प्रोग्राम 'जानता है' यह एक वैध ऑपरेशन है, ऐसा इसलिए है क्योंकि कंपाइलर सुनिश्चित करता है कि ऑपरेशन टाइप-सेफ्टी के माध्यम से मान्य है। आपके कंपाइलर ने पहले ही सत्यापित कर दिया है कि आप जोड़ सकते हैं 4
और 5
साथ में। इसलिए जब आपका बाइनरी कोड चलता है (निर्गमन), तो उसे वह सत्यापन करने की आवश्यकता नहीं है। यह बस प्रत्येक चरण को आँख बंद करके निष्पादित करता है, यह मानते हुए कि सब कुछ ठीक है (बुरी चीजें तब होती हैं जब वे वास्तव में होते हैं, ठीक नहीं)।
इसके बारे में सोचने का एक और तरीका इस तरह है। मैं आपको इसकी जानकारी देता हूं:
0x00000004: 0x12345678
पहले जैसा समान प्रारूप - बाईं ओर पता, दाईं ओर मान। मान किस प्रकार का है? इस बिंदु पर, आप बस उस मूल्य के बारे में अधिक जानकारी जानते हैं जैसा कि आपका कंप्यूटर कोड निष्पादित करते समय करता है। अगर मैंने आपसे उस मूल्य में 12743 जोड़ने के लिए कहा, तो आप इसे कर सकते हैं। आपको इस बात का कोई अंदाजा नहीं है कि उस ऑपरेशन के नतीजे पूरे सिस्टम पर होंगे, लेकिन दो नंबर जोड़ना एक ऐसी चीज है जो आप वास्तव में अच्छा है, इसलिए आप इसे कर सकते हैं। क्या इससे मूल्य बनता है int
? जरूरी नहीं है - आप सभी देखते हैं दो 32-बिट मान और इसके अतिरिक्त ऑपरेटर है।
शायद कुछ भ्रम फिर से डेटा वापस मिल रहा है। अगर हमारे पास है:
char A = 'a';
कंप्यूटर a
को कंसोल में कैसे पता चलता है? वैसे, इसके बहुत सारे कदम हैं। सबसे पहले A
स्मृति में s स्थान पर जाना है और इसे पढ़ना है:
0x00000004: 0x00000061
a
ASCII में हेक्स मूल्य 0x61 है, इसलिए उपरोक्त कुछ ऐसा हो सकता है जिसे आप मेमोरी में देखेंगे। तो अब हमारे मशीन कोड को पूर्णांक मान पता है। इसे प्रदर्शित करने के लिए पूर्णांक मान को वर्ण में बदलना कैसे जानता है? सीधे शब्दों में कहें, संकलक ने उस संक्रमण को बनाने के लिए सभी आवश्यक चरणों में रखना सुनिश्चित किया। लेकिन आपका कंप्यूटर खुद (या प्रोग्राम / एक्सई) को पता नहीं है कि उस डेटा का प्रकार क्या है। वह 32-बिट मान कुछ भी हो सकता है - int
, का char
आधा double
, एक सूचक, एक सरणी का हिस्सा, एक का string
हिस्सा, एक अनुदेश का हिस्सा, आदि।
आपके कंप्यूटर (ऑपरेटिंग सिस्टम) के साथ आपका प्रोग्राम (उदाहरण) एक संक्षिप्त बातचीत हो सकती है।
कार्यक्रम: मैं शुरू करना चाहता हूं। मुझे 20 एमबी मेमोरी की आवश्यकता है।
ऑपरेटिंग सिस्टम: 20 मुक्त एमबी मेमोरी पाता है जो उपयोग में नहीं है और उन्हें सौंपता है
(महत्वपूर्ण नोट यह है कि यह किसी भी 20 मुक्त एमबी मेमोरी को वापस कर सकता है , उन्हें भी सन्निहित होने की आवश्यकता नहीं है। इस बिंदु पर, प्रोग्राम अब ओएस के साथ बात किए बिना मेमोरी के भीतर काम कर सकता है)
कार्यक्रम: मैं मान रहा हूँ कि स्मृति में पहला स्थान 32-बिट पूर्णांक चर है x
।
(संकलक यह सुनिश्चित करता है कि अन्य चर तक पहुंच कभी भी स्मृति में इस स्थान को नहीं छूएगा। सिस्टम पर ऐसा कुछ भी नहीं है जो कहता है कि पहला बाइट चर है x
, या वह चर x
एक पूर्णांक है। एक सादृश्य: आपके पास एक बैग है। आप लोगों को बताते हैं। आप केवल इस बैग में पीले रंग की गेंदें डालेंगे। जब कोई बाद में किसी चीज को बैग से बाहर निकालेगा, तो यह चौंकाने वाला होगा कि वे कुछ नीले या घन को बाहर निकाल देंगे - कुछ गलत हो गया है। कंप्यूटर के लिए भी यही होता है: आपका प्रोग्राम अब मान रहा है कि पहला मेमोरी स्पॉट वेरिएबल x है और यह एक पूर्णांक है। यदि मेमोरी के इस बाइट पर कुछ और लिखा जाता है या इसे कुछ और माना जाता है - कुछ भयानक हो गया है। कंपाइलर इस तरह की चीजों को सुनिश्चित करता है। 'ऐसा नहीं होगा)
कार्यक्रम: मैं अब 2
पहले चार बाइट्स पर लिखूंगा जहां मैं मान रहा हूं x
।
कार्यक्रम: मैं 5 को जोड़ना चाहता हूं x
।
एक अस्थायी रजिस्टर में X का मान पढ़ता है
अस्थायी रजिस्टर में 5 जोड़ता है
अस्थायी रजिस्टर के मूल्य को पहले बाइट में वापस रखता है, जिसे अभी भी माना जाता है x
।
कार्यक्रम: मैं मान रहा हूँ कि अगले उपलब्ध बाइट चार चर है y
।
कार्यक्रम: मैं a
चर को लिखूंगा y
।
कार्यक्रम: मैं की सामग्री प्रदर्शित करना चाहते हैं y
दूसरे मेमोरी स्पॉट में मान पढ़ता है
बाइट से चरित्र में बदलने के लिए लाइब्रेरी का उपयोग करता है
कंसोल स्क्रीन को बदलने के लिए ग्राफिक्स पुस्तकालयों का उपयोग करता है (पिक्सेल को काले से सफेद तक सेट करना, एक लाइन स्क्रॉल करना, आदि)
(और यह यहाँ से चला जाता है)
क्या आप शायद ऊपर लटका हुआ है - क्या होता है जब स्मृति में पहला स्थान अब नहीं है x
? या दूसरा अब नहीं है y
? जब कोई पढ़ता है तो क्या होता है x
एक के रूप में char
या y
एक सूचक के रूप में? संक्षेप में, बुरी चीजें होती हैं। इनमें से कुछ चीजों में अच्छी तरह से परिभाषित व्यवहार होता है, और कुछ में अपरिभाषित व्यवहार होता है। अपरिभाषित व्यवहार बिल्कुल यही है कि - कुछ भी हो सकता है, कुछ भी नहीं से, कार्यक्रम या ऑपरेटिंग सिस्टम को क्रैश करने के लिए। यहां तक कि अच्छी तरह से परिभाषित व्यवहार दुर्भावनापूर्ण हो सकता है। यदि मैं x
अपने प्रोग्राम के लिए एक पॉइंटर को बदल सकता हूं, और अपने प्रोग्राम को पॉइंटर के रूप में उपयोग करने के लिए प्राप्त कर सकता हूं, तो मैं आपके प्रोग्राम को मेरे प्रोग्राम को निष्पादित करना शुरू कर सकता हूं - जो कि हैकर्स करते हैं। संकलक यह सुनिश्चित करने में मदद करने के लिए है कि हम int x
एक के रूप में उपयोग नहीं करते हैंstring
, और उस प्रकृति की बातें। मशीन कोड स्वयं प्रकारों से अवगत नहीं है, और यह केवल वही करेगा जो निर्देश इसे करने के लिए कहता है। रन-टाइम पर खोजी गई बड़ी मात्रा में जानकारी भी होती है: मेमोरी के कौन से बाइट्स प्रोग्राम को उपयोग करने की अनुमति है? है x
पहली बाइट या 12 वीं में शुरू?
लेकिन आप कल्पना कर सकते हैं कि वास्तव में इस तरह के कार्यक्रम (और आप असेंबली भाषा में लिख सकते हैं) कितना भयानक होगा। आप अपने वेरिएबल्स को 'घोषित' करके शुरू करते हैं - आप खुद को बताते हैं कि बाइट 1 है x
, बाइट 2 है y
, और जैसा कि आप कोड की प्रत्येक पंक्ति लिखते हैं, लोडिंग और स्टोरिंग रजिस्टर, आपको (एक मानव के रूप में) यह याद रखना होगा कि कौन सा है x
और कौन सा एक है y
, क्योंकि सिस्टम का कोई पता नहीं है। और आपको (एक मानव के रूप में) याद रखना होगा कि कौन से प्रकार x
और y
हैं, क्योंकि फिर से - सिस्टम का कोई पता नहीं है।