CLR執行模式之程式集代碼的執行

來源:互聯網
上載者:User

標籤:

     所知IL是與CPU無關的機器語言,其能訪問和操作物件類型,並提供指令來建立和初始化對象,調用對象上的虛方法以及直接運算元組對象等,故可視為一種物件導向的機器語言。每種語言的存在都有其存在的價值和原因,同時各自有各自的優勢,由於CLR的獨特性,可以嘗試用不同語言描述不同功能(必須是面向CLR的編譯器語言)。

     在方法執行時,需把方法的IL轉換成本機CPU指令,這是JIT編譯器的職責。一個方法首次調用時:

           CLR在Main方法執行之前會檢測其代碼所引用的所有類型,並分配一個內部資料結構來管理對參考型別的訪問。例如在Main方法內有Console.WriteLine("");

此時在這個內部資料結構,Console類型定義的每個方法都有一個對應的記錄項,每個記錄項都含有一個地址,根據此地址找到方法的具體實現。對這個結構初始化時,CLR將每個記

錄項都設定成包含在CLR內部的一個未編檔函數。該函數稱為JITCompiler。當首次調用WriteLine時,JITCompiler函數會被調用,並將方法的IL代碼編譯成原生CPU指令,儲存到

動態分配的記憶體塊中。然後JC回到CLR為類型建立內部資料結構,找到被呼叫者法對應的那條記錄,修改最初對JC的引用使其指向記憶體塊的地址,最後JC函數跳轉到記憶體塊中的代碼

(方法的具體實現),代碼執行完畢返回繼續執行後續代碼。

          整個過程有點繁瑣,大致就是分兩步走,第一步找到具體方法的地址,初始化資料結構,編譯成指令。第二步回到CLR找到方法的記錄,執行完畢返回。當Main再次調用WriteLine時,由於對WriteLine的代碼進行了驗證和編譯,所以會直接執行記憶體塊中的代碼,完全跳過JC函數。很顯然,當應用程式終止,編譯好的代碼也會被丟棄。(粗淺瞭解,忘指證)

 

CLR執行模式之程式集代碼的執行

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.