一個.net程序在編譯和運行時都做了些什么?
================================================================
在新聞組和郵件列表里有大量關(guān)于一個.net程序的設(shè)計編譯(design-time or
run-time)和運行原理 (cpu-specific binary or pseudo-code)的疑問。
這里是一個簡單的回答:當(dāng)你編譯一個c#應(yīng)用程序或任何一種cls(commmon
language specification)兼容的語言時,它將首先被編譯成一種稱為il
(intermediate language)的偽代碼(pseudo-code)。在這個應(yīng)用程序第一次
被運行的時候,這種il代碼將被編譯成機器代碼,用于執(zhí)行。也就是說從源代碼
到得到運行結(jié)果,進行了兩次編譯。事實上,只有那些被真正使用的函數(shù)代碼
才會被進行第二次編譯。下面揭示開發(fā)過程中被隱藏起來的細節(jié):
1) 你用c#開發(fā)一些程序
2) 用c#編譯器或cls兼容的編譯器編譯成exe
3) 編譯器將生成的il代碼和附加信息(manifest)放入擁有一個標(biāo)準(zhǔn)pe頭的win32
可執(zhí)行文件的只讀部分。
4) 編譯器在創(chuàng)建這個可執(zhí)行文件時導(dǎo)入(import)一個名為_corexemain的函數(shù)。
這個函數(shù)是.net ee(execution engine)--.net運行期引擎的入口函數(shù)。
5) 當(dāng)執(zhí)行這個win32可執(zhí)行文件時,因為其主要是依賴于dll的pe文件,操作系
統(tǒng)將會調(diào)用位于mscoree.dll中的_corexemain函數(shù)。
6) 操作系統(tǒng)通過pe文件里的進入點,調(diào)用mscoree.dll。并能保證在windows里
可以有很多程序同時運行。
7) 因為操作系統(tǒng)不能執(zhí)行.net il代碼,exe里的進入點只是簡單的中介,它將
指示操作系統(tǒng)調(diào)用_corexemain函數(shù)。
8) 隨后_corexemain函數(shù)開始解釋位于pe文件中的il代碼。
9) 因為il是不能被直接執(zhí)行的, .net ee使用稱為jitter (just in time compiler)
的即時編譯器將il代碼編譯成本地cpu機器代碼用于執(zhí)行。這一即時編譯過程
只在第一次執(zhí)行的時候進行。
新聞熱點
疑難解答
圖片精選