कॉमन इंटरमीडिएट लैंग्वेज

कॉमन इंटरमीडिएट लैंग्वेज (CIL), जिसे पहले Microsoft इंटरमीडिएट लैंग्वेज (MSIL) या इंटरमीडिएट लैंग्वेज (IL) कहा जाता था, सामान्य भाषा अवसंरचना (CLI) विनिर्देश के भीतर परिभाषित मध्यवर्ती भाषा बाइनरी इंस्ट्रक्शन सेट है। सीआईएल निर्देश सीएलआई-संगत रनटाइम पर्यावरण जैसे सामान्य भाषा रनटाइम द्वारा निष्पादित किए जाते हैं। CLI को लक्षित करने वाली भाषाएँ CIL को संकलित करती हैं। CIL वस्तु के उन्मुख, स्टैक मशीन | स्टैक-आधारित बायटेकोड है। रनटाइम सामान्यतः समय-समय पर संकलन|जस्ट-इन-टाइम कंपाइल सीआईएल इंस्ट्रक्शंस को देसी कोड में।

CIL को मूल रूप से .NET भाषाओं के बीटा रिलीज़ के दौरान Microsoft इंटरमीडिएट लैंग्वेज (MSIL) के रूप में जाना जाता था। C Sharp (प्रोग्रामिंग लैंग्वेज)|C# और CLI के मानकीकरण के कारण, bytecode को अब आधिकारिक तौर पर CIL के रूप में जाना जाता है। Windows डिफ़ेंडर वायरस की परिभाषाएँ इसके साथ संकलित बायनेरिज़ को MSIL के रूप में संदर्भित करना जारी रखती हैं।

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


 * 1) Source कोड को CIL बायटेकोड में बदला जाता है और एक असेंबली (CLI) बनाई जाती है।
 * 2) सीआईएल असेंबली के निष्पादन पर, इसका कोड मूल कोड उत्पन्न करने के लिए रनटाइम के जस्ट-इन-टाइम संकलन के माध्यम से पारित किया जाता है। अहेड-ऑफ़-टाइम संकलन का भी उपयोग किया जा सकता है, जो इस चरण को समाप्त करता है, लेकिन निष्पादन योग्य-फ़ाइल पोर्टेबिलिटी की कीमत पर।
 * 3) कंप्यूटर का प्रोसेसर नेटिव कोड को निष्पादित करता है।

निर्देश
CIL बायटेकोड में निम्नलिखित कार्यों के समूहों के लिए निर्देश (कंप्यूटर विज्ञान) हैं:
 * लोड करें और स्टोर करें
 * अंकगणित
 * प्रकार रूपांतरण
 * गतिशील स्मृति आवंटन
 * स्टैक (डेटा संरचना) | ऑपरेंड स्टैक प्रबंधन (पुश / पॉप)
 * ब्रांच (कंप्यूटर साइंस)|कंट्रोल ट्रांसफर (ब्रांचिंग)
 * सबरूटीन
 * एक्सेप्शन हेंडलिंग
 * निगरानी (सिंक्रनाइज़ेशन)|निगरानी-आधारित संगामिति
 * C++/CLI और असुरक्षित C# कोड के लिए आवश्यक डेटा और फ़ंक्शन पॉइंटर्स हेरफेर

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

कोड जो x86 असेंबली भाषा में दो नंबर जोड़ता है, जहां eax और edx दो अलग-अलग X86#x86_registers|सामान्य-उद्देश्य रजिस्टर निर्दिष्ट करते हैं: <वाक्यविन्यास लैंग = एएसएम> ईएक्स, एडएक्स जोड़ें 

मध्यवर्ती भाषा (IL) में कोड, जहां 0 eax है और 1 edx है: <वाक्यविन्यास प्रकाश लैंग = csharp> ldloc.0 // स्थानीय चर 0 को स्टैक पर धकेलें ldloc.1 // स्थानीय चर 1 को स्टैक पर धकेलें // पॉप जोड़ें और शीर्ष दो स्टैक आइटम जोड़ें, फिर परिणाम को स्टैक पर धकेलें stloc.0 // पॉप और शीर्ष स्टैक आइटम को स्थानीय चर 0 में संग्रहीत करें 

बाद के उदाहरण में, दो रजिस्टरों, eax और edx के मान पहले स्टैक पर धकेले जाते हैं। जब ऐड-इंस्ट्रक्शन को कॉल किया जाता है, तो ऑपरेंड पॉप हो जाते हैं, या पुनर्प्राप्त हो जाते हैं, और परिणाम को स्टैक पर धकेल दिया जाता है, या संग्रहीत कर दिया जाता है। परिणामी मूल्य को स्टैक से पॉप किया जाता है और ईएक्स में संग्रहीत किया जाता है।

वस्तु-उन्मुख अवधारणाएं
CIL को ऑब्जेक्ट-ओरिएंटेड होने के लिए डिज़ाइन किया गया है। आप ऑब्जेक्ट बना सकते हैं, विधियों को कॉल कर सकते हैं, और अन्य प्रकार के सदस्यों, जैसे फ़ील्ड्स का उपयोग कर सकते हैं।

कक्षा में रहने के लिए प्रत्येक विधि (प्रोग्रामिंग) की आवश्यकता होती है (कुछ अपवादों के साथ)। तो क्या यह स्थैतिक विधि है: <वाक्यविन्यास प्रकाश लैंग = csharp> क्लास पब्लिक फू { विधि सार्वजनिक स्थैतिक int32 जोड़ें (int32, int32) सीआईएल प्रबंधित { मैक्सस्टैक 2 ldarg.0 // पहला तर्क लोड करें; ldarg.1 // दूसरा तर्क लोड करें; जोड़ें // उन्हें जोड़ें; रिट // परिणाम लौटाएं; } } 

विधि जोड़ें को फू के किसी भी उदाहरण को घोषित करने की आवश्यकता नहीं है क्योंकि इसे स्थैतिक घोषित किया गया है, और फिर इसे सी # में इस तरह इस्तेमाल किया जा सकता है: <वाक्यविन्यास प्रकाश लैंग = csharp> int r = Foo.Add (2, 3); // 5 

सीआईएल में यह ऐसा दिखाई देगा: <वाक्यविन्यास प्रकाश लैंग = csharp> एलडीसी.आई4.2 एलडीसी.आई4.3 कॉल int32 फू :: जोड़ें (int32, int32) स्टाक.0 

उदाहरण कक्षाएं
एक इंस्टेंस क्लास में कम से कम एक कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) और कुछ इंस्टेंस (कंप्यूटर साइंस) सदस्य होते हैं। निम्नलिखित वर्ग में कार-ऑब्जेक्ट के कार्यों का प्रतिनिधित्व करने वाली विधियों का एक सेट है। <वाक्यविन्यास प्रकाश लैंग = csharp> क्लास पब्लिक कार { विधि सार्वजनिक विशेष नाम rtspecialname उदाहरण शून्य .ctor (int32, int32) सीआईएल प्रबंधित { /* कंस्ट्रक्टर */ }

.विधि सार्वजनिक शून्य मूव (int32) सीआईएल प्रबंधित { /* कार्यान्वयन छोड़ना */ } .विधि सार्वजनिक शून्य टर्नराइट सीआईएल प्रबंधित { /* कार्यान्वयन को छोड़ना */ } .विधि सार्वजनिक शून्य टर्नलेफ़्ट सीआईएल प्रबंधित { /* कार्यान्वयन को छोड़ना */ } .विधि सार्वजनिक शून्य ब्रेक सीआईएल प्रबंधित { /* कार्यान्वयन को छोड़ना */ } } 

वस्तुओं का निर्माण
सी # कक्षा में उदाहरण इस तरह बनाए जाते हैं: <वाक्यविन्यास प्रकाश लैंग = csharp> कार मायकार = नई कार (1, 4); कार आपकी कार = नई कार (1, 3); 

और वे कथन मोटे तौर पर CIL के इन निर्देशों के समान हैं: <वाक्यविन्यास प्रकाश लैंग = csharp> एलडीसी.आई4.1 एलडीसी.आई4.4 newobj उदाहरण शून्य कार :: .ctor (int, int) stloc.0 // myCar = नई कार (1, 4); एलडीसी.आई4.1 एलडीसी.आई4.3 newobj उदाहरण शून्य कार :: .ctor (int, int) stloc.1 // आपकी कार = नई कार (1, 3); 

उदाहरण के तरीकों को लागू करना
इंस्टेंस विधियों को सी # में निम्नानुसार लागू किया जाता है: <वाक्यविन्यास प्रकाश लैंग = csharp> myCar.Move (3); 

जैसा कि सीआईएल में कहा गया है: <वाक्यविन्यास प्रकाश लैंग = csharp> ldloc.0 // ऑब्जेक्ट myCar को स्टैक पर लोड करें एलडीसी.आई4.3 कॉल उदाहरण शून्य कार :: हटो (int32) 

मेटाडाटा
कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर (CLI) मेटा डेटा के रूप में संकलित कक्षाओं के बारे में जानकारी रिकॉर्ड करता है। घटक वस्तु मॉडल में टाइप लाइब्रेरी की तरह, यह एप्लिकेशन को असेंबली में इंटरफेस, क्लासेस, टाइप्स, मेथड्स और फील्ड्स को सपोर्ट करने और खोजने में सक्षम बनाता है। ऐसे मेटाडेटा को पढ़ने की प्रक्रिया को रिफ्लेक्शन (कंप्यूटर साइंस) कहा जाता है।

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

उदाहरण
नीचे CIL असेम्बलर में लिखा गया एक बेसिक हैलो, वर्ल्ड प्रोग्राम है। यह स्ट्रिंग हैलो, वर्ल्ड प्रदर्शित करेगा! . <वाक्यविन्यास प्रकाश लैंग = csharp> असेंबली हैलो {} .विधानसभा बाहरी mscorlib {} विधि स्थिर शून्य मुख्य { ।प्रवेश बिंदु मैक्सस्टैक 1 एलडीएसटी हैलो, दुनिया! कॉल शून्य [mscorlib] System.Consoleo:: राइटलाइन (स्ट्रिंग) गीला करना } 

निम्नलिखित कोड ऑपकोड की संख्या में अधिक जटिल है।

इस कोड की तुलना जावा बाइटकोड के बारे में लेख में संबंधित कोड से भी की जा सकती है। <वाक्यविन्यास प्रकाश लैंग = csharp> स्थैतिक शून्य मुख्य (स्ट्रिंग [] तर्क) { के लिए (int i = 2; i <1000; i++) { के लिए (int j = 2; j 

सीआईएल असेंबलर सिंटैक्स में ऐसा दिखता है: <वाक्यविन्यास लैंग = सीपीपी> विधि निजी छुपाएं स्थिर शून्य मुख्य (स्ट्रिंग [] तर्क) सीआईएल प्रबंधित { ।प्रवेश बिंदु मैक्सस्टैक 2 स्थानीय init (int32 V_0, int32 V_1)

एलडीसी.आई4.2 स्टाक.0 ब्र.एस IL_001f आईएल_0004: एलडीसी.आई4.2 स्टाक.1 ब्र.एस आईएल_0011 IL_0008: ldloc.0 ldloc.1 रेम brfalse.s IL_001b ldloc.1 एलडीसी.आई4.1 जोड़ना स्टाक.1 आईएल_0011: ldloc.1 एलडीएलओसी.0 blt.s IL_0008 एलडीएलओसी.0 कॉल शून्य [mscorlib] System.Consolei:: राइटलाइन (int32) IL_001b: ldloc.0 एलडीसी.आई4.1 जोड़ना स्टाक.0 IL_001f: ldloc.0 एलडीसी.आई4 0x3e8 blt.s IL_0004 गीला करना } 

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

पीढ़ी
एक सीआईएल असेंबली और निर्देश या तो एक कंपाइलर या आईएल असेंबलर (आईएलएएसएम) नामक एक उपयोगिता द्वारा उत्पन्न होते हैं जिसे निष्पादन पर्यावरण के साथ भेज दिया जाता है।

असेंबल किए गए CIL को IL डिस्सेबलर (ILDASM) का उपयोग करके फिर से कोड में डिसाइड किया जा सकता है। .NET रिफ्लेक्टर जैसे अन्य उपकरण हैं जो CIL को एक उच्च-स्तरीय भाषा (जैसे C# या Visual Basic .NET) में अपघटित कर सकते हैं। यह सीआईएल को रिवर्स इंजीनियरिंग के लिए बहुत आसान लक्ष्य बनाता है। यह विशेषता जावा बाइटकोड के साथ साझा की जाती है। हालाँकि, ऐसे उपकरण हैं जो कोड को अस्पष्ट कर सकते हैं, और ऐसा करते हैं ताकि कोड आसानी से पढ़ने योग्य न हो लेकिन फिर भी चलने योग्य हो।

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

समय से पहले संकलन
कॉमन लैंग्वेज इन्फ्रास्ट्रक्चर-संगत निष्पादन वातावरण भी रनटाइम पर JIT प्रक्रिया को हटाकर इसे तेजी से निष्पादित करने के लिए एक असेंबली के अहेड-ऑफ-टाइम संकलन (AOT) करने के विकल्प के साथ आता है।

.NET फ्रेमवर्क में एक विशेष उपकरण है जिसे देशी छवि जनरेटर (NGEN) कहा जाता है जो AOT करता है। AOT के लिए एक अलग दृष्टिकोण CoreRT है जो .Net कोर कोड को एक एकल निष्पादन योग्य के संकलन की अनुमति देता है, जिसमें रनटाइम पर कोई निर्भरता नहीं होती है। मोनो (प्रोग्रामिंग) में एओटी करने का भी विकल्प होता है।

सूचक निर्देश - सी ++/सीएलआई
जावा के बायटेकोड से एक उल्लेखनीय अंतर यह है कि CIL ldind, stind, ldloca, और कई कॉल निर्देशों के साथ आता है जो C/C++ कोड को CIL में संकलित करने के लिए आवश्यक डेटा/फ़ंक्शन पॉइंटर्स हेरफेर के लिए पर्याप्त हैं।

<वाक्यविन्यास लैंग = सीपीपी> एक कक्षा { सार्वजनिक: आभासी शून्य __stdcall मेथ {} }; शून्य test_pointer_operations (पूर्णांक परम) { इंट के = 0; int * ptr = &k; पीटीआर = और परम; ए ए; ए * पीटीआरए = & ए; ptra->मेथ; } 
 * पीआरटी = 1;
 * पीआरटी = 2;

सीआईएल में संबंधित कोड इस रूप में प्रस्तुत किया जा सकता है:

<वाक्यविन्यास लैंग = सीपीपी> .विधि असेंबली स्थिर शून्य modopt ([mscorlib]System.Runtime.CompilerServices.CallConvCdecl) test_pointer_operations(int32 param) सीआईएल प्रबंधित { .vtentry 1: 1 // कोड आकार 44 (0x2c) मैक्सस्टैक 2 .लोकल्स ([0] int32* ptr, [1] वैल्यू टाइप A* V_1,  [2] वैल्यूटाइप ए * ए,  [3] इंट 32 के) // के = 0; आईएल_0000: एलडीसी.आई4.0 IL_0001: stloc.3 // पीटीआर = & के; IL_0002: ldloca.s k // स्थानीय पता निर्देश लोड करें IL_0004: stloc.0 // * पीटीआर = 1; IL_0005: ldloc.0 आईएल_0006: एलडीसी.आई4.1 IL_0007: stind.i4 // अप्रत्यक्ष निर्देश // पीटीआर = और परम IL_0008: ldarga.s param // लोड पैरामीटर का पता निर्देश IL_000a: stloc.0 // * पीटीआर = 2 IL_000b: ldloc.0 IL_000c: ldc.i4.2 IL_000d: stind.i4 // ए = नया ए; IL_000e: ldloca.s a IL_0010: कॉल वैल्यूटाइप ए * मोडोप्ट ([mscorlib] System.Runtime.CompilerServices.CallConvThiscall) 'ए। {ctor}' (वैल्यूटाइप ए * मोडोप्ट ([mscorlib] System.Runtime.CompilerServices.IsConst) modopt ([mscorlib] System. रनटाइम। कंपाइलर सर्विसेज। इस कॉन्स्ट)) IL_0015: पॉप // पीटीआरए = &ए; IL_0016: ldloca.s ए IL_0018: stloc.1 // पीटीआरए-> मेथ ; IL_0019: ldloc.1 IL_001a: डुप IL_001b: ldind.i4 // वर्चुअल कॉल के लिए VMT पढ़ना IL_001c: ldind.i4 IL_001d: कैली अप्रबंधित stdcall शून्य modopt ([mscorlib] System.Runtime.CompilerServices.CallConvStdcall) (मूल int) IL_0022: सेवानिवृत्त } // विधि का अंत 'वैश्विक कार्य'::test_pointer_operations 

यह भी देखें

 * एलएलवीएम
 * सीआईएल के निर्देशों की सूची
 * सीएलआई भाषाओं की सूची

बाहरी संबंध

 * Common Language Infrastructure (Standard ECMA-335)
 * “ECMA C# and Common Language Infrastructure Standards” on the Visual Studio website
 * Hello world program in CIL
 * Speed: NGen Revs Up Your Performance With Powerful New Features -- MSDN Magazine, April 2005