[C++/CLI編程寶典][5]編譯與反組譯碼

來源:互聯網
上載者:User

 

通過上次的第一個簡單的C++/CLI執行個體,我們已經對C++/CLI的基本文法有了一定的認識,一些新的關鍵字也混了個眼熟。其實如果你有ISOC++背景,瞭解一些.NET相關概念,且使用VS2008 IDE開發的話,相信到現在你已經可以使用C++/CLI寫一些簡單的小程式了。本次繼續上次的sample來深入瞭解它的編譯和反編譯。 

1)編譯

在安裝了VS2008或WinSDK後,我們就擁有了很多的工具,其中Cl.exe就是用來編譯C++代碼的,對於Cl.exe的很多的選項可以查看msdn。這裡結合上次的執行個體瞭解常用的選項,我們使用cl.exe /clr main.cpp來編譯上次的執行個體,其中/clr選項表明要編譯為託管的IL中間代碼,因為我們知道ISOC++是可以直接編譯為本地代碼,main.cpp是我們要編譯的C++檔案名稱,其他的選項沒有顯式指定,使用預設。在執行次命令後會在與main.cpp相同的目錄下產生main.obj和main.exe,且此時的main.exe是IL中間代碼。編譯過程如:

 

2)JIT編譯

在上面我們看到main.cpp被編譯串連後產生main.exe,我們知道exe是windows的可執行檔,但是上面的exe與我們傳統的exe有所不同,這裡的main.exe為IL中繼語言的(IL中繼語言我們可以先認為是一種進階的彙編語),它離真正的組合語言還有一節距離,那麼為什麼IL中繼語言的exe能夠執行呢,這就要歸功於.NET的虛擬機器機制,當IL中繼語言的exe啟動並執行時候其實是要依賴於CLR先編譯為真正的彙編代碼的,然後再運行。

當IL中繼語言的exe直接發布以後,使用者第一次執行,會將IL中繼語言編譯為真正的彙編,我們將這個過程稱為JIT(just in time)編譯,JIT 編譯考慮了在執行過程中某些代碼可能永遠不會被調用的事實。它不是耗費時間和記憶體將可移植可執行 (PE) 檔案中的所有 MSIL 都轉換為機器碼,而是在執行期間根據需要轉換 MSIL 並將產生的機器碼儲存在記憶體中,以供該進程上下文中的後續調用訪問。在載入並初始化類型時,載入程式將建立存根 (stub) 並將其附加到該類型的每個方法中。當首次調用某個方法時,存根 (stub) 會將控制權交給 JIT 編譯器,後者會將該方法的 MSIL 轉換為機器碼,並修改存根 (stub) 以使其直接指向產生的機器碼。這樣,對 JIT 編譯的方法的後續調用將直接轉到該機器碼。

當然微軟也發布了NGen.exe工具,你可以在安裝過程中使用此工具將IL語言的exe先轉化為真正的彙編代碼,這樣exe就和我們傳統的exe一樣了,沒有運行時的第一次編譯了。使用Ngen.exe編譯後,產生了本機映像(包含經編譯的特定於處理器的機器代碼的檔案),並將它們安裝到本機電腦上的本機映像緩衝中。運行庫CLR從緩衝中使用本機映像,而不是使用即時 (JIT) 編譯器編譯原始程式集。最好是把.dll ngen了,而不是exe,因為.exe的執行是由作業系統啟動的,作業系統先通過EXE內部的一個固定函數啟動clr,再將控制權交給CLR。下面是使用NGen.exe來產生main.exe的本地映像的執行個體:

 

 

3) JIT與NGen.exe比較

JIT運行時編譯,NGen.exe在運行前編譯;JIT每次編譯需要的方法,NGen.exe一次編譯整個程式集;JIT將編譯後存在記憶體中,NGen.exe編譯後持久地儲存在本地的磁碟上;JIT 編譯器產生的程式碼會綁定到觸發編譯的進程上,不能多進程間共用,NGen.exe可以多進程間共用已經編譯好的代碼。

4)反IL中繼語言

C++/CLi是架構於CLI之上,使用IL作為中間抽象層,我們的C++/CLI代碼被編譯為IL中繼語言,從IL中繼語言到底層的彙編CLR幫我們做好了,對於我們開發人員就像是系統的底層提升到了IL中繼語言層,所以我們只要關心到IL中繼語言就好了,而IL中繼語言又跟我們的進階語言非常相似,大大降低了我們理解底層的難度。所以標題中提到的反組譯碼,現在就轉為了反IL中繼語言了,下面使用另一個工具ildasm.exe來將剛才的main.exe反IL中繼語言,使用命令ildasm main.exe如:

運行命令後開啟ildasm視窗如下:

 

在ildasm視窗中,我們看到我們NativeClass,ValueStruct和RefClass的定義,這些就是CLI的IL中繼語言。下節深入編譯後的IL中繼語言!

完!

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.