《Inside C#》筆記(一) .NET平臺
C# 基於.NET運行時,所以有必要首先對.NET以及C#與.NET平臺的關系有一定的了解。
一 .NET平臺
.NET背後的基本思想是將原本獨立工作的設備、網絡服務整合在一個統一的平臺上,從而可以為用戶提供豐富全面的解決方案。平時提到.Net一般默認指的是.Net Framework,但其實這只是.NET平臺的一部分另外還包括.NET Building Block Service、.NET Device Software等一系列看不懂的東西。.Net Framework包含公共語言運行時Common Language Runtime(CLR)和.Net Framework類庫兩部分。可以把公共語言運行時理解成.NET平臺的虛擬機,另外所有的.NET語言都包含了.Net Framework類庫。這個類庫涵蓋了從文件讀寫到數據庫操作再到XML、SOAP等等非常廣泛的功能。
二 .NET Framework
a) CLR
CLR是.NET的核心,它是一個支持多種語言的程序同時運行、互相配合的實時環境。CLR支持多語言(C#, VB.NET,F#等)之間的互操作,那麽它是怎麽做到這一點的呢——因為這些語言都遵循了公共語言規範Common Language Specification(CLS)。一門語言只有遵守了CLS規範,才能創建運行在CLR上的應用程序。
關於CLR還有另一個重要的概念:托管代碼。托管代碼是在CLR的保護和管理下運行的代碼,由CLR負責托管代碼的內存分配、任務調度以及托管代碼之間的通訊,這可以保證每個應用程序(即使是使用不同的語言編寫的)都能夠遵循統一的行為規範。
b) .Net Framework類庫
.Net Framework類庫對保證多語言間的互操作性具有重要意義。因為通過.Net Framework類庫開發者能使用由CLR提供的統一接口。雖然其它許多語言都有自己的類庫,比如C++,但.Net平臺特殊的地方在於,編程語言之間的區別僅僅在於調用.Net Framework類庫時,在語義上的區別。下面來對比C++和C#對“Hello, World”程序的實現:
C++:
C#版:
C++可以使用cout函數直接輸出“Hello, World”,但C#要使用類庫提供的WriteLine方法。C++本身包含一個負責字符處理、文件讀寫、屏幕顯示等的類庫,這可以認為是C++語言本身的功能,但C#等.NET平臺下的語言卻不具備這些功能,這些功能屬於類庫,離開類庫,C#之類的語言基本上做不了任何事情。
c) IL碼和JITters
.NET平臺的語言編譯器會將源碼編譯成IL碼Microsoft Intermediate Language(MSIL), IL碼本身也可以說是一種編程語言。在編譯好的應用程序第一次被執行時,IL碼才被編譯成真正的機器碼。大概過程如下
1. 用C#編寫源碼
2. 使用C#編譯器(csc.exe)編譯成IL碼
3. 在編譯好的應用程序被執行時,會使用實時編譯器Just-In-Time Compiler(JITter)將IL碼轉換為機器碼。
JITter只在某個方法被調用時才編譯該方法,而且編譯好的機器碼會被緩存起來,只有C#源碼發生變化時才重新編譯機器碼。
三 .NET類庫的主要結構
學習資料:Inside C# by Tom Archer
《Inside C#》筆記(一) .NET平臺