C#中CLR(通用語言執行平台)與IL(中間代碼)

來源:互聯網
上載者:User
.net平台中的CLR

首先要說明的是,.NET平台與C#不是一回事 它是C#,VB.net等程式啟動並執行平台。

CLR是通用語言執行平台,是 .NET Framework的重要組成部分。它提供了記憶體管理、線程管理和異常處理等服務,而且還負責對代碼實施嚴格的型別安全檢查,保證了代碼的正確性。

事實上,型別安全(Type Checker)、記憶體回收(Garbage Collector)、異常處理(Exception Manager)、向下相容(COM Marshaler)等很多C#中的特性都是由CLR來提供的。

什麼是IL

.NET Framework是架構在Windows平台上的一個虛擬運行平台,你可以想象將最下層Windows換做其他的作業系統,例如說Linux,一樣可以實現使用符合CLS(Common Language Specification,通用語言規範)的.NET語言,這其實就是Mono計劃要實現的功能。因而,理論上,C#是一種可以跨平台的語言。

C#另一個比較象Java的地方是,它也是一種(特殊意義上的)語言,同Java一樣,C#編寫的程式碼也是先通過C#編譯器編譯為一種特殊的位元組代碼, (Microsoft Intermediate Language,MSIL,微軟)中繼語言,運行時再經由特定的編譯器(JIT編譯器,Just In tIME, JITer)編譯為機器代碼,以供作業系統執行。

IL是一門中繼語言 ,.NET平台上的各種進階語言(如C#,VB,F#)的編譯器會將各自的文字表述方式轉化為IL。各種不同的文字形式最終被統一到了IL的表述方式

CLR載入了IL之後,當每個方法第一次被執行時,就會使用JIT將IL代碼進行編譯為機器碼,機器碼和彙編其實也是一一對應的,可以這樣理解:彙編是機器碼的文字表現形式,提供了一些方便人們記憶的“助記符”。

對於同樣的IL,JIT會把它為不同的CPU架構(如x86/IA64等等)產生不同的機器碼。

C#代碼及其對應的IL中間代碼

//hidebysig指令表示如果當前類為父類,用該指令標記的方法將不會被子類繼承//cil managed表明方法體中的代碼是IL代碼,且是Managed 程式碼,即運行在CLR運行庫上的代碼.method private hidebysig static void Main(string[] args)cil managed{    .entrypoint //該指令代表該函數程式的入口函數。每一個託管應用程式都有且只有一個入口函數,CLR載入程式時,首先從.entrypoint函數開始執行。    .maxstack 2 //執行建構函式時,評估堆棧可容納資料項目的最大個數。評估堆棧是儲存方法中所需要變數的值的一個記憶體地區,該地區在方法執行結束時會被清空,    或者儲存一個傳回值。    .locals init (        [0] int32 num,        [1] int32 num2,        [2] int32 num3) //表示定義int類型的變數,變數名分別為num,num2,num3。儲存在調用棧。    L_0000: nop  //No operation的意思,即沒有任何操作。    L_0001: ldc.i4.1  //將“1”壓入評估棧,此時“1”處於評估棧的棧頂。    L_0002: stloc.0  //此指令表示把值從評估棧中彈出,並賦值給調用棧的第0個變數num。    L_0003: ldc.i4.2    L_0004: stloc.1    L_0005: ldc.i4.3    L_0006: stloc.2 //從.locals init到L_0006,相當於C#代碼的為i,j,k賦值。    L_0007: ldloc.0  //取調用棧中位置為0的元素壓入評估棧(取i的值)。    L_0008: ldloc.1  //取調用棧中位置為1的元素壓入評估棧(取j的值)。    L_0009: add  //做加法操作    L_000a: ldloc.2 //取調用棧中位置為2的元素壓入評估棧(取k的值)。    L_000b: add  //做加法操作    L_000c: call void [mscorlib]System.Console::WriteLine(int32) //調用輸出方法    L_0011: nop  //No Operation    L_0012: call valuetype [mscorlib]System.ConsoleKeyInfo [mscorlib]System.Console::ReadKey() //調用ReadKey方法    L_0017: pop //把評估棧的內容清空    L_0018: ret  //return 標記傳回值} //Main方法結束

通過上面的代碼,我們可以總結一下: .maxstack:代碼中變數需要在調用棧(Call Stack)中佔用幾個位置; .locals int(……):定義變數初始化並放入調用棧中(Call Stack); nop:No Operation,沒有任何操作; ldstr:Load String,把字串壓入評估棧(Evaluation Stack)中;


ldc.i4.1:把數值2以4位元組長度整數的形式壓入評估棧; stloc:把評估棧(Evaluation)中的值彈出賦值到調用棧中(Call Stack); ldloc:把調用棧(Call Stack)中指定位置的值取出(Copy)壓入評估棧(Evaluation Stack)中; call:調用指定的方法,這個指令一般用於調用靜態方法;而callvir則一般用於調用執行個體方法; ret:return ,標記返回。

下面再看一個例子

namespace TestConsole{    class Program    {        [MethodImpl(MethodImplOptions.NoInlining)]        private static void SomeMethod()        {            Console.WriteLine("Hello World!");        }         static void Main(string[] args)        {            Console.WriteLine("Before JITed.");            Console.ReadLine();             SomeMethod();             Console.WriteLine("After JITed");            Console.ReadLine();        }    }}

與之相對應的main方法IL代碼:

.method private hidebysig static void Main(string[] args) cil managed{    .entrypoint    .maxstack 8    // 分配字串"Before JITed"    L_0000: ldstr "Before JITed."    // 調用Console.WriteLine方法    L_0005: call void [mscorlib]System.Console::WriteLine(string)    // 調用Console.ReadLine方法    L_000a: call string [mscorlib]System.Console::ReadLine()    L_000f: pop    // 調用Program.SomeMethod方法    L_0010: call void TestConsole.Program::SomeMethod()    // 分配字串"After JITed"    L_0015: ldstr "After JITed"    // 調用Console.WriteLine方法    L_001a: call void [mscorlib]System.Console::WriteLine(string)    // 調用Console.ReadLine方法    L_001f: call string [mscorlib]System.Console::ReadLine()    L_0024: pop    L_0025: ret}

以上就是C#中CLR(通用語言執行平台)與IL(中間代碼)的內容,更多相關內容請關注topic.alibabacloud.com(www.php.cn)!

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.