




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、公共語(yǔ)言運(yùn)行時(shí).NET Framework 的 核 心 組 件 是 公 共 語(yǔ) 言 運(yùn) 行 時(shí) ( Command Language Runtime,CLR),主要功能包括內(nèi)存管理、線程管理、代碼執(zhí)行、代碼安全驗(yàn)證、編 譯、系統(tǒng)服務(wù)和遠(yuǎn)程處理等核心服務(wù)。這些功能是公共語(yǔ)言運(yùn)行時(shí)在運(yùn)行托管代碼 時(shí)的固有模塊,如圖1-2 所示。Base Class Library SupportrClass Loader_J圖 1-2 公共語(yǔ)言運(yùn)行時(shí)1公共類(lèi)型系統(tǒng)編程語(yǔ)言都有類(lèi)似的特點(diǎn), .NET 平臺(tái)利用不同語(yǔ)言這個(gè)相近的共性,抽象出了 公共類(lèi)型系統(tǒng)(CTS)。CTS是多信息類(lèi)型系統(tǒng),被內(nèi)置在公共語(yǔ)言運(yùn)行時(shí)中,
2、定義 了聲明和使用類(lèi)型的標(biāo)準(zhǔn),使得CLR可以在不同語(yǔ)言開(kāi)發(fā)的應(yīng)用程序之間管理這些 標(biāo)準(zhǔn)化的類(lèi)型,并且在不同計(jì)算機(jī)之間以標(biāo)準(zhǔn)化的格式進(jìn)行數(shù)據(jù)通信。它具有以下 功能:CTS定義了所有應(yīng)用程序使用的主要.NET數(shù)據(jù)類(lèi)型,以及這些類(lèi)型的內(nèi)部格式。例如, CTS定義了整型是32位大小,還指定了整型值的內(nèi)部格式。CTS 指定了如何為結(jié)構(gòu)和類(lèi)分配內(nèi)存。CTS 允許不同語(yǔ)言開(kāi)發(fā)的組件可以互操作。CTS實(shí)施類(lèi)型安全性,它禁止一個(gè)應(yīng)用程序使用為另一個(gè)應(yīng)用程序分配的內(nèi)存。由于公共類(lèi)型系統(tǒng)包含創(chuàng)建新數(shù)據(jù)類(lèi)型的規(guī)則,所以開(kāi)發(fā)人員并不受限于少量 的數(shù)據(jù)類(lèi)型。特別是,開(kāi)發(fā)人員可以定義他們自己的值或他們自己的類(lèi),而且只要 這
3、些值或類(lèi)符合公共類(lèi)型系統(tǒng)的規(guī)則,它們將是公共類(lèi)型系統(tǒng)可以接受的。只要開(kāi) 發(fā)人員正在使用.NET語(yǔ)言,定義CTS可接受數(shù)據(jù)類(lèi)型的操作將是透明的。遵守CTS 規(guī)則的事宜將由編譯程序負(fù)責(zé)。公共類(lèi)型系統(tǒng)管理了許多類(lèi)別的數(shù)據(jù)類(lèi)型,如圖1-3 所示:對(duì)象 .值類(lèi)W型U類(lèi)類(lèi)型內(nèi)置值類(lèi)型1_接口類(lèi)型內(nèi)置值類(lèi)型1_委托類(lèi)型類(lèi)型1陣列類(lèi)型內(nèi)置值類(lèi)型J值!字符串類(lèi)型指針類(lèi)型引用類(lèi)型圖 1-3 公共類(lèi)型系統(tǒng)的基本結(jié)構(gòu)CTS的每一種類(lèi)型都是對(duì)象,并繼承自一個(gè)基類(lèi) System.Object。它不僅定 義了所有的數(shù)據(jù)類(lèi)型,而且提供了面向?qū)ο蟮哪P鸵约案鞣N語(yǔ)言需要遵守的標(biāo)準(zhǔn)。 CTS 可以分為兩個(gè)大類(lèi):值類(lèi)型和引用類(lèi)型,同
4、時(shí)這兩種類(lèi)型之間還可以進(jìn)行強(qiáng)制 轉(zhuǎn)換,這種轉(zhuǎn)換被稱(chēng)為裝箱(Boxing)和拆箱(UnBoxing)。2公共語(yǔ)言規(guī)范 要和其他對(duì)象完全交互,而不管這些對(duì)象是以何種語(yǔ)言實(shí)現(xiàn)的,對(duì)象必須只向 調(diào)用方公開(kāi)那些它們必須與之互用的所有語(yǔ)言的通用功能。為此定義了公共語(yǔ)言規(guī) 范(CLS),它是許多應(yīng)用程序所需的一套基本語(yǔ)言功能。公共語(yǔ)言規(guī)范(CLS)可為庫(kù)編寫(xiě)者和編譯器編寫(xiě)者提供指南,使任何支持CLS 的語(yǔ)言都完全使用庫(kù),并使用這些語(yǔ)言相互集成。公共語(yǔ)言規(guī)范是公共類(lèi)型系統(tǒng)的 子集,這兩個(gè)集合一起定義了所有.NET編程語(yǔ)言的標(biāo)準(zhǔn)集,允許這些編程語(yǔ)言編寫(xiě) 的應(yīng)用程序可以相互通信和操作。CLS和.NET自身都依賴(lài)于
5、Windows API提供的底層服務(wù),例如菜單、按鈕、 列表框和標(biāo)簽等基本的 Windows 窗體控件類(lèi),以及基本的 Windows 服務(wù)來(lái)管理文 件、進(jìn)程和內(nèi)存。CLS定義了所有基于.NET Framework的語(yǔ)言都必須支持的最小功能集。其規(guī)則 可以概括如下:定義了命名變量的標(biāo)準(zhǔn)規(guī)則。例如,與CLS兼容的變量名都必須以字母開(kāi)始,并且不 能包含空格。變量名之間必須有所區(qū)別,除了變量名之間的大小寫(xiě)之外。定義了原語(yǔ)數(shù)據(jù)類(lèi)型,如 Int32, Int64, Single, Double 和 Booleano禁止無(wú)符號(hào)數(shù)值數(shù)據(jù)類(lèi)型。有符號(hào)數(shù)值數(shù)據(jù)類(lèi)型的一個(gè)數(shù)據(jù)位被保留來(lái)指示數(shù)值的正 負(fù)。無(wú)符號(hào)數(shù)據(jù)類(lèi)
6、型沒(méi)有保留這個(gè)數(shù)據(jù)位。定義了對(duì)支持基于 0的數(shù)組的支持。指定了函數(shù)參數(shù)列表的規(guī)則,以及參數(shù)傳遞給函數(shù)的方式。例如, CLS 禁止使用可選 的參數(shù)。定義了事件名和參數(shù)傳遞給事件的規(guī)則。禁止內(nèi)存指針和函數(shù)指針。但是可以通過(guò)委托提供類(lèi)型安全的指針。除了上述標(biāo)準(zhǔn)之外,CLS還定義了其他標(biāo)準(zhǔn)。任何語(yǔ)言都可以擴(kuò)展基本的CLS 需求。例如,有些語(yǔ)言支持無(wú)符號(hào)整型。不鼓勵(lì)使用非標(biāo)準(zhǔn)的功能,因?yàn)檫@樣做就 妨礙了語(yǔ)言之間的互操作性。完全符合CLS的語(yǔ)言稱(chēng)為兼容的CLS的語(yǔ)言。 3中間語(yǔ)言在.Net框架中,公共語(yǔ)言基礎(chǔ)結(jié)構(gòu)使用公共語(yǔ)言規(guī)范來(lái)綁定不同的語(yǔ)言。通過(guò) 要求不同的語(yǔ)言至少要實(shí)現(xiàn)公共類(lèi)型系統(tǒng)(CTS)包含在公
7、共語(yǔ)言規(guī)范中的部分,公 共語(yǔ)言基礎(chǔ)結(jié)構(gòu)允許不同的語(yǔ)言使用.Net框架。因此在.Net框架中,所有的語(yǔ)言(C#, VB.Net,Effil,NET等)最后都被轉(zhuǎn)換為了一種通用語(yǔ)言:微軟中間語(yǔ)言(MSIL)。MSIL是將.Net代碼轉(zhuǎn)化為機(jī)器語(yǔ)言的一個(gè)中間過(guò)程。它是一種介于高級(jí)語(yǔ)言 和基于Intel的匯編語(yǔ)言的偽匯編語(yǔ)言。當(dāng)用戶(hù)編譯一個(gè).Net程序時(shí),編譯器將源代 碼翻譯成一組可以有效地轉(zhuǎn)換為本機(jī)代碼且獨(dú)立于 CPU 的指令。當(dāng)執(zhí)行這些指令 時(shí),實(shí)時(shí)(JIT)編譯器將它們轉(zhuǎn)化為CPU特定的代碼。由于公共語(yǔ)言運(yùn)行庫(kù)支持多種實(shí)時(shí)編譯器,因此同一段MSIL代碼可以被不同 的編譯器實(shí)時(shí)編譯并運(yùn)行在不同的結(jié)
8、構(gòu)上。從理論上來(lái)說(shuō), MSIL 將消除多年以來(lái) 業(yè)界中不同語(yǔ)言之間的紛爭(zhēng)。在.Net的世界中可能出現(xiàn)下面的情況:一部分代碼可 以用Effil實(shí)現(xiàn),另一部分代碼使用C#或VB完成的,但是最后這些代碼都將被轉(zhuǎn) 換為中間語(yǔ)言。這給程序員提供了極大的靈活性,程序員可以選擇自己熟悉的語(yǔ)言, 并且再也不用為學(xué)習(xí)不斷推出的新語(yǔ)言而煩惱了。中間語(yǔ)言的主要特征如下:面向?qū)ο蠛褪褂媒涌谥殿?lèi)型和引用類(lèi)型之間的巨大差別強(qiáng)數(shù)據(jù)類(lèi)型使用異常來(lái)處理錯(cuò)誤使用特性(attribute)中間語(yǔ)言的格式類(lèi)似于程序集語(yǔ)言。程序集語(yǔ)言的語(yǔ)句直接與內(nèi)部CPU體系結(jié) 構(gòu)支持的指令相關(guān)。但是中間語(yǔ)言的格式通常不依賴(lài)于特定CPU的體系結(jié)構(gòu)。也
9、就 是說(shuō),中間語(yǔ)言不直接引用CPU寄存器或者執(zhí)行CPU指令。當(dāng)用戶(hù)執(zhí)行中間語(yǔ)言 格式的應(yīng)用程序時(shí),另一個(gè)名為Just-In-Time (JIT)編譯器的實(shí)用程序進(jìn)一步把中 間語(yǔ)言轉(zhuǎn)換為目標(biāo)CPU可以執(zhí)行的本機(jī)可執(zhí)行文件。使用JIT編譯器把中間語(yǔ)言文 件轉(zhuǎn)換為本機(jī)可執(zhí)行文件的過(guò)程稱(chēng)為JITting。4托管執(zhí)行過(guò)程在將代碼編譯為MSIL再用JIT編譯器將其編譯為本機(jī)代碼后,CLR的任務(wù)并 沒(méi)有全部完成。用.NET Framework編寫(xiě)的代碼在執(zhí)行時(shí)往往處于被托管的狀態(tài),即 CLR管理著應(yīng)用程序。在實(shí)現(xiàn)代碼托管時(shí),代碼必須向運(yùn)行時(shí)提供最小級(jí)別的信息(元數(shù)據(jù))。在默 認(rèn)狀態(tài)下,所有C#、Visual
10、Basic.NET和JScript.NET代碼都是托管代碼。C+.NET 代碼在默認(rèn)情況下不是托管代碼,但通過(guò)指定的命令行開(kāi)關(guān),編譯器也可以生成托 管代碼。托管代碼的意義在于可以防止多個(gè)正在執(zhí)行的應(yīng)用程序相互干擾,一個(gè)應(yīng)用程序不會(huì)覆蓋另一個(gè)應(yīng)用程序分配的內(nèi)存。這個(gè)過(guò)程被稱(chēng)為類(lèi)型安全性(Type Safety)。 與托管代碼密切相關(guān)的是托管數(shù)據(jù),托管數(shù)據(jù)是CLR的垃圾回收期進(jìn)行分配和 釋放的數(shù)據(jù)。與托管代碼類(lèi)似,在默認(rèn)情況下C#、VisualBasic.NET和JScript.NET 數(shù)據(jù)都是托管數(shù)據(jù), C+.NET 在默認(rèn)情況下為非托管數(shù)據(jù)。不過(guò)通過(guò)關(guān)鍵字, C# 數(shù)據(jù)也可以被標(biāo)記為非托管數(shù)據(jù)
11、。創(chuàng)建托管代碼的步驟如下。首先選擇一個(gè)合適的編譯器,使之可以生成適合 CLR 執(zhí)行的代碼,并且使 用.NET Framework提供的資源。微軟公司目前提供4種兼容.NET Framework的語(yǔ) 言,并允許其他第三方公司提供.NET Framework語(yǔ)言。然后,再把應(yīng)用程序編譯為獨(dú)立于機(jī)器的中間語(yǔ)言。在執(zhí)行時(shí),必須對(duì)中間語(yǔ) 言代碼進(jìn)行 JIT 編譯,將其轉(zhuǎn)換為本機(jī)可執(zhí)行的程序。最后,在應(yīng)用程序執(zhí)行時(shí), 調(diào)用.NET Framework和CLR提供的資源。以上就是托管執(zhí)行過(guò)程,如圖1-4所示。用戶(hù)執(zhí)行中間語(yǔ)言用戶(hù)執(zhí)行中間語(yǔ)言圖 1-4 創(chuàng)建托管代碼的流程托管代碼具有許多優(yōu)點(diǎn),如下所示。語(yǔ)言的
12、互操作性使用IL不僅支持平臺(tái)無(wú)關(guān)性,還支持語(yǔ)言的互操作性,就是能將任何一種語(yǔ)言 編譯為中間代碼,編譯好的代碼可以與其他語(yǔ)言編譯過(guò)來(lái)的代碼交互操作。高性能在實(shí)際應(yīng)用中,IL比Java字節(jié)碼作用更大,IL總是即時(shí)編譯的,而Java字節(jié) 碼則僅僅是解釋性的。 JIT 并不是把整個(gè)程序依次編譯完(這樣將會(huì)使程序啟動(dòng)時(shí) 間十分漫長(zhǎng))而只是編譯程序調(diào)用的部分代碼。某些代碼編譯過(guò)依次后,就不需要 再重新編譯了。微軟公司認(rèn)為這個(gè)過(guò)程要比一開(kāi)始就編譯整個(gè)應(yīng)用程序代碼效率高一些,因?yàn)?任何應(yīng)用程序的大部分代碼實(shí)際上并不是在每次運(yùn)行時(shí)都執(zhí)行。這也解釋了為何托 管IL代碼的執(zhí)行速度幾乎與內(nèi)部機(jī)器代碼的執(zhí)行速度差不多。
13、平臺(tái)無(wú)關(guān)性托管代碼可以通過(guò).NET Framework即時(shí)編譯中間語(yǔ)言,因此開(kāi)發(fā)者編寫(xiě)的代碼 與具體的操作平臺(tái)沒(méi)有直接關(guān)聯(lián),只要平臺(tái)安裝了. NET Framework,貝I編寫(xiě)的代碼 就可以在該平臺(tái)上執(zhí)行。這一特點(diǎn)與Java語(yǔ)言十分類(lèi)似。5自動(dòng)內(nèi)存管理在使用傳統(tǒng)的編程語(yǔ)言(例如C、C+等)開(kāi)發(fā)程序時(shí),開(kāi)發(fā)者往往需要自行 編寫(xiě)代碼來(lái)管理內(nèi)存,為數(shù)據(jù)分配內(nèi)存空間并不斷地釋放一些無(wú)用的空間。自動(dòng)內(nèi)存管理是 CLR 在托管執(zhí)行過(guò)程中提供的服務(wù)之一。它可以由 .NET Framework 來(lái)管理內(nèi)存的分配和釋放,對(duì)于開(kāi)發(fā)者而言,這就意味著開(kāi)發(fā)托管應(yīng)用 程序時(shí)省略了管理內(nèi)存的步驟,避免了忘記釋放對(duì)象導(dǎo)致
14、的內(nèi)存泄漏。 釋放內(nèi)存 在托管模式下,每個(gè)應(yīng)用程序都有一組根,這些根包含全局對(duì)象指針、靜態(tài)對(duì) 象指針、線程堆棧中的局部變量和引用對(duì)象參數(shù)以及CPU寄存器。每個(gè)根或引用托 管堆中的對(duì)象,或設(shè)置為空。GC 可以訪問(wèn)由實(shí)時(shí) JIT 編譯器和運(yùn)行時(shí)維護(hù)的活動(dòng)根的列表,對(duì)照此列表檢 查應(yīng)用程序的根,并在此過(guò)程中創(chuàng)建一個(gè)圖表,包含所有可從這些根中訪問(wèn)的對(duì)象。 另外,GC的優(yōu)化引擎會(huì)根據(jù)所執(zhí)行的分配決定執(zhí)行回收的最佳時(shí)間,還會(huì)在執(zhí)行 回收時(shí)通過(guò)檢查應(yīng)用程序的根來(lái)確定程序不再使用的對(duì)象,并釋放該對(duì)象占據(jù)的內(nèi) 存。在回收的過(guò)程中, GC 檢查托管堆,查找無(wú)法訪問(wèn)對(duì)象所占據(jù)的地址空間塊, 發(fā)現(xiàn)無(wú)法訪問(wèn)的對(duì)象時(shí),就
15、是用內(nèi)存復(fù)制功能來(lái)壓縮內(nèi)存中可訪問(wèn)對(duì)象,釋放分配 給不可訪問(wèn)對(duì)象的地址空間塊。在壓縮了可訪問(wèn)對(duì)象的內(nèi)存后, GC 就會(huì)作出必要 的指針更正,一邊應(yīng)用程序的根指向新地址中的對(duì)象。注盍只有在GC發(fā)現(xiàn)大量無(wú)法訪問(wèn)對(duì)象時(shí),才會(huì)啟用壓縮內(nèi)存機(jī)制。如果托管堆中的所 有對(duì)象均未被回收,則不需要壓縮內(nèi)存。為了改進(jìn)性能, CLR 為單獨(dú)堆中的大型對(duì)象分配內(nèi)存, GC 會(huì)自動(dòng)釋放大型對(duì) 象的內(nèi)存。但是,為了避免移動(dòng)內(nèi)存中的大型對(duì)象,不會(huì)壓縮此內(nèi)存。為非托管資源釋放內(nèi)存除了為托管的資源釋放內(nèi)存外,CLR還可以為非托管資源釋放內(nèi)存。但是,這 一過(guò)程需要顯式清除。最常用的非托管資源類(lèi)型是封裝操作系統(tǒng)資源的對(duì)象,例如 文
16、件句柄、窗口句柄或網(wǎng)絡(luò)連接等。雖然 GC 可以跟蹤封裝非托管資源托管對(duì)象的生存期,但卻無(wú)法具體了解如何 清理資源。創(chuàng)建封裝非托管資源的對(duì)象時(shí),建議在公共 Dispose 方法中提供必要的 代碼以清理非托管資源。通過(guò)提供 Dispose 方法,對(duì)象的用戶(hù)可以在使用完對(duì)象后 顯式釋放其內(nèi)存。級(jí)別和性能為優(yōu)化GC的性能,托管堆分為3個(gè)生成級(jí)別:0、1和2。CLR的GC算法基 于以下幾個(gè)普遍原理。首先,壓縮托管堆的一部分內(nèi)存要比壓縮整個(gè)托管堆的速度快;其次,較新的 對(duì)象生存期較短,而較舊的對(duì)象生存期則較長(zhǎng);最后,較新的對(duì)象趨向于相互關(guān)聯(lián), 并且大致同時(shí)由應(yīng)用程序訪問(wèn)。CLR的GC將新對(duì)象存儲(chǔ)在0級(jí)托管堆中,在應(yīng)用程序生存期早期創(chuàng)建的對(duì)象 如果未被回收,則被升級(jí)并存儲(chǔ)在第1 級(jí)和第2級(jí)托管堆中。由于壓縮托管堆的一 部分要比壓縮整個(gè)托管堆快,所以此方案允許GC在每次執(zhí)行回收時(shí)釋放特定級(jí)別 的內(nèi)存,而不是整個(gè)托管堆的內(nèi)存。分配內(nèi)存在初始化新進(jìn)程時(shí),CLR會(huì)為進(jìn)程保留一個(gè)連續(xù)的地址空間區(qū)域。這個(gè)保留的 地址空間被稱(chēng)為托管堆(Manage Heap)。托管堆維護(hù)著一個(gè)指針,指向?qū)⒃诙阎蟹?配的下一個(gè)對(duì)象地址。最初,該指針
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 重建錦溪橋記解讀
- 醫(yī)院愛(ài)心天使
- 移動(dòng)數(shù)字經(jīng)濟(jì)匯報(bào)
- 《直播電商運(yùn)營(yíng)》課件 項(xiàng)目十一 復(fù)盤(pán)分析做好直播優(yōu)化
- 醫(yī)學(xué)教育創(chuàng)新發(fā)展路徑與實(shí)踐探索
- 網(wǎng)絡(luò)安全態(tài)勢(shì)感知與威脅情報(bào)共享創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書(shū)
- 醫(yī)學(xué)檢驗(yàn)技術(shù)專(zhuān)業(yè)介紹
- 農(nóng)副產(chǎn)品精深加工創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書(shū)
- 物聯(lián)網(wǎng)設(shè)備安全與加密技術(shù)創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書(shū)
- 電商網(wǎng)絡(luò)安全防護(hù)創(chuàng)新創(chuàng)業(yè)項(xiàng)目商業(yè)計(jì)劃書(shū)
- A外貿(mào)企業(yè)財(cái)務(wù)風(fēng)險(xiǎn)防范與管理策略探討
- 診所聯(lián)盟協(xié)議書(shū)
- 2024年鄂爾多斯市消防救援支隊(duì)招聘政府專(zhuān)職消防隊(duì)員考試真題
- 增值稅發(fā)票增量合同協(xié)議
- 未簽合同進(jìn)場(chǎng)協(xié)議
- 黨建讀書(shū)角管理制度
- 班組長(zhǎng)成本績(jī)效管理能力考試題庫(kù)-上(選擇題)
- 【仲量聯(lián)行】2024年重慶商業(yè)地產(chǎn)市場(chǎng)報(bào)告
- 離婚協(xié)議書(shū)正規(guī)打印電子版(2025年版)
- 汽車(chē)常見(jiàn)故障處理流程
- 茅臺(tái)文化知識(shí)
評(píng)論
0/150
提交評(píng)論