देशी कोड, मशीन कोड और असेंबली कोड में क्या अंतर है?


106

मैं .NET भाषाओं के संदर्भ में मशीन कोड और मूल कोड के बारे में उलझन में हूं।

उनके बीच क्या अंतर है? क्या यह वही है?


3
इस प्रश्न के बारे में मेरा एक प्रश्न है। क्या यह प्रश्न StackOverflow की आवश्यकता के अंतर्गत आता है? afaik यह नहीं है, लेकिन एक ही समय में इस तरह का सवाल बहुत उपयोगी / जानकारीपूर्ण है। इस प्रकार के प्रश्न को मानने की अनुमति नहीं है, जहाँ हमें इस प्रकार के प्रश्न पूछने चाहिए यदि यहाँ नहीं हैं?
यूसुफ आजाद

इन्हें भी देखें: stackoverflow.com/questions/334326/…
T.Todua

जवाबों:


150

शब्द वास्तव में थोड़ा भ्रमित कर रहे हैं, क्योंकि वे कभी-कभी असंगत रूप से उपयोग किए जाते हैं।

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

मूल कोड: यह शब्द कभी-कभी उन स्थानों में उपयोग किया जाता है जहां मशीन कोड (ऊपर देखें) का मतलब है। हालांकि, इसका उपयोग कभी-कभी अनवांटेड कोड (नीचे देखें) से भी किया जाता है ।

अनमैन्डेड कोड और प्रबंधित कोड: अनमैन्डेड कोड एक प्रोग्रामिंग लैंग्वेज जैसे कि C या C ++ में लिखे गए कोड को संदर्भित करता है, जिसे सीधे मशीन कोड में संकलित किया जाता है । यह प्रबंधित कोड के साथ विरोधाभास करता है, जिसे C #, VB.NET, Java, या इसी तरह लिखा जाता है, और एक आभासी वातावरण (जैसे .NET या JavaVM) में निष्पादित किया जाता है, जो सॉफ्टवेयर में एक प्रोसेसर को "अनुकरण" करता है। मुख्य अंतर यह है कि प्रबंधित कोड कचरा संग्रह को नियोजित करके और वस्तुओं को अपारदर्शी के संदर्भ में रखकर आपके लिए संसाधनों (अधिकतर मेमोरी आवंटन) का प्रबंधन करता है। अप्रबंधित कोडकोड की तरह है जो आपको मैन्युअल रूप से आवंटित करने और डी-आवंटित करने की आवश्यकता होती है, कभी-कभी मेमोरी लीक (जब आप डी-आवंटित करना भूल जाते हैं) और कभी-कभी विभाजन दोष (जब आप बहुत जल्द ही आवंटित करते हैं)। अप्रबंधित का अर्थ भी आमतौर पर होता है कि सामान्य त्रुटियों के लिए कोई रन-टाइम चेक नहीं होते हैं जैसे कि नल-पॉइंटर डेरेफेरेंसिंग या सरणी सीमा अतिप्रवाह।

सख्ती से बोलना, सबसे गतिशील रूप से टाइप की जाने वाली भाषाएं - जैसे पर्ल, पायथन, पीएचपी और रूबी - भी प्रबंधित कोड हैं । हालांकि, उन्हें आमतौर पर इस तरह के रूप में वर्णित नहीं किया जाता है, जो दर्शाता है कि प्रबंधित कोड वास्तव में वास्तव में बड़े, गंभीर, वाणिज्यिक प्रोग्रामिंग वातावरण (.NET और जावा) के लिए मार्केटिंग शब्द है।

असेंबली कोड: यह शब्द आम तौर पर उस तरह के सोर्स कोड लोगों को संदर्भित करता है जब वे वास्तव में बाइट-कोड लिखना चाहते हैं। एक कोडांतरक एक प्रोग्राम है जो इस स्रोत कोड को वास्तविक बाइट-कोड में बदल देता है। यह संकलक नहीं है क्योंकि परिवर्तन 1-टू -1 है। हालाँकि, यह शब्द अस्पष्ट है कि किस तरह के बाइट-कोड का उपयोग किया जाता है: इसे प्रबंधित या अप्रबंधित किया जा सकता है। यदि यह अप्रबंधित है, तो परिणामी बाइट-कोड मशीन कोड है । यदि इसे प्रबंधित किया जाता है, तो यह .NET वातावरण जैसे वर्चुअल वातावरण द्वारा उपयोग किए जाने वाले बाइट-कोड के परिणामस्वरूप होता है। प्रबंधित कोड (जैसे C #, Java) को इस विशेष बाइट-कोड भाषा में संकलित किया गया है, जिसे .NET के मामले में कॉमन इंटरमीडिएट भाषा (CIL) कहा जाता है और जावा में जावा बाइट-कोड कहा जाता है। आम प्रोग्रामर को इस कोड को एक्सेस करने या सीधे इस भाषा में लिखने के लिए आमतौर पर बहुत कम आवश्यकता होती है, लेकिन जब लोग ऐसा करते हैं, तो वे अक्सर इसे असेंबली कोड के रूप में संदर्भित करते हैं क्योंकि वे एक कोडांतरक का उपयोग करके इसे बाइट-कोड में बदल देते हैं।


C ++ मशीन कोड के लिए संकलित कर सकता है, लेकिन यह अक्सर अन्य स्वरूपों जैसे संकलित होता है जो एक ऑपरेटिंग सिस्टम के साथ चलेगा।
गॉर्डन गुस्ताफ़सन

ऐसी भाषाएं हैं जो कचरा संग्रह और अपारदर्शी संदर्भों का समर्थन करती हैं जो आमतौर पर मशीन कोड के लिए संकलित होती हैं। कॉमन लिस्प के अधिकांश गंभीर कार्यान्वयन यही करते हैं। आप जो कहते हैं वह Microsoft समर्थित भाषाओं के लिए सही हो सकता है, लेकिन विजुअल स्टूडियो द्वारा समर्थित भाषाओं की तुलना में अधिक संकलित भाषाएं हैं।
डेविड थॉर्नले

3
@CrazyJugglerDrummer: C ++ कंपाइलर द्वारा निर्मित EXE फाइलों में निहित कोड अभी भी मशीन कोड है। @ डेविड थॉर्नले: मैंने उन लोगों की तुलना में काफी अधिक भाषाओं का उल्लेख किया है, लेकिन मैं हर अस्पष्ट विषमता का उल्लेख करके मामलों को जटिल नहीं करना चाहता था।
टिम्मि

कुछ संकलक, कई, वास्तव में C / C ++ या अन्य भाषाओं से असेंबली भाषा में संकलित करेंगे, फिर असेंबलर को कॉल करेंगे और असेंबलर इसे ऑब्जेक्ट फ़ाइलों में बदल देता है जो ज्यादातर मशीन कोड होते हैं, लेकिन प्रोसेसर पर मेमोरी में जाने से पहले कुछ टच की आवश्यकता होती है लिंकर प्रोग्राम के मशीन कोड संस्करण में सभी को जोड़ता है। बिंदु C / C ++, आदि अक्सर मशीन कोड को सीधे संकलित नहीं करता है जो उपयोगकर्ता के लिए अदृश्य होता है जो रास्ते में दो या तीन चरण करता है। उदाहरण के लिए TCC इसका अपवाद है, यह सीधे मशीन कोड पर जाता है।
old_timer

यह नाइटपैकिंग की तरह लगता है, लेकिन सभी असेंबलर 1-1 को ओपकोड में अनुवाद नहीं करते हैं। वास्तव में, कई आधुनिक असेंबलर कक्षाओं की तरह अमूर्त निर्माण का समर्थन करते हैं। उदाहरण: TASM, बोरलैंड का असेंबलर। en.wikipedia.org/wiki/TASM
प्राइम

45

जब आप डीबग + विंडोज + डिस्सैस्प का उपयोग करते हैं तो सी # प्रोग्राम डीबगिंग करते समय आप इन शब्दों के लिए एक अच्छा मार्गदर्शक है। यहाँ इसका एक एनोटेट संस्करण है, जब मैं JL ऑप्टिमाइज़ेशन के साथ रिलीज़ कॉन्फ़िगरेशन में C # में लिखा गया 'हैलो वर्ल्ड' प्रोग्राम संकलित करता हूँ:

        static void Main(string[] args) {
            Console.WriteLine("Hello world");
00000000 55                push        ebp                           ; save stack frame pointer
00000001 8B EC             mov         ebp,esp                       ; setup current frame
00000003 E8 30 BE 03 6F    call        6F03BE38                      ; Console.Out property getter
00000008 8B C8             mov         ecx,eax                       ; setup "this"
0000000a 8B 15 88 20 BD 02 mov         edx,dword ptr ds:[02BD2088h]  ; arg = "Hello world"
00000010 8B 01             mov         eax,dword ptr [ecx]           ; TextWriter reference
00000012 FF 90 D8 00 00 00 call        dword ptr [eax+000000D8h]     ; TextWriter.WriteLine()
00000018 5D                pop         ebp                           ; restore stack frame pointer
        }
00000019 C3                ret                                       ; done, return

विंडो को राइट-क्लिक करें और एक समान डिस्प्ले पाने के लिए "शो कोड बाइट्स" पर टिक करें।

बाईं ओर का कॉलम मशीन कोड एड्रेस है। इसका मान डीबगर द्वारा फ़ेक किया जाता है, कोड वास्तव में कहीं और स्थित होता है। लेकिन यह कहीं भी हो सकता है, जो कि JIT कंपाइलर द्वारा चुने गए स्थान पर निर्भर करता है, इसलिए डिबगर विधि के प्रारंभ में 0 से नंबर एड्रेस करना शुरू कर देता है।

दूसरा कॉलम मशीन कोड है । वास्तविक 1s और 0s जो CPU निष्पादित करता है। मशीन कोड, यहाँ की तरह, सामान्यतः हेक्स में प्रदर्शित किया जाता है। उदाहरण शायद यह है कि 0x8B MOV निर्देश का चयन करता है, अतिरिक्त बाइट्स सीपीयू को बताने के लिए हैं कि वास्तव में क्या स्थानांतरित करने की आवश्यकता है। कॉल निर्देश के दो स्वादों पर भी ध्यान दें, 0xE8 प्रत्यक्ष कॉल है, 0xFF अप्रत्यक्ष कॉल निर्देश है।

तीसरा कॉलम असेंबली कोड है । असेंबली एक सरल भाषा है, जिसे मशीन कोड लिखने में आसान बनाने के लिए डिज़ाइन किया गया है। यह C # की तुलना IL से किया जा रहा है। असेंबली कोड का अनुवाद करने के लिए उपयोग किए जाने वाले कंपाइलर को "असेंबलर" कहा जाता है। आपके पास शायद आपकी मशीन पर माइक्रोसॉफ्ट असेंबलर है, इसका निष्पादन योग्य नाम 64-बिट संस्करण के लिए ml.exe, ml64.exe है। उपयोग में असेंबली भाषाओं के दो सामान्य संस्करण हैं। आप जो देख रहे हैं, वह इंटेल और एएमडी का उपयोग है। खुले स्रोत की दुनिया में, एटी एंड टी संकेतन में असेंबली आम है। भाषा सिंटैक्स सीपीयू के प्रकार पर निर्भर करता है जिसके लिए लिखा गया था, एक पावरपीसी के लिए असेंबली भाषा बहुत अलग है।

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

int _tmain(int argc, _TCHAR* argv[])
{
00401010 55               push        ebp  
00401011 8B EC            mov         ebp,esp 
    printf("Hello world");
00401013 68 6C 6C 45 00   push        offset ___xt_z+128h (456C6Ch) 
00401018 E8 13 00 00 00   call        printf (401030h) 
0040101D 83 C4 04         add         esp,4 
    return 0;
00401020 33 C0            xor         eax,eax 
}
00401022 5D               pop         ebp  
00401023 C3               ret   

मैंने इसे एनोटेट नहीं किया, ज्यादातर इसलिए कि यह C # प्रोग्राम द्वारा उत्पन्न मशीन कोड के समान है। Printf () फंक्शन कॉल Console.WriteLine () कॉल से काफी अलग है लेकिन बाकी सब उसी के बारे में है। यह भी ध्यान दें कि डीबगर अब वास्तविक मशीन कोड पता उत्पन्न कर रहा है और यह प्रतीकों के बारे में थोड़ा होशियार है। मशीन कोड उत्पन्न करने के बाद डिबग जानकारी उत्पन्न करने का एक साइड इफेक्ट जैसे कि अनवांटेड कंपाइलर अक्सर करते हैं। मुझे यह भी उल्लेख करना चाहिए कि मैंने मशीन कोड को समान दिखने के लिए कुछ मशीन कोड अनुकूलन विकल्पों को बंद कर दिया। कोड को अनुकूलित करने के लिए C / C ++ कंपाइलरों के पास बहुत अधिक समय उपलब्ध है, जिसके परिणामस्वरूप अक्सर व्याख्या करना कठिन होता है। और डीबग करना बहुत कठिन है।

मुख्य बिंदु यहाँ जेआईटी संकलक द्वारा प्रबंधित भाषा से उत्पन्न मशीन कोड और देशी कोड संकलक द्वारा निर्मित मशीन कोड के बीच बहुत कम अंतर हैं। जो प्राथमिक कारण है कि C # भाषा एक देशी कोड संकलक के साथ प्रतिस्पर्धी हो सकती है। उनके बीच एकमात्र वास्तविक अंतर समर्थन फ़ंक्शन कॉल हैं। जिनमें से कई सीएलआर में लागू हैं। और यह कचरा कलेक्टर के आसपास प्राथमिक घूमता है।


6

मूल कोड और मशीन कोड एक ही चीज हैं - वास्तविक बाइट्स जो सीपीयू निष्पादित करता है।

असेंबली कोड के दो अर्थ होते हैं: एक मशीन कोड है जिसे मानव-पठनीय रूप में अनुवादित किया जाता है (बाइट्स के साथ "जेएमपी" (जो कोड में किसी अन्य स्थान पर "कूदता है") जैसे छोटे शब्द के समान शब्दार्थ में अनुवादित निर्देशों के लिए है। IL बाइटकोड (निर्देश बाइट्स जो C # या VB जैसे कंपाइलर उत्पन्न करता है, जो अंततः मशीन कोड में अनुवादित हो जाएगा, लेकिन अभी तक नहीं है) जो DLL या EXE में रहता है।


2

.NET में, असेंबली में MS मध्यवर्ती भाषा कोड (MSIL, कभी-कभी CIL) होता है।
यह एक 'उच्च स्तर' मशीन कोड की तरह है।

लोड होने पर, MSIL को JIT कंपाइलर द्वारा देशी कोड (Intel x86 या x64 मशीन कोड) में संकलित किया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.