8

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

संपादित करें: हाँ, कंप्यूटर पर सबकुछ शुद्ध बाइनरी है। मैं पूछ रहा हूं कि क्या प्रोसेसर सीधे कंपाइलर द्वारा आउटपुट की गई फाइल का अर्थ देता है या ओएस पहले इसे संसाधित करता है?

+1

क्या है बाइनरी "सही" या "शुद्ध"? –

उत्तर

16

एक संकलित प्रोग्राम में आमतौर पर एक शीर्षलेख होता है जिसके बाद वास्तविक CPU निर्देश (जिसे आप "बाइनरी" कह सकते हैं) + कई अन्य डेटा।

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

शीर्षलेख में जानकारी के कई अन्य बिट्स भी शामिल हैं जहां वास्तविक CPU निर्देश exeutable फ़ाइल में स्थित हैं, जहां डेटा सेगमेंट (टेक्स्ट, स्ट्रिंग्स, ग्राफिक्स) स्थित हैं और आगे।

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

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

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

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

+2

+1 यह बेहतर नहीं कह सकता था कि यह –

0

आवेदन इस तरह आम तौर पर मशीन कोड निर्देश सीधे प्रोसेसर द्वारा निष्पादित में संकलित कर रहे हैं:

http://en.wikipedia.org/wiki/Machine_code

86 एएसएम सबसे आम में से एक है। इसके बारे में सोचें क्योंकि आपका कोड बहुत कम स्तर की भाषा में संकलित किया जा रहा है। यह सिर्फ 1 और 0 के ऊपर एक परत है जो सीधे धातु के साथ भेजा जा रहा है यदि आपका मतलब है, और ओएस अभी भी निष्पादित किए गए नियंत्रण पर नियंत्रण रखता है। लेकिन हाँ, दिन के अंत में यह सब बाइनरी तक उबाल जाता है - एक पीसी पर सब कुछ करेगा!

2

आपका क्या मतलब है "असली बाइनरी"? कंप्यूटर में सभी डेटा 1s और 0s है, हालांकि CPU आंतरिक द्वार और ट्रांजिस्टर के लेआउट के अनुसार opcodes "व्याख्या करता है"। बाइनरी भाषा का कोई प्लैटोनिक आदर्श नहीं है।

3

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

हालांकि वे शुद्ध बाइनरी हैं। कंप्यूटर पर सबकुछ है।

संपादित

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

0

यह भी मानना ​​चाहिए कि व्याख्या की गई भाषाओं में वर्चुअल मशीन कोड है। (यह अभी भी बाइनरी में है।) वे वर्चुअल मशीन, सॉफ्टवेयर की एक श्रेणी द्वारा मशीन कोड में बदल जाते हैं। (इसके अलावा बाइनरी।)

0

मुझे आश्चर्य है कि किसी ने लिंकर की अवधारणा का उल्लेख क्यों नहीं किया।

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

+0

http://en.wikipedia.org/wiki/Linker_(computing) –

संबंधित मुद्दे