मैं .NET भाषाओं के संदर्भ में मशीन कोड और मूल कोड के बारे में उलझन में हूं।
उनके बीच क्या अंतर है? क्या यह वही है?
मैं .NET भाषाओं के संदर्भ में मशीन कोड और मूल कोड के बारे में उलझन में हूं।
उनके बीच क्या अंतर है? क्या यह वही है?
जवाबों:
शब्द वास्तव में थोड़ा भ्रमित कर रहे हैं, क्योंकि वे कभी-कभी असंगत रूप से उपयोग किए जाते हैं।
मशीन कोड: यह सबसे अच्छी तरह से परिभाषित एक है। यह कोड है जो बाइट-कोड निर्देशों का उपयोग करता है जो आपके प्रोसेसर (धातु का भौतिक टुकड़ा जो वास्तविक काम करता है) को सीधे समझता और निष्पादित करता है। आपके मशीन को निष्पादित करने से पहले सभी अन्य कोड का अनुवाद या मशीन कोड में तब्दील होना चाहिए ।
मूल कोड: यह शब्द कभी-कभी उन स्थानों में उपयोग किया जाता है जहां मशीन कोड (ऊपर देखें) का मतलब है। हालांकि, इसका उपयोग कभी-कभी अनवांटेड कोड (नीचे देखें) से भी किया जाता है ।
अनमैन्डेड कोड और प्रबंधित कोड: अनमैन्डेड कोड एक प्रोग्रामिंग लैंग्वेज जैसे कि C या C ++ में लिखे गए कोड को संदर्भित करता है, जिसे सीधे मशीन कोड में संकलित किया जाता है । यह प्रबंधित कोड के साथ विरोधाभास करता है, जिसे C #, VB.NET, Java, या इसी तरह लिखा जाता है, और एक आभासी वातावरण (जैसे .NET या JavaVM) में निष्पादित किया जाता है, जो सॉफ्टवेयर में एक प्रोसेसर को "अनुकरण" करता है। मुख्य अंतर यह है कि प्रबंधित कोड कचरा संग्रह को नियोजित करके और वस्तुओं को अपारदर्शी के संदर्भ में रखकर आपके लिए संसाधनों (अधिकतर मेमोरी आवंटन) का प्रबंधन करता है। अप्रबंधित कोडकोड की तरह है जो आपको मैन्युअल रूप से आवंटित करने और डी-आवंटित करने की आवश्यकता होती है, कभी-कभी मेमोरी लीक (जब आप डी-आवंटित करना भूल जाते हैं) और कभी-कभी विभाजन दोष (जब आप बहुत जल्द ही आवंटित करते हैं)। अप्रबंधित का अर्थ भी आमतौर पर होता है कि सामान्य त्रुटियों के लिए कोई रन-टाइम चेक नहीं होते हैं जैसे कि नल-पॉइंटर डेरेफेरेंसिंग या सरणी सीमा अतिप्रवाह।
सख्ती से बोलना, सबसे गतिशील रूप से टाइप की जाने वाली भाषाएं - जैसे पर्ल, पायथन, पीएचपी और रूबी - भी प्रबंधित कोड हैं । हालांकि, उन्हें आमतौर पर इस तरह के रूप में वर्णित नहीं किया जाता है, जो दर्शाता है कि प्रबंधित कोड वास्तव में वास्तव में बड़े, गंभीर, वाणिज्यिक प्रोग्रामिंग वातावरण (.NET और जावा) के लिए मार्केटिंग शब्द है।
असेंबली कोड: यह शब्द आम तौर पर उस तरह के सोर्स कोड लोगों को संदर्भित करता है जब वे वास्तव में बाइट-कोड लिखना चाहते हैं। एक कोडांतरक एक प्रोग्राम है जो इस स्रोत कोड को वास्तविक बाइट-कोड में बदल देता है। यह संकलक नहीं है क्योंकि परिवर्तन 1-टू -1 है। हालाँकि, यह शब्द अस्पष्ट है कि किस तरह के बाइट-कोड का उपयोग किया जाता है: इसे प्रबंधित या अप्रबंधित किया जा सकता है। यदि यह अप्रबंधित है, तो परिणामी बाइट-कोड मशीन कोड है । यदि इसे प्रबंधित किया जाता है, तो यह .NET वातावरण जैसे वर्चुअल वातावरण द्वारा उपयोग किए जाने वाले बाइट-कोड के परिणामस्वरूप होता है। प्रबंधित कोड (जैसे C #, Java) को इस विशेष बाइट-कोड भाषा में संकलित किया गया है, जिसे .NET के मामले में कॉमन इंटरमीडिएट भाषा (CIL) कहा जाता है और जावा में जावा बाइट-कोड कहा जाता है। आम प्रोग्रामर को इस कोड को एक्सेस करने या सीधे इस भाषा में लिखने के लिए आमतौर पर बहुत कम आवश्यकता होती है, लेकिन जब लोग ऐसा करते हैं, तो वे अक्सर इसे असेंबली कोड के रूप में संदर्भित करते हैं क्योंकि वे एक कोडांतरक का उपयोग करके इसे बाइट-कोड में बदल देते हैं।
जब आप डीबग + विंडोज + डिस्सैस्प का उपयोग करते हैं तो सी # प्रोग्राम डीबगिंग करते समय आप इन शब्दों के लिए एक अच्छा मार्गदर्शक है। यहाँ इसका एक एनोटेट संस्करण है, जब मैं 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 # भाषा एक देशी कोड संकलक के साथ प्रतिस्पर्धी हो सकती है। उनके बीच एकमात्र वास्तविक अंतर समर्थन फ़ंक्शन कॉल हैं। जिनमें से कई सीएलआर में लागू हैं। और यह कचरा कलेक्टर के आसपास प्राथमिक घूमता है।
मूल कोड और मशीन कोड एक ही चीज हैं - वास्तविक बाइट्स जो सीपीयू निष्पादित करता है।
असेंबली कोड के दो अर्थ होते हैं: एक मशीन कोड है जिसे मानव-पठनीय रूप में अनुवादित किया जाता है (बाइट्स के साथ "जेएमपी" (जो कोड में किसी अन्य स्थान पर "कूदता है") जैसे छोटे शब्द के समान शब्दार्थ में अनुवादित निर्देशों के लिए है। IL बाइटकोड (निर्देश बाइट्स जो C # या VB जैसे कंपाइलर उत्पन्न करता है, जो अंततः मशीन कोड में अनुवादित हो जाएगा, लेकिन अभी तक नहीं है) जो DLL या EXE में रहता है।
.NET में, असेंबली में MS मध्यवर्ती भाषा कोड (MSIL, कभी-कभी CIL) होता है।
यह एक 'उच्च स्तर' मशीन कोड की तरह है।
लोड होने पर, MSIL को JIT कंपाइलर द्वारा देशी कोड (Intel x86 या x64 मशीन कोड) में संकलित किया जाता है।