明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

NET框架程序設(shè)計(jì)讀書筆記(3)--執(zhí)行程序集代碼

[摘要]1.4執(zhí)行程序集代碼托管模塊中包含著元數(shù)據(jù)和IL代碼。IL是由微軟在咨詢了一些商業(yè)和學(xué)術(shù)上的語(yǔ)言編譯器作者之后開發(fā)的一種獨(dú)立于CPU的機(jī)器語(yǔ)言。IL要比大多數(shù)CPU機(jī)器語(yǔ)言高級(jí)得多,它可以理解對(duì)象類...
1.4執(zhí)行程序集代碼

托管模塊中包含著元數(shù)據(jù)和IL代碼。IL是由微軟在咨詢了一些商業(yè)和學(xué)術(shù)上的語(yǔ)言編譯器作者之后開發(fā)的一種獨(dú)立于CPU的機(jī)器語(yǔ)言。IL要比大多數(shù)CPU機(jī)器語(yǔ)言高級(jí)得多,它可以理解對(duì)象類型,并且擁有很多高級(jí)的指令,這些指令可以創(chuàng)建和初始化對(duì)象,調(diào)用對(duì)像上的虛方法以直接操作數(shù)組元素。它甚至還有拋出和捕獲異常的指令。我們可以把IL視 作一種面向?qū)ο竦臋C(jī)器語(yǔ)言。

通常情況上,開發(fā)人員會(huì)使用一門高級(jí)語(yǔ)言,比如:C#或Visual Basic)。這些語(yǔ)言的編譯器産的將是IL代碼。當(dāng)然,我們也可以直接以匯編語(yǔ)言的方法寫IL程序。微軟也提供了一個(gè)IL匯編器:ILAsm.exe,另外還有一個(gè)反匯編器:ILDdsm.exe 。

C# 或者Visual Basic 等高級(jí)語(yǔ)言提供的都只是CLR全部功能的一個(gè)子集。 IL匯編語(yǔ)言允許開發(fā)人員獲取CLR所有的功能。

總結(jié)IL的特點(diǎn)如下:

1、面向?qū)ο裉匦裕c其他匯編不同。

2、IL可以獲取CLR所有的功能

3、IL并不束縛于任何特定的CPU平臺(tái),也就是說他也可以夸平臺(tái)。



.net程序執(zhí)行過程如下:

1 一個(gè)方法執(zhí)行之前,CLR首先檢測(cè)Main中代碼引用的所有類型,CLR會(huì)分配一個(gè)內(nèi)部的數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)用于管理對(duì)所引用類型的訪問。

2、當(dāng)該數(shù)據(jù)結(jié)構(gòu)被初始化時(shí),CLR將把每一個(gè)條目設(shè)置 為CLR內(nèi)部的一個(gè)沒有正式記錄的函數(shù),我們暫且稱該函數(shù)為 JITCompiler。

3、當(dāng)Main方法第一次調(diào)用引用的類型的方法成員時(shí),JITCompiler函數(shù)將被調(diào)用,該函數(shù)負(fù)責(zé)將一個(gè)方法的IL代碼編譯成本地CPU指令。

1、 JITCompiler將前面第2步的數(shù)據(jù)結(jié)構(gòu)中的要調(diào)用的真實(shí)方法的地址替換成包含剛剛編譯好的CPU指令的內(nèi)存塊地址。

2、 JITCompiler跳轉(zhuǎn)到該內(nèi)存塊中的代碼上,開始執(zhí)行。



注意:一個(gè)類型的所有方法只會(huì)編譯一次,當(dāng)這個(gè)類型的方法又被調(diào)用時(shí),將會(huì)使用之前已經(jīng)編譯過的代碼,這樣只有在首次調(diào)用時(shí),才會(huì)產(chǎn)生性能損失。

也就是說托管代碼跟非托管代碼相比,性能上的損失是非常小的,近乎微不足道。



托管代碼在性能上的優(yōu)點(diǎn):



1、 在新型的如奔4CPU上,JIT編譯器能產(chǎn)生利用新型CPU提供的特殊指令的本地代碼。而非托管應(yīng)用程序通常被編譯為向具有最小通用功能集合的CPU平臺(tái),一般會(huì)避免使用新型CPU提供的特殊指令。而這些特殊指令往往會(huì)在較新的Cpu上為應(yīng)用程序帶來很高的性能提升中。

2、 JIT編譯器能檢測(cè)到正在運(yùn)行的機(jī)器上某些總是返回錯(cuò)誤的布爾測(cè)試。例如:



If(numberOfCPUs>1)

{



}



如果宿主機(jī)器只有一個(gè)CPU,那么對(duì)于該段代碼,JIT編譯器將不會(huì)產(chǎn)生任何CPU指令。針對(duì)宿主機(jī)器的本地代碼鶁會(huì)得到更好的調(diào)整:代碼量將變得更小,執(zhí)行速度也會(huì)更快。



當(dāng)然,我們可以利用Ngen.exe工具,將IL代碼轉(zhuǎn)化為本地代碼,并生成一個(gè)文件,這樣執(zhí)行程序時(shí),CLR將自動(dòng)檢查是否有個(gè)預(yù)編譯的版本存在,如果存在,CLR將加載預(yù)編譯的代碼,不需要額外的運(yùn)行時(shí)編譯。



1.4.1 IL與代碼驗(yàn)證



1、 IL是一種基于堆棧的語(yǔ)言

2、 IL沒有提供操作寄 存器的指令,開發(fā)人員可以很容易地產(chǎn)生IL代碼。

3、 IL需要的指令也比較少。

4、 IL指令是無類型的。

5、 IL對(duì)CPU實(shí)現(xiàn)了抽象。



IL的最大優(yōu)點(diǎn)是:提高了應(yīng)用程序的健壯性,當(dāng)IL代碼被編譯為本地Cpu指令時(shí),CLR將執(zhí)行一個(gè)稱作驗(yàn)證的過程。



驗(yàn)證過程檢查高級(jí)IL代碼,確保它做的每件事情都是“安全”的。以下是檢驗(yàn)的一些條目:

1、 不能從未初始化的內(nèi)存中讀取數(shù)據(jù)。

2、 每個(gè)方法都必須傳入正確的參數(shù)個(gè)數(shù),且各個(gè)參數(shù)的類型要正確匹配。

3、 每個(gè)方法的返回值都必須被正確地使用。

4、 每個(gè)方法都必須有一個(gè)返回語(yǔ)句

。。。。

如果驗(yàn)證不通過,將有一個(gè)System.Security.VerificationException異常被拋出,阻止方法繼續(xù)執(zhí)行。



驗(yàn)證的優(yōu)點(diǎn):

通過驗(yàn)證的代碼,我們可以確保它們不會(huì)訪問它們不應(yīng)該訪問的的內(nèi)存,因此也就不會(huì)干擾另一個(gè)應(yīng)用程序的代碼。這意味著我們可以在一個(gè)單獨(dú)的windows虛擬地址空間內(nèi)運(yùn)行多個(gè)托管