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