.NET Framework 之 Common Language Runtime (轉)

gugu99發表於2007-08-15
.NET Framework 之 Common Language Runtime (轉)[@more@]

Common Language Runtime:namespace prefix = o ns = "urn:schemas--com::office" />

CLR是什麼?

上次講到執行在.NET Framework中的程式碼叫做managed code,反之叫做unmanaged code。相比unmanaged code,managed code 有很多好處,比如可以用多種語言編寫、提高性、易於版本控制和釋出等等。這些都是由CLR提供的。但也有一些不利點,最容易想到的就是程式碼執行速度問題了。

要為managed code提供以上功能,CLR必須知道程式碼中的資料型別、類和與她有關連的assembly的定義。這些資訊叫做metadata,而metadata就包含在程式碼中的某個部分(編譯後)。CLR利用這個metadata載入程式碼段、管理、方法等操作。

.NET出來以前,在不同程式語言之間共享原始碼,簡直是不可能的事情。因為每個程式語言定義的資料型別不同,而且語法也不同。大師們想到了把資料型別統一的好辦法。這個技術叫CTS(common type system)。現在做專案開發就比較簡單了(用不同語言),比如一個專案組裡有會用VB的,會用C++的。可能以前的方法是把兩個人之間互相呼叫的功能寫成DLL或COM。但現在不用這麼麻煩了,你直接就可以使用其他語言編寫的程式碼了。具體一點,用可以繼承C++.NET寫的類,反過來也是可以的。

我們的時候常碰到這樣的提示 - 中的比要安裝的元件的新,你要替換還是保留?是不是很討厭?!現在開始你就用.NET吧,她不會因為這個“小”問題而打擾你了。因為每個程式碼都包含與她相關的metadata,CLR會根據這個資訊來管理程式碼的不同版本。而且因為不用把程式碼的資訊註冊到登錄檔,所以可以用X-COPY的方式安裝程式碼(就是簡單的複製貼上了)。

是用VB做好呢?還是用C++做好呢?這些問題是我們做專案的時候常要考慮的問題。但在.NET用什麼程式語言已經變得不重要了(但還是有一定的差別,在特定專案中),因為CLR提供CTS(還有base class library),而且都執行在CLR上面。在.NET中VB,C++等語言都有了相當多的提高,而且有了新的語言。C#已經申請了標準而且透過,可想而知她的POWE了。大家知道borland也釋出了相關的開發工具C# builder。

做個小結

n 程式碼都包含與自己相關的資訊叫做metadata。

n  CLR提供CTS(CLS也有功勞),所以可以在不同程式語言之間共享原始碼。

n  用metadata管理程式碼資訊(不是利用登錄檔),所以程式碼易於安裝。

n  使用統一的資料型別和類庫,所以程式語言的選擇變得不重要了,而且易於團隊開發。

程式碼在CLR中的執行過程

n  選擇

首先CLR選擇編譯器,因為CLR中可以執行不同語言開發出來的程式碼。

n  把程式碼編譯成MSIL

CLR利用選擇的編譯器生成MSIL(Microsoft intermediate language)和metadata把她們載入到PE(portable executable file)。

MSIL:解釋語言,包含程式碼資訊,讓JIT易於編譯成機器語言。與和程式語言無關。

PE:可執行格式,就是DLL或EXE了。

n  用JIT編譯器把MSIL編譯成機器語言

有兩種方式一種是隻編譯當前執行的程式碼段,另一種是把整個程式碼一次性編譯。JIT會檢測程式碼的安全性。

n  執行程式碼

程式碼首次呼叫就會編譯成機器程式碼,再次呼叫的時候就不再重新編譯了。

相關工具

-MSIL生成器 - MSIL Assembler(ilasm.exe)

-MSIL反編譯器 - MSIL Assembler(ildasm.exe)

使用法

?url=/library/en-us/cptools/html/cpconmsilassemblerilasmexe.asp">

相關資料

-PE結構

/html/cpconmetadatapefilestructure.asp">

 

參考資料

codelanguage.asp">


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-959385/,如需轉載,請註明出處,否則將追究法律責任。

相關文章