標籤:調用 font net 執行 運行時 span 任務調度 即時 microsoft
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 SpecificationCommon Language Specification(CLS)。一門語言只有遵守了CLS規範,才能建立運行在CLR上的應用程式。
關於CLR還有另一個重要的概念:Managed 程式碼。Managed 程式碼是在CLR的保護和管理下啟動並執行代碼,由CLR負責Managed 程式碼的記憶體配置、任務調度以及Managed 程式碼之間的通訊,這可以保證每個應用程式(即使是使用不同的語言編寫的)都能夠遵循統一的行為規範。
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 編譯器Just-In-Time Compiler(JITter)將IL碼轉換為機器碼。
JITter只在某個方法被調用時才編譯該方法,而且編譯好的機器碼會被緩衝起來,只有C#源碼發生變化時才重新編譯機器碼。
三 .NET類庫的主要結構
學習資料:Inside C# by Tom Archer
《Inside C#》筆記(一) .NET平台