NET編譯時都做了一些什麼 (轉)
在新聞組和列表裡有大量關於一個的設計編譯(design-time or
run-time)和執行原理 (-specific binary or pseudo-code)的疑問。
這裡是一個簡單的回答:當你編譯一個應用程式或任何一種CLS(Commmon
Language Specification)相容的語言時,它將首先被編譯成一種稱為IL
(Intermediate Language)的虛擬碼(pseudo-code)。在這個應用程式第一次
被執行的時候,這種IL程式碼將被編譯成機器程式碼,用於。也就是說從
到得到執行結果,進行了兩次編譯。事實上,只有那些被真正使用的程式碼
才會被進行第二次編譯。下面揭示開發過程中被隱藏起來的細節:
1) 你用C#開發一些程式
2) 用C#或CLS相容的編譯器編譯成EXE
3) 編譯器將生成的IL程式碼和附加資訊(manifest)放入擁有一個標準PE頭的
可執行的只讀部分。
4) 編譯器在建立這個可執行檔案時匯入(import)一個名為_CorExeMain的函式。
這個函式是.NET EE(execution engine)--.NET執行期引擎的入口函式。
5) 當執行這個Win32可執行檔案時,因為其主要是依賴於DLL的PE檔案,操作系
統將會位於MrEE.DLL中的_CorExeMain函式。
6) 操作透過PE檔案裡的進入點,呼叫MSCorEE.DLL。並能保證在裡
可以有很多程式同時執行。
7) 因為不能執行.NET IL程式碼,EXE裡的進入點只是簡單的中介,它將
指示作業系統呼叫_CorExeMain函式。
8) 隨後_CorExeMain函式開始解釋位於PE檔案中的IL程式碼。
9) 因為IL是不能被直接執行的, EE使用稱為JITter (Just In Time compiler)
的即時編譯器將IL程式碼編譯成本地CPU機器程式碼用於執行。這一即時編譯過程
只在第一次執行的時候進行。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958763/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Android編譯時註解框架系列1-什麼是編譯時註解Android編譯框架
- 為什麼編譯的時候把mod_cookies編譯進去了,但是cookies還是不能(轉)編譯Cookie
- 為什麼編譯的時候提示不支援BerkeleyDB2.x(轉)編譯DB2
- 建立表物件時,oracle做了些什麼?物件Oracle
- 為什麼編譯的時候把mod_cookies編譯進去了,但是cookies還是不能用(轉)編譯Cookie
- JS 編譯器都做了啥?JS編譯
- 編譯時註解(轉)編譯
- Mybatis與Spring整合時都做了什麼?MyBatisSpring
- [譯] 當你建立 Flexbox 佈局時,都發生了什麼?Flex
- 為什麼C++編譯器不能支援對模板的分離式編譯 (轉)C++編譯
- Java JVM:垃圾回收(GC 在什麼時候,對什麼東西,做了什麼事情)JavaJVMGC
- commit做了什麼?MIT
- 為什麼在Linux下面編譯的時候提示要重新定義"structiovec"(轉)Linux編譯Struct
- Java條件編譯是什麼?Java編譯
- vue.use()做了什麼Vue
- .NET反編譯神器ILSpy怎麼用?編譯
- 從技術轉管理,我做了什麼來拯救自己?
- jquery裡面的$(this)和this都什麼時候用,有什麼區別jQuery
- 配置pycharm 編譯器時遇到的一些問題PyCharm編譯
- Vs編譯時RazorTagHelper - DOTNET_HOST_PATH is not set編譯
- JS中 new究竟做了什麼?JS
- Oracle的commit做了什麼?OracleMIT
- New運算子到底做了什麼
- Vue原理解析(三):初始化時created之前做了什麼?Vue
- 安裝crs的時候sh root.sh 做了些什麼 ?
- SSA:終於知道編譯器偷摸做了哪些事編譯
- 為什麼每個程式設計師都應該學習程式碼編譯器知識程式設計師編譯
- [29期] 為什麼要編譯安裝?編譯
- Reflector反編譯.NET檔案後修復【轉】編譯
- 你在業餘時間都開發過什麼?
- Activity中setContentView做了什麼View
- new操作符都做了什麼
- Redis SWAPDB 命令背後做了什麼Redis
- javascript new關鍵字做了什麼JavaScript
- 重灌Ubuntu後我都做了什麼Ubuntu
- 當我有一臺雲伺服器時,我做了些什麼伺服器
- 花了兩天時間做了一個 deno 的網站,編譯了 deno 的 Windows 版本網站編譯Windows
- 什麼是Netty編解碼,Netty編解碼器有哪些?Protostuff怎麼使用?Netty