日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.NET语言的编译过程:中间语言(IL)和即时编译器(JIT)

發(fā)布時(shí)間:2024/9/20 asp.net 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。