.NET Framework 之 Common Language Runtime (轉)
之 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- System.InvalidProgramException:“Common Language Runtime detected an invalid program.”Exception
- Html language common symbolic entitiesHTMLSymbol
- .NET Framework 4.0之Tuple(元組)Framework
- .NET Framework 4 和 .NET Framework 4 Client ProfileFrameworkclient
- .Net Framework各版本之間的關係Framework
- .net framework 5.0Framework
- .NET Framework 工具Framework
- 【C# .Net Framework】在.Net Framework中使用gRPCC#FrameworkRPC
- .NET6 平臺系列1 .NET發展史之.NET Framework簡介Framework
- .NET科普:.NET簡史、.NET Standard以及C#和.NET Framework之間的關係C#Framework
- .NET Framework 4和.NET Framework 4 Client Profile的區別Frameworkclient
- microsoft之c# .net framework各版本下載中心ROSC#Framework
- c#之.NET Framework 類庫_名稱空間C#Framework
- .NET Framework 原始碼Framework原始碼
- .NET Framework 類庫Framework
- NET Framework 類庫Framework
- .NET Framework版本解析Framework
- NET Framework簡介Framework
- Runtime面試之weak面試
- ObjC之RunTime(下)OBJ
- ObjC之RunTime(上)OBJ
- 對.NET Framework "事件"機制理解的程式碼分析 (轉)Framework事件
- 【翻譯】CoreRT - A .NET Runtime for AOT
- .NET Framework 工具下載Framework
- .NET Framework 4.8釋出Framework
- Framework not found AFNetworkingFramework
- .NET Framework 的 Quirk VersionFrameworkUI
- .net framework 3.5 新特性Framework
- .NET Framework (最新版本到.NET Framework 4.7.2)中的新增功能Framework
- 回顧.NET系列:Framework、Net Core、Net 過往Framework
- .NET Core學習筆記(8)——Entity Framework Core之Database First筆記FrameworkDatabase
- .NET Core學習筆記(9)——Entity Framework Core之Code First筆記Framework
- .net framework新特性之隱式型別化的變數Framework型別變數
- 在.NET Framework中輕鬆處理XML資料(一) (轉)FrameworkXML
- 在.NET Framework中輕鬆處理XML資料(五) (轉)FrameworkXML
- iOS 防止Crash之runtimeiOS
- org.apache.kafka.common.network.SelectorApacheKafka
- AOSP之修改frameworkFramework