什麼是Emit,什麼是反射,兩者區別究竟是什麼?(轉)

Emit的準肯定義,咱們看看微軟給出的答案
System.Reflection.Emit 命名空間包含{

容許編譯器或工具發出元數據發出 Microsoft 中間語言 (MSIL) ,並可選擇在磁盤上生成 PE 文件的類。安全

這些類的主要客戶端是腳本引擎和編譯器。工具

}性能

 

 

Emit能夠直接讓編譯器發出元數據及msil,這樣作的優點又是什麼?
MSIL是將.NET代碼轉化爲 機器語言的一箇中間過程。它是一種介於高級語言和基於Intel的彙編語言的僞彙編語言。當用戶編譯一個.NET程序時, 編譯器源代碼翻譯成Microsoft  中間語言 (MSIL),它是一組能夠有效地轉換爲本機代碼且獨立於CPU的指令。當執行這些指令時,實時(JIT)編譯器將它們轉化爲CPU特定的代碼.

 

因此,咱們的.NET程序最終都是以這些中間語言存儲起來的,在運行後,又由即時編譯器直接轉換成真正的機器語言執行. emit這種優點在於能夠在程序動態運行的過程當中,直接生成IL運行(可謂靈活且不失高效)ui

 

 

 

反射的原理及性能問題引用Jeffrey Richter的一段話:  元數據是用一系列的表來存儲的.生成一個程序集或模塊時,編譯器會建立一個類型定義表、一個字段定義表、一個方法定義表以及其餘表.利用反射命名空間(sytem.reflection,因此可知emit是其一個附屬,不是獨立的)中包含的一些類型,能夠用代碼來解析(就是所謂的反射)這些元數據表.

 

反射有兩個缺點:1.反射沒法在編譯期間保證類型的安全;2.反射速度慢.(咱們須要使用sytem.reflection命名空間中的類型掃描程序集的元數據,反射要不斷地執行字符串的搜索) spa

 

 

 

總結反射包含emit,反射性能低緣由在於須要掃描程序集或模塊的元數據表.emit性能高,在於可以動態生成msil當即執行.它們各據其位,因此用emit時其實你就在用反射(至少你須要它).爲了提升性能,咱們能夠動態建立一些方法來達到咱們想要的目的(動態代理).

 (術語有不足之處,但願糾正)翻譯

相關文章
相關標籤/搜索