麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

CLRviaC#深解筆記一-CLR&C#基礎(chǔ)概念

2019-11-14 13:39:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
寫在前言
 
.Net Framework并不是Win 32 API 和COM上的一個(gè)抽象層。
 
某種程度上,它是自己的操作系統(tǒng),有自己的內(nèi)存管理器,自己的安全系統(tǒng),自己的文件加載器,自己的錯(cuò)誤處理機(jī)制,自己的應(yīng)用程序隔離邊界(AppDomains),自己的線程處理模型等。
隨著多核計(jì)算機(jī)越來(lái)越普遍,線程處理,并發(fā)執(zhí)行,并行結(jié)構(gòu),同步等方面的重要性日益凸顯。
 
CLR的執(zhí)行模型
 
公共語(yǔ)言運(yùn)行時(shí) CLR Common Language Runtime
是一個(gè)運(yùn)行時(shí)環(huán)境,保證應(yīng)用和底層操作系統(tǒng)之間必要的分離,是.NET Framework的主要執(zhí)行引擎。是可由面向CLR的多種編程語(yǔ)言使用的“運(yùn)行時(shí)”。CLR的核心功能(內(nèi)存管理、程序集加載、安全性、異常處理和線程同步等)由面向CLR的所有語(yǔ)言使用。CLR不關(guān)心開(kāi)發(fā)人員使用哪一種語(yǔ)言來(lái)寫源代碼。也就是說(shuō)挑選編程語(yǔ)言時(shí),應(yīng)該選擇最容易表達(dá)自己意圖的語(yǔ)言。理論上,可以用任何語(yǔ)言編寫代碼,只要編譯器是面向CLR的就可以了。
 
編譯器
可以視為語(yǔ)法檢查器和“正確代碼”的分析器。它們檢查源代碼,確定你寫的一切都有意義,然后輸出對(duì)你的意圖進(jìn)行描述的代碼。不同的編程語(yǔ)言,有著不同的語(yǔ)法。不要低估這個(gè)選擇的價(jià)值,也許會(huì)節(jié)省大量的開(kāi)發(fā)時(shí)間。
Microsoft已經(jīng)創(chuàng)建好幾個(gè)面向“運(yùn)行時(shí)”的語(yǔ)言編譯器,包括:C++/CLI、C# (C sharp)、Visual Basic、F#、Iron Python、Iron Ruby以及一個(gè)“中間語(yǔ)言”(Intermediate Language, IL)匯編器。
 
IL代碼 (托管代碼)
本地代碼編譯器是面向特定CPU架構(gòu)的代碼。而每個(gè)面向CLR的編譯器生成的都是IL代碼 (中間語(yǔ)言代碼 。IL代碼有時(shí)稱為托管代碼,因?yàn)镃LR要管理它的執(zhí)行。它明顯的優(yōu)勢(shì)在于它是CPU無(wú)關(guān)的。
 
元數(shù)據(jù)
IL代碼由面向CLR的編譯器產(chǎn)生,但它并不是編譯器產(chǎn)生的提供給運(yùn)行時(shí)僅有的東西。編譯器同樣產(chǎn)生有關(guān)原始代碼的元數(shù)據(jù)。它提供給CLR關(guān)于代碼更多的東西,例如:各種類型的定義、各種類型成員的簽名以及其他數(shù)據(jù)?;旧希獢?shù)據(jù)是類型庫(kù)、注冊(cè)表內(nèi)容和其它用于COM的信息。盡管如此,元數(shù)據(jù)還是直接和執(zhí)行代碼合并在一起,并不處在 隔離的位置。
簡(jiǎn)單地說(shuō),元數(shù)據(jù)是整個(gè)microsoft .net framework開(kāi)發(fā)平臺(tái)的關(guān)鍵,它實(shí)現(xiàn)了編程語(yǔ)言、類型和對(duì)象的無(wú)縫集成。
 
程序集 (assembly)
一個(gè)抽象的概念。首先,他是一個(gè)或多個(gè)模塊/資源文件的邏輯性分組。其次,程序集是重用、安全性以及版本控制的最小單元。取決于你對(duì)編譯器或者工具的選擇,即可以生成單文件程序集,也可以生成多文件程序集。在CLR的世界中,程序集相當(dāng)于一個(gè)“組件”。利用“程序集”這個(gè)概念性的東西,可以將一組文件當(dāng)成一個(gè)單獨(dú)的實(shí)體來(lái)對(duì)待。
對(duì)于一個(gè)可重用的、可保護(hù)的、可版本控制的組件,程序集把它的邏輯表示和物理表示分開(kāi)。具體如何將代碼和資源劃分到不同的文件中,完全取決于個(gè)人。程序集的模塊中,還包含與引用的程序集有關(guān)的信息。這些信息使程序集能夠自描述(self-describing)。換句話說(shuō),CLR能夠判斷出為了執(zhí)行程序集中代碼,程序集的直接依賴對(duì)象(immediate dependency)是什么。
 
托管程序集同時(shí)包含元數(shù)據(jù)IL。IL是與CPU無(wú)關(guān)的機(jī)器語(yǔ)言,是Microsoft在請(qǐng)教了外面的幾個(gè)商業(yè)及學(xué)術(shù)性語(yǔ)言/編譯器的作者之后,費(fèi)勁心思開(kāi)發(fā)出來(lái)的。IL比大多數(shù)CPU機(jī)器語(yǔ)言都要高級(jí)。IL能訪問(wèn)和操作對(duì)象類型,并提供了指令來(lái)創(chuàng)建和初始化對(duì)象,調(diào)用對(duì)象上的虛方法以及直接操作數(shù)據(jù)元素。甚至可以提供拋出和捕捉異常的指令來(lái)實(shí)現(xiàn)錯(cuò)誤處理。可將IL視為一種面向?qū)ο蟮臋C(jī)器語(yǔ)言
 
重要的提示:
允許在不同編程語(yǔ)言之間方便地切換,同時(shí)又保持緊密集成,這事CLR的一個(gè)非常出色的特性。遺憾的是,許多開(kāi)發(fā)人員都忽視了這一特性。例如,C#和Visual Basic等語(yǔ)言能很多地執(zhí)行I/O操作,APL語(yǔ)言能很好地執(zhí)行高級(jí)工程或者金融計(jì)算。通過(guò)CLR,應(yīng)用程序的I/O部分可用C#編寫,工程計(jì)算部分則換用APL編寫。CLR在這些語(yǔ)言之間提供了其他技術(shù)無(wú)法媲美的集成度,使“混合語(yǔ)言編程”成為許多開(kāi)發(fā)項(xiàng)目的一個(gè)值得慎重考慮的選擇。
 
執(zhí)行一個(gè)方法,首先必須把它的IL轉(zhuǎn)換成本地CPU指令,這是CLR的JIT (just-in-time或者“即時(shí)”)編譯器的職責(zé)。JITCompiler 是CLR的一個(gè)組件,稱為JITer 或者JIT編譯器。它在定義(某一個(gè)類型)程序集的元數(shù)據(jù)中查找被調(diào)用的方位的IL, 接著驗(yàn)證IL代碼,并將IL代碼編譯成本地CPU指令。本地CPU指令被保存到一個(gè)動(dòng)態(tài)分配的內(nèi)存塊中。
 
 
 
一個(gè)方法只有在首次調(diào)用時(shí)才會(huì)造成一些性能損失。以后對(duì)該方法的所有調(diào)用都以本地代碼的形式全速運(yùn)行,無(wú)需重新驗(yàn)證IL并把它編譯成本地代碼。
 
JIT編譯器將本地CPU指令存儲(chǔ)到動(dòng)態(tài)內(nèi)存中,一旦應(yīng)用程序終止,編譯好的代碼也會(huì)被丟棄。所以,如果將來(lái)再次運(yùn)行應(yīng)用程序,或者同時(shí)啟動(dòng)應(yīng)用程序的兩個(gè)實(shí)例(使用兩個(gè)不同的操作系統(tǒng)進(jìn)程),JIT編譯器必須再次將IL編譯成本地指令。
對(duì)于大多數(shù)應(yīng)用程序來(lái)說(shuō),因JIT編譯器造成的性能損失并不顯著。大多數(shù)應(yīng)用程序都會(huì)反復(fù)調(diào)用相同的方法。在應(yīng)用程序運(yùn)行期間,這些方法只會(huì)對(duì)性能造成一次性的影響。另外,在方法內(nèi)部花費(fèi)的時(shí)間很有可能比花在調(diào)用方法上的時(shí)間多得多。
 
 
還需要特別注意的是:
CLR的JIT編譯器會(huì)對(duì)代碼進(jìn)行優(yōu)化,這類似于非托管的C++編譯器的后端所做的工作。同樣地,可能花費(fèi)較多的時(shí)間來(lái)生成優(yōu)化的代碼。優(yōu)化之后的代碼將獲得更加出色的性能。
非托管的飯嗎是針對(duì)一種具體的CPU平臺(tái)編譯的,一旦調(diào)用,代碼直接就能執(zhí)行。但是在托管環(huán)境中,代碼的編譯是分成兩個(gè)階段完成的。首先,編譯器遍歷源代碼,做盡可能多的工作來(lái)生成IL代碼,而為了真正的執(zhí)行調(diào)用,這些IL代碼本身必須在運(yùn)行時(shí)編譯成本地CPU指令,這需要分配更多的內(nèi)存,并需要花費(fèi)額外的CPU的時(shí)間。實(shí)踐確實(shí)表明,運(yùn)行時(shí)發(fā)生的第二個(gè)編譯階段會(huì)影響性能,會(huì)分配動(dòng)態(tài)內(nèi)存。但是,Microsoft進(jìn)行了大量性能優(yōu)化的工作,將這些額外的開(kāi)銷保持在最低限度。
 
IL和驗(yàn)證
IL是基于棧的。由于IL沒(méi)有提供操作寄存器的指令,所以人們可以很容易的創(chuàng)建新的語(yǔ)言和編譯器,生成面向CLR的代碼。
IL指令還是“無(wú)類型”(typeless)的。例如,IL提供了一個(gè)add指令,它的作用是將壓入棧的最后兩個(gè)操作數(shù)加到一起。add指令不分32位和64位版本。
IL的亮點(diǎn)是它對(duì)底層CPU的抽象,但這并非它的最大優(yōu)勢(shì)。IL提供的最大的優(yōu)勢(shì)在于應(yīng)用程序的健壯性和安全性。將IL編譯成本地CPU指令時(shí),CLR會(huì)執(zhí)行一個(gè)名為驗(yàn)證(verification)的過(guò)程,這個(gè)過(guò)程會(huì)檢查高級(jí)IL代碼,確定代碼所做的一切都是安全的。如,驗(yàn)證會(huì)核實(shí)調(diào)用的每個(gè)方法多有正確數(shù)量的參數(shù),傳給每個(gè)方法的參數(shù)都具有正確的類型,每個(gè)方法的返回值都得到了正確的使用,每個(gè)方法都具有一個(gè)返回語(yǔ)句等等。在托管模塊的元數(shù)據(jù)中,包含了要由驗(yàn)證過(guò)程使用的所有方法和類型信息。
 
 
將每個(gè)windows進(jìn)程都放到一個(gè)獨(dú)立的地址空間,將獲得健壯性和穩(wěn)定性,一個(gè)進(jìn)程無(wú)法干擾另一個(gè)進(jìn)程。通過(guò)驗(yàn)證 托管代碼,確保代碼不會(huì)不正確的訪問(wèn)內(nèi)存,不會(huì)干擾到另一個(gè)應(yīng)用程序的代碼。這樣一來(lái),就可以放心地將多個(gè)托管應(yīng)用程序放到一個(gè)Windoes虛擬地址空間中運(yùn)行。
CLR提供了在 一個(gè)操作系統(tǒng)進(jìn)程中執(zhí)行多個(gè)托管應(yīng)用程序的能力。每個(gè)托管的應(yīng)用程序都在一個(gè)AppDomain中執(zhí)行。默認(rèn)情況下,每個(gè)托管的exe文件都在它自己的獨(dú)立地址空間中運(yùn)行,這個(gè)地址空間只有一個(gè)AppDomain。然而,CLR的宿主進(jìn)程(比如IIS或者M(jìn)S SQL Server)  可決定在單個(gè)操作系統(tǒng)進(jìn)程中運(yùn)行多個(gè)AppDomain。
 
通用類型系統(tǒng)
CLR是完全圍繞類型展開(kāi)的,這一點(diǎn)到現(xiàn)在為止應(yīng)該很明顯了。類型為應(yīng)用程序和其他類型公開(kāi)了功能。通過(guò)類型,用一種編程語(yǔ)言寫的代碼能與另一種語(yǔ)言寫的代碼溝通。由于類型是CLR的根本,所以Microsoft指定了一個(gè)正式的規(guī)范,叫做“通用類型系統(tǒng)”(Common Type System, CTS), 描述類型定義和行為。利用了CTS指定的規(guī)則,程序集為一個(gè)類型建立了可視邊界,CLR則強(qiáng)制(貫徹)了這些規(guī)則。
 
事實(shí)上,并不需要去學(xué)習(xí)CTS規(guī)則本省,你選擇的語(yǔ)言會(huì)采用你熟悉的公式公開(kāi)它自己的語(yǔ)言語(yǔ)法與類型規(guī)則。通過(guò)編譯來(lái)生成程序集時(shí),它會(huì)將語(yǔ)言特有的語(yǔ)法映射到IL -- 也就是CLR的“語(yǔ)言”。
 
CLR讓我們意識(shí)到:“代碼的語(yǔ)言”和“代碼的行為”。不同語(yǔ)言可以定義系統(tǒng)的類型,添加相同的成員,語(yǔ)法有不同,但是類型的行為都是完全一致的,因?yàn)樽罱K由CLR的CTS來(lái)定義類型的行為。
 
 
--------------------------------------------------------------------
 
 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: jizzjizz中国人少妇中文 | 精品国产一区二区三区久久久狼牙 | 精品av在线播放 | 一级爱片 | 亚洲第一成人在线观看 | 亚洲精品永久视频 | 蜜桃视频在线免费播放 | 最新一区二区三区 | 玖玖视频精品 | 国产一级一级片 | 亚洲电影免费观看国语版 | 在线播放黄色片 | av在线播放免费观看 | 91精品国产一区二区三区四区在线 | 欧美成人免费在线视频 | 九九热精品在线视频 | 黄视频在线网站 | 欧美一极视频 | 免费激情视频网站 | 色视频在线 | 亚洲爱爱图 | 国产二区三区在线播放 | 91网站永久免费看 | 成人 精品 | 一级毛片特黄 | 一区二区三区欧美精品 | 黄视频网站免费观看 | 欧美日韩在线看片 | 牛牛a级毛片在线播放 | 精品免费国产一区二区三区 | 欧美特一级片 | 91精品一区二区综合在线 | 久久精品国产一区二区 | 国产91一区二区三区 | 极品国产91在线网站 | 国产一区二区免费 | 全黄性色大片 | 亚洲欧美国产视频 | 日本不卡二区 | 国产黄网 | 在线观看国产一区二区 |