.NET程式運行原理及基本概念詳解
一、引言
我們知道在Java中有虛擬機,程式碼運行時虛擬機把Java語言編譯成與機器無關的位元組碼,然後再把位元組碼編譯成機器指令執行,那麼在.NET中程式是如何運行的呢?
其實運行原理是一樣的,.NET中的虛擬機是CLR(公共語言運行時),無論是C#程式還是VB程式,首先會由CLR編譯成與平台無關的中間語言IL,
然後由公共語言運行時(CLR)的(JIT)編譯成機器程式碼,再由CPU去執行它。所以說.NET程式也是需要二次編譯才能運行。
- IL/MSIL (Microsoft Intermediate Language) :微軟中間語言 ,IL是MSIL的縮寫,譯為中間語言,.NET程式下的所有語言都會編譯成中間語言,所以他們之間可以相互調用,與語言無關;
- CTS (Common Type System):通用類型系統CLS,通用的數據類型系統,比如C#調用VS語言程式,隨便他們各自的數據類型定義不一樣,但是最終都會轉化為通用類型,比如c#中的int,VB語言中的integer,在CLS中都會轉化為System.int32,所以這兩者之間的程式可以相互調用;
- (Common Language Specification):公共語言規範
- CLR (Common Language Runtime):公共語言運行時,也有的叫公共語言運行庫
- JIT (Just in time):即時編譯器
二、控制台程式項目結構解釋
為了更好的分析.NET程式的運行原理,首先我們在VS2019中新建一個控制台應用程式,名稱為:MyFirstAPP,成功後,我們可以看到系統為我們創建了以下結構:
這些文件結構的基本含義為:
(1)Properties文件夾:(屬性文件夾)
AssemblyInfo.cs文件:這個主要保存程式發布後的版權資訊,我們點擊 屬性=》 程式集資訊 可以相關資訊。
(2)引用:這是我們可以添加其他應用程式集,比如系統類庫、其他項目或者模組的類庫,Webservice服務等
(3)Program.cs 文件: 這個是項目自定義的程式碼類,打開以後,我們看到如下程式碼:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 7 namespace MyFirstApp 8 { 9 class Program 10 { 11 static void Main(string[] args) 12 { 13 Console.WriteLine("HelloWorld!"); 14 } 15 } 16 }
我們大概分析一下系統默認生成的這些程式碼:
- using表示引用命名空間。如果我們需要引用其他類庫的中程式碼,需要添加引用,相當於Java中的import,如果不使用using引入命名空間,那麼我們使用類的時候,就需要通過「命名空間.類名」方式使用;
- namespace表示聲明命名空間。命名空間是用來組織和重用知程式碼的,我們所有的類必須要歸到指定的命名空間中。
- class表示聲明類。命名空間中包括類,類是.net程式基本運行單元。
- static void Main(string[] args)表示聲明一個靜態方法,方法名稱為Main,args表示命令參數,這個方式不能修改,否則程式將不能啟動,因為這是整個程式的入口點。
三、.NET項目編譯
我們點擊編譯,然後打開項目文件夾,發現系統生成了三個文件,這三個文件的含義如下:
- exe文件:編譯後生成的可執行文件,裡面是MSIL中間語言。項目發布或給用戶可以直接運行的程式。
- dll文件:編譯後生成的動態鏈接庫文件。裡面也是MSIL中間語言。
- pdb文件:包含了編譯後程式指向源程式碼的位置資訊,用於調試的時候定位源碼,方便調試。
我們把MyFirstApp.dll文件通過ildasm中間語言工具打開,可以看到這個程式的整個結構如下:
然後雙擊main函數,可以看到該函數的中間語言表示如下:
四、運行過程
第一步:我們上面的程式在編譯的時候,.NET會生成不依賴於作業系統和特定的CPU的中間語言,而中間語言
是可以在各個作業系統上都能編譯的程式碼,這種程式碼Java裡面叫做ByteCode(位元組碼),.NET
裡面我們稱之為MSIL指令(微軟中間語言)這是程式編譯的第一步。
第二步:不管是Java的位元組碼還是.NET的MSIL指令是不能直接運行的,因為機器只能之別用0和1表示的機器語言
所以CLR裡面的JIT需要將上面的MSIL在一次編譯成CPU能夠執行的機器指令,最終由電腦執行。整個過程如下圖所示:
五、總結
以上是本次分享的內容,有些地方可能不一定正確,歡迎大家批評指正
|
作者 | 高紅斌 | |||||
聯繫QQ | 2358643757 | ||||||
出處 | //www.cnblogs.com/gaohongbin | ||||||
本文版權歸作者和部落格園共有,如需全部轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文鏈接。 |