• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Legend

            談?wù)凜++中的抽象

            李建忠 | 程序無(wú)痕

            http://www.lijianzhong.com/?p=7

            這兩天抽空在審校鄧際鋒(soloist)先生翻譯的Bjarne Stroustrup為Embedded software and systems. 2005寫(xiě)作的《 Abstraction and the C++ machine model》一文。結(jié)合自己一段時(shí)間的C++培訓(xùn)經(jīng)驗(yàn),對(duì)C++的抽象有了更多的思考,在此作一簡(jiǎn)單總結(jié),與朋友們交流。

            為了將問(wèn)題談清楚,首先來(lái)談?wù)劤橄螅ˋbstraction)這個(gè)詞,wikipedia對(duì)Abstraction有如下解釋?zhuān)?/p>

            Abstraction is the process of reducing the information content of a concept, typically in order to retain only information which is relevant for a particular purpose.

            簡(jiǎn)單來(lái)說(shuō),就是“去粗取精”,或者“去不相關(guān),取相關(guān)”。

            這“一去一取”的目的何在?wikipedia也給了很好的解釋?zhuān)?/p>

            Complexity reduction

            Abstraction typically results in complexity reduction leading to a simpler conceptualization of a domain in order to facilitate processing or understanding of many specific scenarios in a generic way

            總體而言,前面摘自wikipedia的兩段話非常扼要地說(shuō)明了“抽象”在我們認(rèn)識(shí)事物過(guò)程中所扮演的關(guān)鍵角色——推開(kāi)來(lái)說(shuō),人對(duì)世界的認(rèn)識(shí),實(shí)際上就是一個(gè)不斷“抽象”的過(guò)程。“抽象”的力量普遍存在于各種學(xué)科,各個(gè)領(lǐng)域中。當(dāng)然,具體到各個(gè)學(xué)科領(lǐng)域還是有一些具體的差別。

            好,下面來(lái)具體談?wù)凜++中的抽象,或者說(shuō)編程語(yǔ)言的抽象。從最根本性的目的來(lái)言,計(jì)算機(jī)就是對(duì)人的一種抽象——當(dāng)然Turing的這個(gè)美好愿望要靠程序員來(lái)慢慢實(shí)現(xiàn)。編程語(yǔ)言在這個(gè)過(guò)程中扮演的角色就是將 “計(jì)算機(jī)容易理解的東西”抽象為“人容易理解的東西”。結(jié)合目前主流的編程語(yǔ)言(C++, C#, Java, VB.NET 等),舉些例子具體來(lái)談其中的抽象,就是讓程序員:

            基本的編程抽象
            * 忘掉數(shù)據(jù)(無(wú)論對(duì)象/指針/引用)在內(nèi)存中的地址,將精力集中在數(shù)據(jù)所表達(dá)的類(lèi)型實(shí)例概念上

            面向過(guò)程編程的抽象
            * 忘掉函數(shù)調(diào)用的壓棧/出棧細(xì)節(jié),將精力集中在函數(shù)之間的調(diào)用關(guān)系上

            基于對(duì)象編程的抽象
            * 忘掉對(duì)象中數(shù)據(jù)成員(字段)的內(nèi)存布局,將精力集中在數(shù)據(jù)成員對(duì)對(duì)象狀態(tài)的表達(dá)上
            * 忘掉對(duì)象中函數(shù)成員(方法)的綁定機(jī)制以及this指針,將精力集中在函數(shù)成員對(duì)對(duì)象行為的表達(dá)上 

            面向?qū)ο缶幊痰某橄?/strong>
            * 忘掉類(lèi)繼承下子類(lèi)對(duì)象中數(shù)據(jù)成員的內(nèi)存布局,將精力集中在繼承所帶來(lái)的子類(lèi)化的概念上
            *忘掉虛函數(shù)相關(guān)的虛表vTable結(jié)構(gòu),將精力集中在虛函數(shù)所帶來(lái)的動(dòng)態(tài)多態(tài)的概念上 

            泛型編程的抽象
            * 忘掉模板的各種編譯與綁定機(jī)制,將精力集中在用一組抽象的概念來(lái)表達(dá)一組類(lèi)型的需求條件上

            面向組件編程的抽象
            * 忘掉組件平臺(tái)背后的元數(shù)據(jù)等機(jī)制,將精力集中在組件化模塊所表達(dá)的黑盒概念上

             

            這些“忘掉…而將精力集中在…上”的“抽象”放到C#, Java, VB.NET 等其他語(yǔ)言中,很多程序員都可以輕易做到——換句話說(shuō),可以不關(guān)心“各種抽象背后所映射的底層機(jī)器模型”,只關(guān)心語(yǔ)言表達(dá)的“抽象”,而照樣開(kāi)發(fā)出合格甚至優(yōu)秀的程序。這樣,這些語(yǔ)言下的程序員基本上遵循下面的學(xué)習(xí)路徑,就可以成為一個(gè)合格的程序員:

            掌握語(yǔ)言語(yǔ)法構(gòu)造–>掌握設(shè)計(jì)思想(即抽象)–>開(kāi)發(fā)應(yīng)用程序 或者 程序庫(kù)

            但是如果放到C++,一個(gè)程序員無(wú)論如何不能夠做到“忘掉…而將精力集中在…上”的“抽象”,否則連寫(xiě)出哪怕是正確運(yùn)行的程序都很難。一個(gè)合格的C++程序員必須遵循下面的學(xué)習(xí)路徑:

            掌握語(yǔ)言語(yǔ)法構(gòu)造–>掌握各種抽象所映射的底層機(jī)器模型–>掌握設(shè)計(jì)思想(即抽象)–>開(kāi)發(fā)應(yīng)用程序 或者 程序庫(kù)

            這就是C++中“抽象”的問(wèn)題!C++程序員無(wú)法擺脫“各種抽象所映射的底層機(jī)器模型”而將精力單獨(dú)集中于“抽象”上——換句話說(shuō),C++的抽象性和它的底層性是C++的一體兩面,不能夠像其他語(yǔ)言一樣輕易分開(kāi)。

            那么是什么導(dǎo)致了C++這種獨(dú)特的“不夠徹底的抽象”呢?這種“不夠徹底的抽象”到底有什么優(yōu)劣呢?

            Bjarne Stroustrup 在《 Abstraction and the C++ machine model》一文中重復(fù)了他在設(shè)計(jì)C++時(shí)一貫的哲學(xué):

            * 在切實(shí)可行的最高抽象層次上編程 Work at the highest feasible level of abstraction

            所謂“切實(shí)可行”就是不損及效率,靈活,管理……簡(jiǎn)單地說(shuō)就是C++希望在獲得“抽象”的同時(shí),仍然盡可能地不損失任何效率。C++一路發(fā)展過(guò)來(lái),確實(shí)達(dá)到了這個(gè)目標(biāo)。這正是C++“不夠徹底的抽象”之原因。

            這種“不夠徹底的抽象”當(dāng)然為C++贏得了巨大的成功,使得C++成為系統(tǒng)級(jí)軟件的首選語(yǔ)言,是任何其它一門(mén)語(yǔ)言都無(wú)法望其項(xiàng)背,參見(jiàn)這些重量級(jí)的軟件http://public.research.att.com/~bs/applications.html

            但這也使得C++在程序員圈子里一直是公認(rèn)的難學(xué)難用。孟巖在C++開(kāi)源程序庫(kù)評(píng)話(節(jié)選) 中談到用C++寫(xiě)優(yōu)秀的程序庫(kù)非常難這一事實(shí)。可惜只談了“難”的結(jié)論,沒(méi)有談“難”的原因。事實(shí)上,C++并不僅僅在寫(xiě)程序庫(kù)時(shí)難,用C++寫(xiě)應(yīng)用程序同樣不會(huì)輕松–相對(duì)其他語(yǔ)言而談,只是C++寫(xiě)程序庫(kù)要同時(shí)考慮的“抽象性和底層性”思維力度更大罷了。所有的根源都在于C++這種“不夠徹底的抽象”。

            我不知道“C++的抽象性和底層性這種一體兩面的緊密結(jié)合”會(huì)在多大程度上損傷C++程序員學(xué)習(xí)的積極性,并從而影響C++應(yīng)用的popularity,以及影響軟件項(xiàng)目的質(zhì)量和進(jìn)度。 但至少對(duì)于目前希望成為C++程序員的朋友來(lái)講,必須認(rèn)識(shí)到“需要同時(shí)掌握C++語(yǔ)言抽象性和底層性”這個(gè)事實(shí),才能將C++徹底掌握好,這也是我在目前不管是給企業(yè),還是個(gè)人學(xué)員講授C++培訓(xùn)課程時(shí)經(jīng)常強(qiáng)調(diào)的。

            當(dāng)然,C++社區(qū)也意識(shí)到了這個(gè)問(wèn)題,C++0x 也確立了一項(xiàng)“同時(shí)為專(zhuān)家和新手提供支持”的原則,參見(jiàn)Bjarne Stroustrup在去年C++軟件技術(shù)大會(huì)上的發(fā)言《C++0x概覽》。但是從目前來(lái)看,這個(gè)原則貫徹的并不能令人滿意。例如,我不太相信如果一個(gè)C++程序員不清楚理解指針,對(duì)象,模板,concept(C++0x中的新東西)等所映射的底層機(jī)器模型,就能夠輕松寫(xiě)出Bjarne在《C++0x概覽》一文中最后演示的那個(gè)draw_all()的例子——雖然Bjarne Stroustrup期望所有C++程序員都認(rèn)為它“如此簡(jiǎn)單!”

            也許我們本來(lái)就不應(yīng)該對(duì)C++期望太多,既想讓它有極致的效率來(lái)構(gòu)造系統(tǒng)軟件,又想讓它有純?nèi)坏某橄髞?lái)滿足變化無(wú)常的一般性軟件開(kāi)發(fā)——世界上好像沒(méi)有十全十美的事情,當(dāng)然也沒(méi)有十全十美的語(yǔ)言:)

            posted on 2007-10-06 17:27 Legend 閱讀(536) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久亚洲国产精品五月天婷| 欧美777精品久久久久网| 蜜臀久久99精品久久久久久| 久久亚洲国产成人影院网站| 亚洲人成伊人成综合网久久久| 一本色综合网久久| 国产精品久久毛片完整版| 久久综合一区二区无码| 久久久亚洲欧洲日产国码aⅴ | 国产精品成人无码久久久久久| 久久伊人影视| 国产精品久久免费| 蜜臀av性久久久久蜜臀aⅴ麻豆 | 一本久久久久久久| 久久亚洲精品国产精品婷婷| 国产精品视频久久| 亚洲中文字幕无码久久精品1| 色综合色天天久久婷婷基地| 久久精品中文无码资源站| 欧美久久亚洲精品| 久久精品国产99久久丝袜| 国产精品国色综合久久| 亚洲精品无码久久久影院相关影片| 久久久综合香蕉尹人综合网| 久久久91精品国产一区二区三区| 77777亚洲午夜久久多人| 色天使久久综合网天天| 久久99久久成人免费播放| 久久91精品国产91久久麻豆| 久久人人爽爽爽人久久久| 无码国内精品久久综合88| 超级97碰碰碰碰久久久久最新| 久久久久亚洲爆乳少妇无 | 精品一区二区久久| 久久久久久毛片免费播放| 人妻少妇久久中文字幕| 亚洲国产精品无码成人片久久| 久久久一本精品99久久精品88| 狠狠色丁香久久婷婷综合图片| 综合久久给合久久狠狠狠97色| 午夜福利91久久福利|