2012-04-24 9 views
10

मैं MSIL और प्रबंधित कोड से उलझन में हूं, वे समान हैं या अलग हैं? मेरा कहना है, जब हम अपना सी # कोड बनाते हैं तो क्या होता है?क्या एमएसआईएल .NET में प्रबंधित कोड के समान है?

कौन सा सही

C# Code → C# compiler → Managed Code → MSIL

या

है

C# Code → C# compiler → MSIL

प्रामाणिक संदर्भ या अपने जवाब के समर्थन में लिंक प्रदान करें।

उत्तर

9

जैसा कि टिप्पणियों में उल्लेख किया गया है, एमएसआईएल का नाम बदलकर सीआईएल कर दिया गया है।

CIL = Managed

जब उसके संदर्भ में डाल दिया, वहाँ भी है

C# Code --> C# compiler --> CIL

क्योंकि

Native Code = Unmanaged

ध्यान दें कि Managed Code कुछ पूरी तरह से अलग है, जो refers to the source code


आप इसे विस्तार करने के लिए चाहते हैं, तो ठीक किया पूर्ण प्रक्रिया है:

.NET Code --Compiler--> CIL (Managed) --JIT/NGEN--> Native Code (Unmanaged)


संदर्भ:

  1. Introducing C# (What is the .NET Framework? -> CIL and JIT -> First two sencences)

  2. JIT/NGEN (Towards a Cost Model for Managed Code -> The Just-in-Time compiler -> The whole)

+0

और आधिकारिक तौर पर सीआईएल, सामान्य इंटरमीडिएट भाषा कहा जाता है, [ईसीएमए] (http://www.ecma-international.org/publications/standards/Ecma-335.htm) – Bob

+0

एनजीईएन आमतौर पर ** नहीं ** देशी कोड में संकलित करते समय उपयोग किया जाता है, इसके बजाए जेआईटी कंपाइलर का उपयोग किया जाता है। और "[बाइट कोड] (http://en.wikipedia.org/wiki/Bytecode)" ** ** नहीं है ** मूल कोड के लिए दूसरा नाम, यह प्रबंधित कोड के लिए एक और नाम है। – svick

+0

दरअसल, जेआईटी ने अभी भी उल्लेख किया है और भ्रम से बचने के लिए 'मूल' का उपयोग करने का फैसला किया है। –

3

कोड CLR के नियंत्रण में विशेष रूप से चलाने के लिए लिखा प्रबंधित कोड कहा जाता है। (Source)। तो

सी # कोड → सी # संकलक → सीआईएल (पूर्व MSIL के रूप में जाना जाता है)

सही है।

+0

संदर्भ के लिए धन्यवाद। क्या आप दस्तावेज में बिंदु पैराग्राफ पिन कर सकते हैं जो इसे स्पष्ट करता है? –

+0

@ user129967 पहला खंड, "सीएलआर की भूमिका", तीसरा अनुच्छेद। आप Ctrl + F भी दबा सकते हैं और "प्रबंधित कोड" के लिए आलेख खोज सकते हैं। प्रश्न से परे जाने के लिए – Indrek

12

आप विभिन्न चीजों को भ्रमित कर रहे हैं। Managed code वह कोड है जो एक प्रबंधित भाषा में लिखा गया है (सी #, वीबी।नेट, एफ # और कई अन्य) जिन्हें सीआईएल (कॉमन इंटरमीडिएट लैंग्वेज, पूर्व में माइक्रोसॉफ्ट इंटरमीडिएट लैंग्वेज या एमएसआईएल) में संकलित किया गया है और सीएलआर के प्रबंधित वातावरण में चलाया गया है।

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

जब आप अपना सी # कोड बनाते हैं, तो इसे सीआईएल में संकलित किया जाता है। यही कारण है कि आप संकलित कोड का निरीक्षण करने के लिए ildasm या परावर्तक जैसे टूल का उपयोग कर सकते हैं। जब आप सीआईएल कोड निष्पादित करते हैं तो वास्तव में क्या होता है परिस्थितियों पर निर्भर करता है। यह

  1. जेआईटी कंपाइलर (सबसे आम विकल्प) का उपयोग करके "बस समय" में मूल कोड में संकलित किया जा सकता है।
  2. एक पूर्व-संकलित मूल कोड का उपयोग करके निष्पादित किया गया है (आप इसे प्राप्त करने के लिए एनजीएनएन का उपयोग कर सकते हैं)।
  3. सीधे व्याख्या की गई; मुझे लगता है कि विंडोज सीई के लिए नेट का कुछ संस्करण, या ऐसा ही करता है।
+1

+1। ओपी को प्रबंधित बनाम अप्रबंधित और अधिक अच्छी तरह से समझने के लिए कुछ और प्रारंभिक ".NET का अवलोकन" प्रकार लेख भी पढ़ना चाहिए। यहां एक है: http://www.codeproject.com/Articles/7333/Understanding-NET-Framework-at-a-glance –

+0

सी # केवल "प्रबंधित" है यदि आप "असुरक्षित" कुंजी शब्द का उपयोग नहीं कर रहे हैं। –

+0

तो क्या सी # और सीआईएल दोनों प्रबंधित हैं या उनमें से सिर्फ एक है? –

2

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

C src -> gcc.exe -> .exe containing a machine binary ->   processor 
C# src -> csc.exe -> .exe assembly containing CIL  -> CLR/JIT -> processor 

मैं कारण अवधि "प्रबंधित" प्रयोग किया जाता है लगता है क्योंकि निर्देश अपने कोड बनाने अंततः बजाय .NET रनटाइम द्वारा नियंत्रित किया जाता है प्रोसेसर द्वारा सीधे निष्पादित किया जा रहा है। सीआईएल को स्रोत संकलित करने का अतिरिक्त चरण अपने कोड में प्रबंधित नहीं होता है: बल्कि, तथ्य यह है कि आपका प्रोग्राम प्रोसेसर द्वारा सीधे निष्पादित नहीं होता है। सीआईएल सिर्फ एक ही रनटाइम को लक्षित करने के लिए कई अलग-अलग प्रबंधित भाषाओं को अनुमति देता है।

मुझे पता है कि "सीआईएल में प्रबंधित भाषाओं में संकलित" कहने से यह बहुत ही कमालपूर्ण है, लेकिन ऐसा इसलिए है क्योंकि मुझे वास्तव में यह नहीं लगता कि यह कोड पूरी तरह से सटीक वर्णन है। जावा बाइटकोड सीआईएल के समान है, लेकिन वास्तविक "जावा प्रोसेसर" मौजूद हैं जो मूल रूप से बाइटकोड निष्पादित कर सकते हैं। ऐसा प्रोसेसर .NET CIL के लिए भी कल्पना योग्य है, जिसका अर्थ है कि सीआईएल में संकलित कोड और ऐसी मशीन पर चलने वाला कोड तब मूल हो जाएगा। तथ्य यह है कि सीएलआर के माध्यम से आपका कोड संभाला जाना चाहिए जो इसे प्रबंधित करता है। सीआईएल सिर्फ प्रारूप के रूप में होता है जिसे कोड को कनवर्ट करने के लिए रनटाइम को निष्पादित किया जाना चाहिए।

+0

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

2

मैं यहां बहुत अधिक जानकारी नहीं दूंगा, क्योंकि अन्य ने पहले से ही इसमें बहुत कुछ शामिल किया है, लेकिन मैं कुछ बिंदुओं को स्पष्ट करना चाहता हूं कि अन्य उत्तरों ने वास्तव में अच्छी तरह से या सही तरीके से समझाया नहीं है। यह काफी हद तक pedantic है, और 99.9 99 99% मामलों के लिए आप बस "सी # और सीआईएल/एमएसआईएल प्रबंधित कोड है" के बारे में सोच सकते हैं, लेकिन इसके लिए कुछ subtleties हैं।

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

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

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

तो, प्रबंधित कोड एक प्रबंधित रनटाइम में चल रहे कोड की अवधारणा को संदर्भित करता है। सीआईएल को प्रबंधित कोड माना जाता है जब यह रनटाइम में चल रहा है जैसे .NET रनटाइम पर्यावरण।

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

तो यह बात यह है कि प्रबंधित कोड और सीआईएल दो अलग-अलग चीजें हैं, लेकिन वे संबंधित हैं।

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

  • कोई संबंधित समस्या नहीं^_^