小談.NET CLR

來源:互聯網
上載者:User
今天的一節培訓課上談起了.NET 的體繫結構,讓我也想起了當初所學的.NET CLR的相關知識。所以在這裡小談一下,也算是個“溫故而知新”了, 還記的很久以前,曾在自己的另一篇文章中討論過CLR和CLI的關係。從大家的回複中也明白了很多。(文章連結) 大家有空自己再看看,我就不多囉嗦這一點了。

大家都知道.NET是支援所謂的多語言的,但其實.NET只有一種語言,就是MSIL,其它所有的語言,按照今天培訓課上講的,就是MSIL的一種子語言。MSIL看起來類似一種組合語言,想當初,用MSIL做一個虛擬機器,做的是雲裡來,霧裡去的,對彙編還是怕的很。在很多時候,MSIL都被當成一種基於棧的OO形式的組合語言。而這種語言被CLR所編譯,轉換成本地執行檔案。在這裡要註明的是,MSIL並不像其它的組合語言,它所包含彙編指令不是應用於一台真正的機器上,而一種抽象的機器上,也因為此,基於MSIL的程式可以應用於不同的機器上,這也是MSIL的特點之一。而在一台機器上,MSIL代碼是不能被直接編譯的,而是必須首先經過JIT轉換成本地代碼(native code)。

那麼MSIL究竟能做什麼呢?呵呵,即然做為.NET的“唯一”的一種語言,凡是你在其它語言裡能做到的,就是MSIL所做的。那在編譯一個.NET檔案中,MSIL具體在何時何地扮演何種角色呢?(很想畫個圖,可是不知道怎麼在CNBlog中實現,好像以前直接從word裡可以直接copy,現在不行了) 大概描述一下編譯的流程,大家應該就能明白了。按照傳統的編譯流程,是將source code 編譯成object code,再將object與一個library串連起來編譯成binary檔案,然後執行binary檔案。而隨後推出了Dynamic link Compilation, 即動態編譯,其指的是將source code編譯成一個object code,但是其在編譯時間不串連libary檔案,而是在運行binary檔案時,動態串連library 檔案。那可能有人就問,library檔案是什嗎?它其實包含的就是metadata,中繼資料。而在.NET CLR中採用的是所謂的JIT Compilation, (Just In Time Compilation),它的實現原理與動態編譯類似,將source code轉換成MSIL,再利用JIT將MSIL轉換成本地代碼,在運行時,讀取Assembly中的中繼資料進行相關操作。

大概的流程就是這樣了,不多說了,這個要說下去,就該談談metadata, 還有一些編譯過程的細節,比如說JIT Engine, BackPatch, JMI Thunk等一系列的編譯機制。有機會,下次再繼續談。先這樣,呵呵,後會有期。

聯繫我們

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