国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

Stan Lippman:C++/CLI全景體驗(yàn)(1)

2019-11-17 05:39:12
字體:
供稿:網(wǎng)友
最近我訪問了中國(guó)的上海和北京,參加在兩地舉辦的微軟 Tech-ED 技術(shù)大會(huì),在那里我非常榮幸地向大家介紹了我們?cè)?C++/CLI 方面的工作。大家的反饋非常之好,非凡是中國(guó)年輕一代程序員對(duì) C++/CLI 的熱愛和理解給我留下了深刻的印象。在那里,我還熟悉了來自上海的一位開發(fā)人員,同時(shí)也是一位技術(shù)作者, 李建忠 先生。我們經(jīng)過討論之后決定合作撰寫一系列 C++/CLI 方面的文章,并以“C++/CLI全景體驗(yàn)”專欄的形式獨(dú)家授權(quán)于中國(guó)《程序員》雜志發(fā)表。這篇短文旨在為大家簡(jiǎn)單介紹一下我們寫作這個(gè)專欄的一些背景——有點(diǎn)電影中“定場(chǎng)鏡頭”的味道。 面對(duì) C++/CLI ,很多人的第一個(gè)問題自然是“什么是 C++/CLI ”,我個(gè)人喜歡將其看作是位于靜態(tài)程序設(shè)計(jì)和動(dòng)態(tài)程序設(shè)計(jì)之間的一座橋梁。 C++/CLI 這個(gè)名稱本身就包含著一組術(shù)語——而其中最重要的術(shù)語卻是最不明顯的那一個(gè)。 首先來看第一個(gè)術(shù)語“ C++ ”,這當(dāng)然指的是由 Bjarne Stroustrup 在 Bell 實(shí)驗(yàn)室時(shí)發(fā)明的 C++ 編程語言。它所支持的是一種為代碼執(zhí)行速度和執(zhí)行體所占空間所高度優(yōu)化的靜態(tài)對(duì)象模型。除了堆內(nèi)存分配以外,它不支持在運(yùn)行時(shí)對(duì)應(yīng)用程序進(jìn)行任何的更改。它答應(yīng)我們對(duì)底層機(jī)器進(jìn)行無限的訪問,但對(duì)于正在運(yùn)行的程序中的活動(dòng)類型、以及相關(guān)的程序基礎(chǔ)構(gòu)造,它的訪問能力卻非常有限、或者根本就不可能。它是一門非常成功的編程語言,但是它卻不能適應(yīng)目前的 Web 編程環(huán)境以及相關(guān)的安全問題——這已經(jīng)成為目前程序設(shè)計(jì)中一個(gè)越來越重要的考量。 再來看第三個(gè)術(shù)語“ CLI ”,即通用語言基礎(chǔ)構(gòu)造( Common Language InfrastrUCture ),這是一個(gè)支持動(dòng)態(tài)組件編程模型的多層架構(gòu)。在許多方面,它所表示的對(duì)象模型和 C++ 的完全相反。在 CLI 中,存在一個(gè)運(yùn)行時(shí)軟件層(即虛擬執(zhí)行環(huán)境)運(yùn)行在應(yīng)用程序和底層操作系統(tǒng)之間,應(yīng)用程序代碼對(duì)底層機(jī)器的訪問會(huì)受到相當(dāng)嚴(yán)格的限制;事實(shí)上, CLI 根本不答應(yīng)安全環(huán)境中的代碼進(jìn)行這樣的訪問。但另一方面, CLI 卻答應(yīng)我們對(duì)正在運(yùn)行的程序中的活動(dòng)類型、以及相關(guān)的程序基礎(chǔ)構(gòu)造進(jìn)行完全的訪問,甚至答應(yīng)我們動(dòng)態(tài)構(gòu)造額外的類型和程序基礎(chǔ)構(gòu)造。這些靈活性的獲得當(dāng)然伴隨有相當(dāng)?shù)目臻g(執(zhí)行體所占空間)和時(shí)間(程序執(zhí)行效率)代價(jià),但是它卻解決了日益增長(zhǎng)的基于連接的計(jì)算環(huán)境中所面臨的問題和需要。 最后,再來看第二個(gè)術(shù)語,即中間的斜線“ / ”,它往往為人們所忽略。其表示對(duì) C++ 和 CLI 的一種綁定( binding ),它正是 C++/CLI 設(shè)計(jì)的焦點(diǎn)所在。據(jù)此,對(duì)于“什么是 C++/CLI ”這一問題可能的一種答案便是“它是對(duì)靜態(tài) C++ 對(duì)象模型和動(dòng)態(tài) CLI 組件模型的一種綁定”。 對(duì)于 C++/CLI ,一個(gè) C++ 程序員只需要將其添加到她 [ 譯注 1] 已有的編程工具箱中就可以了。要成為一個(gè) C++/CLI 程序員,你無需放棄任何已有的東西,雖然你要步入一個(gè)新的技術(shù)世界,你仍然需要學(xué)習(xí)它——但愿你能享受這一過程,至少我知道我是這樣的。由此觀之,我們還可以將 C++/CLI 看作是一扇通往另一個(gè)世界的大門。 C++/CLI 將動(dòng)態(tài)的、基于組件的編程模型和 ISO-C++ 集成在了一起,這種集成非常類似于我們當(dāng)年在 Bell 實(shí)驗(yàn)室對(duì)使用模板的泛型編程和當(dāng)時(shí)的 C++ 所做的集成。在兩種情況下,你已有的代碼投資和編碼經(jīng)驗(yàn)都將得到保留。這是我們?cè)O(shè)計(jì) C++/CLI 時(shí)一個(gè)基本的需求。 通用語言基礎(chǔ)構(gòu)造( CLI )是一個(gè)多層的體系架構(gòu),它為所有 CLI 語言提供了各種各樣的服務(wù)。例如 CLI 中定義了一個(gè)通用類型系統(tǒng)( Common Type System ,簡(jiǎn)稱 CTS ),而各個(gè) CLI 語言都提供了自己對(duì) CTS 的一個(gè)映射。該類型系統(tǒng)由一個(gè)根基類開始被組織為一個(gè)完整的類繼續(xù)體系。實(shí)際上,每一個(gè) CLI 類型都是一個(gè)類——不僅包括像 integer 、 double 這樣的數(shù)值類型,而且也包括字面常量( literal constant )。每一個(gè) CLI 類型(或者值)都表示一種 Object (所有 CLI 類型的根基類),比如數(shù)值 3.14159 、比如字符串常量 "Homer Simpson" 。 單一的根基類為運(yùn)行時(shí)類型查詢和代碼生成(通常被稱為反射)提供了支持機(jī)制 [ 譯注 2] ,這是 ISO-C++ 所缺乏的。我們將在今后一系列文章中具體討論它們給 CLI 帶來的動(dòng)態(tài)編程特性。 除此之外, CLI 還支持一種被稱作特性元數(shù)據(jù)( attribute metadata )的構(gòu)造,它答應(yīng)我們定義一些特性類,然后將其關(guān)聯(lián)在 CLI 類型和當(dāng)前正在運(yùn)行的程序構(gòu)造上——這有效地?cái)U(kuò)展了內(nèi)建于 CLI 中的類型和程序構(gòu)造。這些用戶定義的特性也可以通過反射機(jī)制來獲得,應(yīng)用程序則可以根據(jù)它們的值來進(jìn)行條件邏輯判定。這也是 C++/CLI 為 C++ 帶來的動(dòng)態(tài)組件編程的一部分。再次強(qiáng)調(diào)一遍,類型反射和特性將在我們的專欄中得到深入的討論。 那么,對(duì)于大家來說怎樣學(xué)習(xí) C++/CLI 呢?學(xué)習(xí) C++/CLI 的其中一個(gè)要點(diǎn)便是學(xué)習(xí)底層的通用類型系統(tǒng)( CTS ),它包括以下三種類型: 1. 多態(tài)引用類型,其用于所有的類繼續(xù)。我們將在早期的一些專欄文章中討論它們。 2. 非多態(tài)值類型,其用于實(shí)現(xiàn)一些類似于數(shù)值類型那樣的、對(duì)運(yùn)行時(shí)效率要求比較高的類型。我們將其放在引用類型之后討論。
3. 抽象接口類型,其用于定義一組供引用類型或者值類型實(shí)現(xiàn)的操作。接口為多繼續(xù)提供了一種別樣的設(shè)計(jì)模式。我們也將有一系列專欄文章來討論它們。 將 CTS 映射為一組語言內(nèi)置類型對(duì)于所有的 CLI 語言都適用,雖然各種語言所使用的語法各不相同。這也是一門 CLI 語言所要面對(duì)的第一個(gè)設(shè)計(jì)層面。例如,在 C# 中,我們可以用以下代碼來定義一個(gè)抽象基類型 Shape (一些具體的幾何對(duì)象將繼續(xù)自它)。 public abstract class Shape {…} 而在 C++/CLI 中,我們用下面的代碼來定義同樣的類型。 public ref class Shape abstract {…}; 除了語法差異之外,兩種聲明的實(shí)際表示完全相同。類似地,在 C# 中,我們可以用下面的代碼來定義一個(gè)具體類 Point2D 。 public struct Point2D {…} 而在 C++/CLI 中,我們用下面的代碼來定義同樣的類型。 public value class Point2D {…}; 我們對(duì)語法的選擇基于如下的出發(fā)點(diǎn):以一種直觀的設(shè)計(jì)視角將 CLI 類型和 ISO-C++ 類型緊密地集成在一起。 因此,簡(jiǎn)單地說一種語言比另一種語言更接近底層 CLI 并不正確。相反,每一門 CLI 語言都只是表達(dá)了自己對(duì)底層 CLI 對(duì)象模型的一種視圖。 學(xué)習(xí) C++/CLI 的第二個(gè)要點(diǎn)是學(xué)習(xí)我們選擇直接提供給程序員操作的那些底層 CLI 元素。例如, CLI 為所有語言都提供了垃圾收集服務(wù)。一門語言不能選擇是否支持垃圾收集,而只能選擇如何更好地提供該服務(wù)。
在 CLI 中,一個(gè)引用類型的所有對(duì)象都只能被分配在 CLI 托管堆上。這意味著 C++/CLI 支持兩種動(dòng)態(tài)堆——本地堆(沒有任何形式的自動(dòng)內(nèi)存回收機(jī)制),和 CLI 托管堆。對(duì)于這兩種動(dòng)態(tài)堆,開發(fā)人員通常要用某種形式的 new 操作符來分配對(duì)象;假如操作成功,對(duì)象在堆中初始位置的地址將被返回。但是兩者又有所區(qū)別,這是因?yàn)?CLI 托管堆中對(duì)象的位置有可能在垃圾收集器的清除以及隨后的壓縮中被重新調(diào)整。假如一個(gè)對(duì)象的位置被重新調(diào)整,那么 CLI 運(yùn)行時(shí)中所含的其中一項(xiàng)服務(wù)會(huì)透明地更新所有引用該對(duì)象的指代品( thingee )。 這就使得我們面臨著一種困難的選擇:我們是將這些指代品稱為指針,并且繼續(xù)用指針的語法來表示它們呢?還是引入一種新的類似的語法來表示它們需要非凡的處理?我們最后決定采用后者,看下面的代碼: N *pn = new N; R ^rn = gcnew R; 這里, N 表示一個(gè)本地類型,而 R 表示一個(gè) CLI 引用類型,帽子狀的符號(hào)( ^ )表示相關(guān)的地址是一個(gè)托管堆上的追蹤句柄( tracking handle )——也就是說,對(duì)象位置的任何重新調(diào)整都會(huì)被 CLI 所追蹤,相應(yīng)的句柄也會(huì)被透明地更新。其中要害字 gcnew 在這里被用作與 CLI 托管堆打交道的 new 表達(dá)式。 值類型事實(shí)上也可以位于托管堆上,雖然這并非必須。當(dāng)它們作為一個(gè)引用類型的成員時(shí),就會(huì)出現(xiàn)這種情況。假如我們答應(yīng)獲取一個(gè)引用類型內(nèi)部成員的地址,那么本地指針也是不合適的,因?yàn)檫@些成員的位置也需要被追蹤。一種解決方法是簡(jiǎn)單地禁止該項(xiàng)功能。這樣語言當(dāng)然會(huì)變得更加簡(jiǎn)單,但是同時(shí)語言也會(huì)變得更弱——例如我們將不能通過增長(zhǎng)元素的地址值來遍歷 CLI 數(shù)組,這是因?yàn)?CLI 數(shù)組是一個(gè)引用類型,其內(nèi)的元素都位于托管堆上。不提供這樣的功能意味著 CLI 數(shù)組將不能適用于標(biāo)準(zhǔn)模板庫( STL )中的 iterator 模式以及泛型算法。對(duì)于一個(gè) C++ 程序員來說,這是不可接受的。 支持獲取可能位于托管堆中的值類型的地址同樣需要引入一種追蹤指針,我們稱之為追蹤內(nèi)部指針( tracking interior pointer )。另外,我們還支持追蹤引用( tracking reference )這樣的概念——它具有類似本地引用的別名語義,但是它會(huì)在必要的時(shí)候被 CLI 透明地更新。最后,我們還支持一種固定指針( pinning pointer )的概念,它可以在該指針的作用范圍內(nèi)阻止垃圾收集器移動(dòng)其所引用的對(duì)象。 這些新的符號(hào)及其表示的復(fù)雜的間接類型是在我們對(duì)托管堆反復(fù)學(xué)習(xí)和熟悉之后產(chǎn)生的。面對(duì)生存期短暫的托管堆對(duì)象,我們需要某種精巧的方式來熟悉和使用它們,我們相信這些額外的間接類型可以給大家很多幫助。我們將在今后的專欄文章中具體討論它們。 我們?cè)诖藢?duì)一門 CLI 語言所選擇的第二個(gè)設(shè)計(jì)層面表示了其對(duì)底層 CLI 實(shí)現(xiàn)模型的一層映射。選擇什么樣的映射取決于該編程語言定位于什么樣的程序及程序員模型。當(dāng)你選擇一門 CLI 語言進(jìn)行編程的時(shí)候,你實(shí)際上也是在選擇遵從一種程序員模型。我們對(duì)于 C++/CLI 程序員的定位是那些歷練較深的系統(tǒng)程序員,這些程序員通常所面對(duì)的任務(wù)是為高層的

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 沽源县| 克什克腾旗| 拉萨市| 定结县| 上杭县| 虎林市| 汉源县| 得荣县| 新宾| 仁布县| 离岛区| 肇东市| 海门市| 崇仁县| 南安市| 平泉县| 元阳县| 卢氏县| 新平| 连平县| 海伦市| 南召县| 宣汉县| 皋兰县| 吉隆县| 临潭县| 随州市| 额济纳旗| 安仁县| 黄石市| 濮阳市| 大厂| 信宜市| 鹤岗市| 略阳县| 蓝山县| 渝中区| 北京市| 黑山县| 介休市| 元朗区|