2016-02-24 5 views
6

जैसा कि मैं इसे समझता हूं, सी कोड किसी की मशीन पर मशीन (असेंबली) कोड में संकलित किया जाता है, और यह एक exe फ़ाइल बन जाता है जिसे कई अलग-अलग प्रोसेसर (मशीनों) पर चलाया जा सकता है। लेकिन चूंकि विभिन्न प्रोसेसर के पास अपना अनूठा असेंबली कोड है, तो यह कोड कैसे चला सकता है? संकलित एक्सई केवल एक प्रकार के प्रोसेसर पर चलाने में सक्षम नहीं होगा?विभिन्न प्रोसेसर पर सी कोड कैसे चलाया जा सकता है?

+5

कई अलग प्रोसेसर मॉडल एक ही "परिवार" का हिस्सा हो सकते हैं और उसी मशीन भाषा को साझा कर सकते हैं। –

+7

यह एक तरह का पेट्रोल है जिस तरह से कई पेट्रोल में इस्तेमाल किया जा सकता है, लेकिन सभी कार नहीं, भले ही प्रत्येक कार का अपना इंजन हो। –

+0

लेकिन एक एक्सई फाइल सभी विंडोज मशीनों पर नहीं चल सकती है, भले ही उनके पास एक पूरी तरह से अलग प्रोसेसर हो। – Melkor

उत्तर

14

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

सभी उन विकल्पों जिस पर कोड निष्पादित किया जा सकता लक्ष्य मंच की सीमा।

  • अनुदेश मोटे तौर पर सेट सीपीयू के प्रकार पर निर्भर: 86 ("आईबीएम संगत"), पॉवर, एआरएम, MIPS, DEC अल्फा, मोटोरोला 68k, ... प्रत्येक सीपीयू परिवार के भीतर, वहाँ कई हैं उप-विशेषताओं और पीढ़ियों से चुनने के लिए (उदाहरण के लिए x86 के लिए, i386, एसएसई, एवीएक्स, ...) हैं। नए सीपीयू पुराने पीढ़ियों तक सीमित कोड निष्पादित करने में सक्षम हो सकते हैं, इसलिए एक सामान्य सबसेट हो सकता है।

  • x86 पर प्रोसेसर मोड पर्यावरण पर निर्भर करता है: एमएस-डॉस प्रोग्राम के लिए वास्तविक मोड और बूट-अप, संरक्षित मोड, विभिन्न एड्रेसिंग मोड पर चलने वाली कुछ भी कुछ स्थितियों (अवास्तविक मोड) में उपलब्ध हो सकता है ...

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

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

+2

इसके अलावा, (विशेष रूप से) पीई फ़ाइल प्रारूप में एक फ़ील्ड है जो स्पष्ट रूप से ** कहता है ** यह किस सीपीयू के लिए है: "मशीन 'सीपीयू जो इस फ़ाइल के लिए है। निम्नलिखित सीपीयू आईडी परिभाषित हैं: .. "(https://msdn.microsoft.com/en-us/library/ms809762.aspx)। – usr2564301

+0

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

+0

@EliasVanOotegem: हाँ। उदाहरण के लिए शराब विंडोज सिस्टम कॉल को रोकता है और लिनक्स पर प्रदान करता है और उचित विंडोज लाइब्रेरीज़ (लिनक्स के लिए लागू) के साथ जहाजों को प्रदान करता है, ताकि आप लिनक्स पर विभिन्न प्रकार के विंडोज प्रोग्राम निष्पादित कर सकें। (मुझे कल्पना है कि यह मैकोज़ और बीएसडी पर भी ऐसा ही कर सकता है?) –

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