.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
生活随笔
收集整理的這篇文章主要介紹了
.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
.NET語言的編譯分為兩個階段.首先高級語言被編譯成一種稱作IL的中間語言,與高級語言相比,IL更像是機器語言,然而,IL卻包含一些抽象概念(比如:類、異常),這也是這種語言被稱為中間語言的原因。IL被打包在DLL或EXE文件中,而DLL和EXE在.NET中的主要區別就是:只有EXE可以直接被運行,而二者都可被某個正在執行的進程動態裝載(后文詳述)。由于機器的CPU只能執行本地匯編語言,而不是IL,進一步將IL編譯成匯編語言的工作(也就是第二階段)需要在運行時進行,這個過程由即時編譯器(JIT)完成。? 高級語言在初次被編譯時,編譯器做兩件事:首先把編譯得到的IL存儲在DLL或EXE中,然后為類的每個方法創建一個stub函數,此函數會調用即時編譯器,并將自身的地址作為參數傳給編譯器。即時編譯器則從DLL或EXE中獲取相應的IL,編譯成機器語言,并將內存中的原零時調用函數替換成機器語言。這個過程的思想,是用已編譯的方法調用未編譯的方法,實質上被調用的是stub函數;stub函數再調用編譯器,將自身編譯為本地機器語言;最后,.NET會重新調用該方法,方法此時才被真正地執行。函數被反復調用時,機器指令會被直接執行,而只由編譯器對方法進行初次編譯需要花費時間。至于那些沒有被調用的方法,則不會被編譯。?
??? 當編譯器生成一個EXE文件后,?該程序的入口函數為Main()?方法。裝載器將這個EXE?文件載入,探測到該這是一個托管EXE,于是又載入?.NET運行時庫文件(包括即時編譯器),?接著調用了EXE?的Main()?方法。這將觸發對Main()方法的即時編譯,?Main()方法在內存中被替換為本地機器語言,于是?.NET應用程序開始運行。在被編譯為本地語言后,應用程序便可以自由調用本地代碼了。當程序中止時,本地代碼從內存中釋放,所以在下次運行時,IL需要被即時編譯器重新編譯。
總結
以上是生活随笔為你收集整理的.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大连乐姿生活面包会员可以通用吗?
- 下一篇: 哪里的柚子最好吃 寻找柚子最佳产地?