學了那麼久C#,.NET,一直很盲,知道最近才瞭解到什麼是.NET,什麼是C#,CLR,JIT,IL等。分享出來,希望能協助同學們理解.NET。
(水平有限,還望多指點哈哈)
概念介紹
什麼是.NET?
.NET Framework(.NET Framework) 是由微軟開發,一個致力于敏捷軟體開發(Agile software development)、快速應用開發(Rapid application development)、平台無關性和網路透明化的軟體開發平台(引自wikipedia)。
.NET並非一門語言,狹義理解可以是運行一個語言的架構,.NET以CLR(Common Language Runtime,通用語言運行庫)為基礎。它支援C#,VB,C++等語言,或者這句話讓人會誤解,事實上CLR不直接運行這些語言,而是運行由這些語言產生的中繼語言IL(後面介紹)。
什麼是CLR?
CLR(Common Language Runtime,通用語言運行庫)是.NET平台的核心,與JAVA的JVM類似功能,也有人將CLR成為.NET的虛擬機器,正如前面所說,CLR是一個運行時環境,負責.NET運行時進程線程管理,資源管理和,類型封裝等。
JIT:即時編譯,在運行是把IL代碼編譯成能在本機直接執行的指令集。
通俗地講:CLR是IL的運行環境,JIT是IL的編譯器,CLR和IL是影響.NET程式執行效率的主要因素。
什麼是IL?
中繼語言(Intermediate Language),可以理解成.NET平台的彙編,支援物件導向特性。下面我們看下HelloWorld
using System;namespace HelloWorld{ class Program { static void Main(string[] args) { Console.Write("HelloWorld!"); } }}
產生一下,並開啟IL反組譯碼器反組譯碼HelloWorld程式
雙擊Main方法可查看IL指令集
.method private hidebysig static void Main(string[] args) cil managed{ .entrypoint // 代碼大小 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "HelloWorld!" IL_0006: call void [mscorlib]System.Console::Write(string) IL_000b: nop IL_000c: ret} // end of method Program::Main
這就是CLR所能啟動並執行指令。相當於C語言要運行必須先把C代碼編譯成彙編指令,再由機器運行。學習IL有助於深入理解.NET,CLR。
什麼是C#?
物件導向進階程式設計語言,這個應該不陌生。但C#不等於.NET,C#只是.NET平台上被最廣泛採用的程式設計語言。除了C#,你還可以用VB,C++,F#等作為開發語言,這些語言都會被編譯成IL代碼執行於CLR,如果你懂編譯原理,你甚至可以將JAVA應用到.NET,也可以設定你自己的語言,你所需要做的只是把你設定的語言的代碼編譯轉換成可執行檔IL指令集。
圖解.NET
在.NET平台上你所寫的代碼是這樣最終被執行的。理解這幅圖,重新去看上面概念介紹或者更簡單吧。