免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C 之父談C 語言設(shè)計(jì)規(guī)則

如果地圖與地表不符,要相信地表?!鹗寇婈?duì)格言

C++ 的設(shè)計(jì)規(guī)則——整體設(shè)計(jì)目標(biāo)——社會(huì)學(xué)規(guī)則——C++ 作為一種支持設(shè)計(jì)的語言——語言的技術(shù)性規(guī)則——C++ 作為一種支持低級(jí)程序設(shè)計(jì)的語言

4.1 規(guī)則和原理

要成為真正有用而且人們樂于使用的東西,一個(gè)程序設(shè)計(jì)語言的設(shè)計(jì)就必須有一種全局觀,用于指導(dǎo)語言中各種特征的設(shè)計(jì)。對(duì)于C++,這種全局觀由一組規(guī)則和約束構(gòu)成。稱其為規(guī)則,是因?yàn)槲艺J(rèn)為把原理這個(gè)詞用在一個(gè)真正的科學(xué)原理非常貧乏的領(lǐng)域,顯得過于自命不凡,而程序設(shè)計(jì)語言設(shè)計(jì)就是這樣一個(gè)領(lǐng)域。此外,對(duì)許多人而言,術(shù)語原理隱含著一個(gè)不太實(shí)際的推論,也就是說,任何例外都是不可接受的。而我的有關(guān)C++設(shè)計(jì)的規(guī)則幾乎可以保證都有例外情況。實(shí)際上,如果一條規(guī)則與某個(gè)實(shí)際試驗(yàn)發(fā)生沖突,這個(gè)規(guī)則就應(yīng)該靠邊站。這樣說,看起來似乎有些粗魯,但是它不過是一條一般性原則的變形:理論必須與試驗(yàn)數(shù)據(jù)相吻合,否則就應(yīng)該被更好的理論取代。

這些規(guī)則絕不能不加思索地使用,也不能用幾條膚淺的口號(hào)取代。我把自己作為一個(gè)語言設(shè)計(jì)者的工作看作去決定需要對(duì)付的是哪些問題,決定在C++ 的框架里能夠?qū)Ω兜氖悄男﹩栴},并在實(shí)際語言特征設(shè)計(jì)的各種規(guī)則之間保持一種平衡。

這些規(guī)則指導(dǎo)著與語言特征有關(guān)的各項(xiàng)工作。當(dāng)然,改進(jìn)設(shè)計(jì)的大框架是由C++ 的基本設(shè)計(jì)目標(biāo)提出來的。

我把這些規(guī)則組織在四個(gè)更具概括性的小節(jié)里。4.2節(jié)包含所有與整個(gè)語言有關(guān)的規(guī)則,這些東西非常具有普遍性,單個(gè)的語言特征將無法直接放進(jìn)這個(gè)圖景里。4.3節(jié)的規(guī)則基本上與C++ 在支持設(shè)計(jì)方面所扮演的角色相關(guān)。4.4節(jié)的規(guī)則關(guān)注與語言的形式有關(guān)的各種技術(shù)細(xì)節(jié)。4.5節(jié)的規(guī)則集中關(guān)注C++ 作為低級(jí)系統(tǒng)程序設(shè)計(jì)語言所扮演的角色。

這些規(guī)則的形式主要得益于事后的思索,但有關(guān)規(guī)則及其所表達(dá)的觀點(diǎn),在1985年C++的第一個(gè)發(fā)布之前就已經(jīng)支配著我的思想了,而且——正如前面章節(jié)里講到的——這些規(guī)則中不少還是C with Classes的初始概念的組成部分。

4.2 一般性規(guī)則

最一般和最重要的C++ 規(guī)則與語言的技術(shù)方面沒太大關(guān)系,這些規(guī)則幾乎都是社會(huì)性的,其關(guān)注點(diǎn)是C++ 所服務(wù)的社團(tuán)。C++ 語言的本質(zhì)在很大程度上出于我的選擇,我認(rèn)為它應(yīng)該服務(wù)于當(dāng)前的這一代系統(tǒng)程序員,支持他們?cè)诋?dāng)前的計(jì)算機(jī)系統(tǒng)上解決當(dāng)前遇到的問題。最重要的是,當(dāng)前這個(gè)詞的意義和性質(zhì)總隨著時(shí)間而變化,C++ 必須能夠發(fā)展,以滿足其用戶的需要;它的定義不應(yīng)該是一成不變的。

C++ 的發(fā)展必須由實(shí)際問題推動(dòng):在計(jì)算機(jī)科學(xué)中,就像在許多其他領(lǐng)域一樣,我們總能看到許多人在努力為他們最喜愛的解決辦法尋找問題。我不知道有任何簡(jiǎn)單明了的方法能避免時(shí)尚扭曲我對(duì)什么最重要的認(rèn)識(shí),但是我也很敏銳地意識(shí)到,提供給我的許多語言特征在C++ 的框架里根本就不可行,它們常常與真實(shí)世界的程序員無關(guān)。

改變C++ 的正確推動(dòng)力,是一些互相獨(dú)立的程序員證明該語言不能很好地表述他們的項(xiàng)目。我偏愛來自非研究性項(xiàng)目的信息。無論何時(shí)只要可能,在努力發(fā)現(xiàn)問題和尋找解決辦法時(shí),我設(shè)法與真實(shí)的用戶聯(lián)系。我如饑似渴地閱讀程序設(shè)計(jì)語言文獻(xiàn),尋找對(duì)這些問題的解答,以及各種可能有幫助的技術(shù)。但是我也發(fā)現(xiàn),文獻(xiàn)在考慮真正的問題方面完全不可靠,理論本身不可能為加入或去掉一個(gè)特征提供充分的證據(jù)。

不被牽涉到無益的對(duì)完美的追求中:任何程序設(shè)計(jì)語言都不是完美的。由于問題和系統(tǒng)都在持續(xù)變化,將來也不可能有完美的語言。用許多年功夫去修飾一個(gè)語言,希圖去接近某種完美的概念,只能是使程序員無法從那些年的進(jìn)步中獲益,也使語言設(shè)計(jì)者不能得到真實(shí)的反饋。沒有適當(dāng)?shù)姆答?,一個(gè)語言就會(huì)逐漸與時(shí)代脫節(jié)。不同環(huán)境里的問題,各種計(jì)算機(jī)系統(tǒng),以及——最重要的——人與人之間,都存在巨大的差異,因此,對(duì)某些小環(huán)境的“完美配合”幾乎可以確定是過分特殊的,與大千世界的繁榮沒多大關(guān)系。另一方面,程序員花費(fèi)了他們的大部分時(shí)間去修改老代碼,或者與它們接口。為了完成實(shí)際工作,他們需要某種穩(wěn)定性。一旦某個(gè)語言投入了實(shí)際應(yīng)用,對(duì)它的劇烈修改就不可行了,甚至想做一點(diǎn)小修改而又不傷害到用戶,也是很困難的。因此,重要的改進(jìn)需求必須依靠真實(shí)的反饋,并伴以對(duì)兼容性、轉(zhuǎn)變過程和教育的認(rèn)真考慮。隨著語言逐漸成熟,人必須更多考慮通過工具、技術(shù)和庫(kù)的替代性方式,而不是去改變語言本身。

并不是每個(gè)問題都需要用C++ 解決,也不是說C++ 的每個(gè)問題都足夠重要,值得做一種解決方案。例如,完全沒必要擴(kuò)充C++ 去直接處理模式匹配或定理證明; C語言著名的運(yùn)算符優(yōu)先級(jí)的毛?。?.6.2節(jié))也最好讓它待在那里,或通過警告信息去處置。

C++ 必須現(xiàn)在就是有用的:許多程序設(shè)計(jì)是現(xiàn)世的,用在功能較差的計(jì)算機(jī)上,運(yùn)行在相對(duì)過時(shí)的操作系統(tǒng)和工具上。大部分程序員沒經(jīng)過應(yīng)有的形式化訓(xùn)練,幾乎沒時(shí)間去更新他們的知識(shí)。為了能夠?yàn)檫@些程序員服務(wù),C++ 必須能適合具有平均水平的人,能用于平均水平的計(jì)算機(jī)。

雖然我也多次想過嘗試,但我從來就沒有真正的欲望去拋棄這些人以獲得某種自由,去調(diào)整我的設(shè)計(jì)以滿足最尖端的計(jì)算機(jī)和計(jì)算機(jī)科學(xué)研究者們的口味。

這個(gè)規(guī)則的意義——與大部分其他規(guī)則一樣——也將隨著時(shí)間推移而改變,部分地是C++ 成功的結(jié)果。威力更強(qiáng)大的計(jì)算機(jī)今天已經(jīng)可用了,更多程序員接受了C++ 所依賴的基本概念和技術(shù)。進(jìn)一步說,隨著人的抱負(fù)和期望的增長(zhǎng),程序員所面對(duì)的問題也在改變。這也意味著要求更多計(jì)算機(jī)資源,要求更成熟的程序員的某些語言特征,今天已經(jīng)可以并且應(yīng)該考慮了。異常處理(第16章)和運(yùn)行時(shí)類型識(shí)別(14.2節(jié))就是這方面的例子。

每個(gè)特征必須有一種合理的明顯實(shí)現(xiàn)方式:不應(yīng)該有必須通過復(fù)雜的算法才能正確地或有效地實(shí)現(xiàn)的特征。理想地說,應(yīng)該存在明顯的分析和代碼生成策略,而這些應(yīng)該足夠應(yīng)付實(shí)際使用。如果更多思考能產(chǎn)生更好的結(jié)果,當(dāng)然是越多越好。大部分特征都通過實(shí)現(xiàn)、試驗(yàn)性的使用、檢查修訂,而后才被接受。那些沒能按這種方式去做的地方,例如模板的實(shí)例化機(jī)制(15.10節(jié)),后來就暴露出了一些問題。

當(dāng)然,使用者總比寫編譯器的人多得多,所以,如果在編譯復(fù)雜性和使用復(fù)雜性之間出現(xiàn)了需要權(quán)衡的問題,解決方案必定是偏向用戶的。我在許多年做編譯器維護(hù)的工作中,已經(jīng)真正理解了這個(gè)觀點(diǎn)。

總提供一條轉(zhuǎn)變的通路:C++必須逐漸成長(zhǎng),以便很好地服務(wù)于它的用戶,并從用戶的反饋中獲益。這里隱含著特別關(guān)注和保證老代碼能繼續(xù)使用的問題。當(dāng)某種不兼容性已經(jīng)無法避免時(shí),需要特別關(guān)注如何幫助用戶更新他們的代碼。類似地,必須提供一條路徑,使人能從容易出錯(cuò)的C一類的技術(shù)轉(zhuǎn)到C++的更有效的使用方面來。

要清除一種不安全、容易出錯(cuò),或者簡(jiǎn)單說就是有毛病的語言特征,最一般的策略是首先提供一種更好的替代品,而后建議人們避免使用老的特征或技術(shù),而只有到數(shù)年之后——如果需要做的話——再刪除那個(gè)有問題的特征。可以有效地通過讓編譯產(chǎn)生警告信息的方式支持這種策略。一般說,直接刪除一個(gè)特征或者更正一個(gè)錯(cuò)誤是不可行的(典型原因是為了保持與C的兼容性):替代的方法是提出警告(2.6.2節(jié))。這樣做,還能使C++ 的實(shí)現(xiàn)比僅根據(jù)語言定義看到的情況更安全些。

C++是一種語言,而不是一個(gè)完整的系統(tǒng):一個(gè)程序設(shè)計(jì)環(huán)境包含了許多部分。一種方式是將多個(gè)部分組合成一個(gè)“集成化的”系統(tǒng),另一種方式是維持系統(tǒng)中各部分之間的經(jīng)典劃分,例如編譯器、連接器、語言的運(yùn)行支持庫(kù)、I/O庫(kù)、編輯器、文件系統(tǒng)、數(shù)據(jù)庫(kù),等等。C++ 遵循的是后一條路。通過庫(kù)、調(diào)用約定等,C++ 能適應(yīng)各種系統(tǒng)里指導(dǎo)著語言和工具之間互操作的系統(tǒng)規(guī)定。對(duì)于移植和實(shí)現(xiàn)的簡(jiǎn)單性,這些都是非常關(guān)鍵的。更重要的,對(duì)支持不同語言寫出的代碼之間的互操作,這些做法也很關(guān)鍵。這種方式也能允許工具的共享,使作為個(gè)人的程序員能更容易地使用多種語言。

C++ 的設(shè)計(jì)就是準(zhǔn)備作為許多語言之中的一個(gè)。C++ 支持工具的開發(fā),但又不強(qiáng)求某種特定的形式,程序員仍然有選擇的自由。這里的關(guān)鍵思想是,C++ 及其關(guān)聯(lián)工具應(yīng)該對(duì)給定系統(tǒng)有正確的“感覺”,而不是對(duì)于什么是一個(gè)系統(tǒng),或者什么是一個(gè)環(huán)境強(qiáng)加上某種特殊的觀點(diǎn)。對(duì)于大型系統(tǒng),或者有著不同尋常的約束的系統(tǒng)而言,這些非常重要。這類系統(tǒng)常常無法得到很好的支持,因?yàn)椤皹?biāo)準(zhǔn)的”系統(tǒng)的設(shè)計(jì)總是傾向于專門支持個(gè)人,或者是支持很小的組,僅僅支持他們做相當(dāng)“普通的”工作。

為每種被支持的風(fēng)格提供全面支持:C++ 必須為滿足嚴(yán)肅的開發(fā)者們的需要而不斷發(fā)展。簡(jiǎn)潔是最基本的東西,但應(yīng)根據(jù)將要使用C++ 的項(xiàng)目的復(fù)雜性來考慮這個(gè)問題。與保持語言定義比較簡(jiǎn)短相比,用C++ 寫出的系統(tǒng)的可維護(hù)性和運(yùn)行時(shí)的性能是更重要的問題。這實(shí)際上意味著要做的是一個(gè)規(guī)模相對(duì)較大的語言。

這也意味著——正如許多經(jīng)驗(yàn)所說明的——必須支持各種風(fēng)格的程序設(shè)計(jì)。人們并不是只寫那些符合狹義的抽象數(shù)據(jù)類型或者面向?qū)ο箫L(fēng)格的類,他們也要寫同時(shí)具有兩方面特點(diǎn)的類,這樣做通常都有很好的理由。他們還會(huì)寫這樣的程序,其中的不同部分采用了不同的風(fēng)格,以適應(yīng)具體需要或者是個(gè)人口味。

因此,語言特征應(yīng)該設(shè)計(jì)成能以組合的方式使用,這也導(dǎo)致了C++ 設(shè)計(jì)中相當(dāng)程度的正交性。支持各種“非正?!笔褂玫目赡苄?,對(duì)于靈活性提出了很高要求,這已經(jīng)一再地導(dǎo)致C++ 被用到一些領(lǐng)域中,在那里,更局限更專注語言可能早就失敗了。例如,C++ 中有關(guān)訪問保護(hù)、名字檢索、virtual / 非virtual約束,以及類型的規(guī)則都是相互獨(dú)立的,這樣就打開了一種可能,同時(shí)使用依賴于信息隱蔽和派生類的各種技術(shù)。有些人愿意看到一貫語言只支持很少幾種程序設(shè)計(jì)風(fēng)格,他們會(huì)認(rèn)為這里的做法是“黑科技”。在另一方面,正交性并不是第一原則,只有在其不與其他規(guī)則沖突,既能提供某些利益而又不使實(shí)現(xiàn)復(fù)雜化的時(shí)候,我們才采納它。

做一種相對(duì)較大的語言,也意味著在復(fù)雜性管理方面的努力需要有所轉(zhuǎn)移,從對(duì)于庫(kù)和個(gè)別程序的理解方面,轉(zhuǎn)到學(xué)習(xí)語言及其基本設(shè)計(jì)技術(shù)。對(duì)大部分人而言,這種重點(diǎn)轉(zhuǎn)變,對(duì)新程序設(shè)計(jì)技術(shù)的采納,對(duì)“高級(jí)”技術(shù)的使用,都只能逐步完成。很少人能夠“一蹴而就”地完全掌握新技術(shù),或者一下就能把所有的新招術(shù)都用到自己的工作里(7.2節(jié))。C++在設(shè)計(jì)中考慮了如何使這種漸變成為可能的和自然的。這里的基本思想是:你不知道的東西不會(huì)傷害你。靜態(tài)類型系統(tǒng)和編譯的警告信息在這方面非常有幫助。

不試圖去強(qiáng)迫人做什么:程序員都是很聰明的人,他們從事挑戰(zhàn)性的工作,需要所有可能的幫助,不僅是其他支撐工具和技術(shù),也包括程序設(shè)計(jì)語言。試圖給程序員強(qiáng)加嚴(yán)格的限制,使他們“只能做的正確事情”,從本質(zhì)上說是搞錯(cuò)的方向,也注定會(huì)失敗。程序員總能找到某種方法,繞過他們覺得無法接受的規(guī)則和限制。語言應(yīng)該支持范圍較廣泛的、合理的設(shè)計(jì)和編程風(fēng)格,而不應(yīng)該企圖去強(qiáng)迫程序員采納某種唯一的寫法。

當(dāng)然,這并不意味著所有的程序設(shè)計(jì)方式都同樣好,或者說C++ 應(yīng)該支持所有種類的程序設(shè)計(jì)風(fēng)格。C++ 的設(shè)計(jì)是為了直接支持那些依靠廣泛的靜態(tài)類型檢查、數(shù)據(jù)抽象和繼承性的設(shè)計(jì)風(fēng)格。當(dāng)然,關(guān)于應(yīng)該使用哪些特征的訓(xùn)教被維持到最小的程度。語言機(jī)制盡可能保持了一種自由的政策,沒有專門為了排斥任何確定的程序設(shè)計(jì)風(fēng)格,而向C++ 里加進(jìn)或者從中減去一種特征。

我也很清楚地意識(shí)到,并不是每個(gè)人都贊賞選擇和變化。無論如何,那些偏愛帶有較多限制環(huán)境的人,可以在C++ 里始終如一地堅(jiān)持使用某些規(guī)則,或者去選用另一種語言,其中只給程序員提供了很少的一組選擇。

許多程序員特別反感被告之某種東西可能是一個(gè)錯(cuò)誤,而實(shí)際上它并不是。所以,“可能的錯(cuò)誤”在C++ 里并不是一個(gè)錯(cuò)誤。例如,寫一個(gè)能允許歧義使用的聲明本身并不是錯(cuò)誤,錯(cuò)的是那些存在歧義性的使用,而不只是這個(gè)錯(cuò)誤的可能性。按照我的經(jīng)驗(yàn),多數(shù)“潛在錯(cuò)誤”根本不會(huì)顯現(xiàn)出來,因此推遲錯(cuò)誤信息的方式就是不把它給出來。這種推遲也會(huì)帶來許多方便和靈活性。

4.3 設(shè)計(jì)支持規(guī)則

列在這里的規(guī)則主要討論C++ 在支持基于數(shù)據(jù)抽象和面向?qū)ο蟪绦蛟O(shè)計(jì)方面扮演的角色。也就是說,它們更多關(guān)注這個(gè)語言在支持思考和表達(dá)高層次思想方面扮演的角色,而不是它按C或Pascal的方式,作為一種“高級(jí)匯編語言”時(shí)扮演的角色。

支持健全的設(shè)計(jì)概念:任何個(gè)別的語言特征都必須符合一個(gè)整體模式,這個(gè)整體模式必須能幫助回答一個(gè)問題——什么樣的功能是我們需要的。語言本身不可能提供這種東西,這個(gè)指導(dǎo)模式必然來自另一個(gè)完全不同的概念層次。對(duì)C++ 而言,這個(gè)概念層次就是有關(guān)程序應(yīng)該如何設(shè)計(jì)的基本思想。

我的目標(biāo)是提升系統(tǒng)程序設(shè)計(jì)中的抽象層次,其方式類似于C語言在取代匯編語言作為系統(tǒng)工作主流時(shí)的所作所為。有關(guān)新特征的想法都放在這一統(tǒng)一框架中考慮,看它們?cè)趯++ 提升為一種表述設(shè)計(jì)的語言時(shí)能起到什么作用。特別是對(duì)個(gè)別特征的考慮,就要看它能否形成一種可以通過類進(jìn)行有效表述的概念。對(duì)于C++ 支持?jǐn)?shù)據(jù)抽象和面向?qū)ο蟮某绦蛟O(shè)計(jì),這是最關(guān)鍵的問題。

一個(gè)程序設(shè)計(jì)語言不是也不應(yīng)該是一個(gè)完整的設(shè)計(jì)語言。因?yàn)樵O(shè)計(jì)語言應(yīng)該更豐富,不必像適合做系統(tǒng)程序設(shè)計(jì)的語言那樣過多地關(guān)心細(xì)節(jié)。但是,程序設(shè)計(jì)語言也應(yīng)該盡可能直接地支持某些設(shè)計(jì)概念,以使設(shè)計(jì)師和程序員(這些人常常是“戴著不同帽子的”同一批人)之間更容易溝通,并能簡(jiǎn)化工具的構(gòu)造。

采用設(shè)計(jì)的術(shù)語來觀察程序設(shè)計(jì)語言,更容易基于該語言與其支持的設(shè)計(jì)風(fēng)格之間的關(guān)系,去考慮接受或者拒絕人們建議的語言特征。沒有一種語言能支持所有風(fēng)格,而如果一個(gè)語言只支持某種定義狹隘的設(shè)計(jì)哲學(xué),它也將因?yàn)槿狈m應(yīng)性而失敗。提升C++ 語言使之支持寬譜的設(shè)計(jì)技術(shù),將它們映射到“更好的”C / 數(shù)據(jù)抽象 / 面向?qū)ο蟪绦蛟O(shè)計(jì),使我們能在為發(fā)展提供持續(xù)動(dòng)力的同時(shí),避免把C++ 弄成所有人的唯一工具。

為程序的組織提供豐富的機(jī)制:與C語言相比,C++ 能幫助人們更好地組織程序,使之更容易書寫、閱讀和維護(hù)。我把計(jì)算看成已經(jīng)由C語言解決的問題。和幾乎所有人一樣,我也有一些關(guān)于C表達(dá)式和語句應(yīng)如何改進(jìn)的想法。但我決定把自己的努力集中到其他方面。有關(guān)表達(dá)式或語句的新建議,都需要仔細(xì)評(píng)價(jià),看它是能影響程序的結(jié)構(gòu)呢,還是僅使表達(dá)某種局部計(jì)算變得更容易些。除了不多的例外,例如允許聲明出現(xiàn)在第一次需要變量的位置(3.11.5節(jié))等,C語言的表達(dá)式和語句結(jié)構(gòu)都保持不變。

直接說出你的意思:低級(jí)語言有一個(gè)最本質(zhì)的問題,那就是在人們互相交流時(shí)能如何表述問題,和他們?cè)谑褂贸绦蛟O(shè)計(jì)語言時(shí)能如何表述問題之間存在一條鴻溝。程序的基本結(jié)構(gòu)常常被淹沒在二進(jìn)制位、字節(jié)、指針和循環(huán)等的泥潭中。

要縮小這種語義鴻溝,最基本的方法就是使語言更具有說明性。C++ 語言提供的每種機(jī)制都與使某種東西更具有說明性相關(guān),然后是為了一致性檢查、檢測(cè)出愚蠢的錯(cuò)誤,或者改進(jìn)所生成的代碼而開發(fā)的一些附加結(jié)構(gòu)。

在無法使用說明性結(jié)構(gòu)的地方,某種更明確的記法常常會(huì)有所幫助。分配/釋放運(yùn)算符(10.2節(jié))和新的強(qiáng)制轉(zhuǎn)換記法(14.3節(jié))都是很好的例子。有關(guān)直接而明顯地表達(dá)意圖的思想,很早就有一種說法:“允許用語言本身表達(dá)所有重要的東西,而不是在注釋里或者通過宏這類黑客手段?!边@也意味著,一般而言,這個(gè)語言必須具有比原來的通用語言更強(qiáng)的表達(dá)能力和靈活性,特別是它的類型系統(tǒng)。

所有特征都必須是能夠負(fù)擔(dān)的:僅僅給用戶提供一種語言特征,或者針對(duì)某個(gè)問題建議一種技術(shù)還不夠。提供的解決方案還必須是能負(fù)擔(dān)得起的,否則這個(gè)建議簡(jiǎn)直就是一種侮辱,就像對(duì)于提問“什么是到孟菲斯的最好方式”,你回答說“去租一架專機(jī)”一樣。對(duì)不是百萬富翁的人們而言,這絕不是一個(gè)有益的回答。

只有在無法找到其他方法,而且能在付出明顯更低的代價(jià)并得到類似效果時(shí),才應(yīng)該把這個(gè)特征加進(jìn)C++。我自己的經(jīng)驗(yàn)是,如果程序員可以在高效地或優(yōu)雅地做某種事情之間做選擇,大部分人將選擇效率,除非存在其他更重要更明顯的原因。例如,提供inline函數(shù)是為了無代價(jià)地跨過保護(hù)邊界,對(duì)于宏的許多使用而言,這都是另一種具有更好行為的選擇。這里的思想是顯然的:一種功能應(yīng)該同時(shí)是優(yōu)雅的而又是高效的。在無法同時(shí)達(dá)到這些的地方,或者不提供這種功能,或者是——如果要求非常迫切——高效地提供它。

允許一個(gè)有用的特征比防止各種錯(cuò)誤使用更重要:你可以在任何語言里寫出很壞的程序。真正重要的問題,是盡可能減少偶然用錯(cuò)某些特征的機(jī)會(huì)。我們花了很多精力,去保證C++ 里各種構(gòu)造的默認(rèn)行為或者是有意義的,或者將導(dǎo)致編譯錯(cuò)誤。例如,按默認(rèn)方式,所有函數(shù)的參數(shù)類型都要做檢查,即使是跨過了分別編譯的邊界;還有,按默認(rèn)方式,所有的類成員都是私用的。當(dāng)然,一個(gè)系統(tǒng)程序設(shè)計(jì)語言不應(yīng)該禁止程序員有意打破系統(tǒng)的限制,所以設(shè)計(jì)的努力應(yīng)該更多地放在提供一些機(jī)制,幫助人寫出好程序方面,而不是放在禁止不可避免的壞程序方面。在長(zhǎng)期的工作中,程序員必然會(huì)學(xué)習(xí)。這種觀點(diǎn)也是C語言傳統(tǒng)上的“相信程序員”口號(hào)的一種變形。提供各種類型檢查和訪問控制規(guī)則,使類的提供者能清楚地表述其對(duì)類的使用者期望些什么,并提供保護(hù)以防偶然事故。這種規(guī)則并不想提供一種保護(hù)機(jī)制,禁止有意違反規(guī)則的情況(2.10節(jié))。

支持從分別開發(fā)的部分出發(fā)進(jìn)行軟件的組合:復(fù)雜應(yīng)用需要比簡(jiǎn)單程序更多的支持,大程序需要比小程序更多的支持,效率約束很強(qiáng)的程序需要比資源豐富的程序更多的支持。在第三個(gè)條件的約束下,C++ 的設(shè)計(jì)中花了很多精力去解決前兩個(gè)問題。當(dāng)實(shí)際應(yīng)用變得更大、更復(fù)雜時(shí),這些應(yīng)用必然是由一些人們能把握的具有一定獨(dú)立性的部分組合而成的。

任何能用于獨(dú)立進(jìn)行大系統(tǒng)的部件開發(fā),而后又允許將它們不加修改地用到大系統(tǒng)里的東西,都可以服務(wù)于這一目標(biāo)。C++ 的許多發(fā)展都是由這一思想推動(dòng)的。從根本上說,類本身就是這樣的C++特征,抽象類(13.2.2節(jié))能顯式支持接口與實(shí)現(xiàn)分離。事實(shí)上,類可以用于表述一系列互相聯(lián)系的策略 [Stroustrup,1990b]。異常機(jī)制允許從一個(gè)庫(kù)出發(fā)去處理錯(cuò)誤(16.1節(jié)),模板使人能基于類型進(jìn)行組合(15.3節(jié)、15.6節(jié)和15.8節(jié)),名字空間解決名字污染問題(17.2節(jié)),而運(yùn)行時(shí)類型識(shí)別能處理這樣一類問題:當(dāng)一個(gè)對(duì)象在傳遞過程中穿過一個(gè)庫(kù)時(shí),其準(zhǔn)確類型有可能丟失,在這種情況下應(yīng)該怎么辦?

程序員在開發(fā)大系統(tǒng)時(shí)需要得到更多的幫助,還意味著不能過分依賴只對(duì)小程序有特效的優(yōu)化技術(shù),從而造成效率的損失。因此,對(duì)象布局應(yīng)該能在特定編譯單位內(nèi)部孤立地確定,而虛函數(shù)調(diào)用也應(yīng)該能編譯成有效代碼,不依靠跨越編譯單位的優(yōu)化。這些確實(shí)都做到了,甚至在高效意味著與C相比非常有效的意義下。如果有關(guān)整個(gè)程序的信息都能用,再做一些優(yōu)化也是可能的。例如,通過檢查整個(gè)程序,一個(gè)對(duì)虛函數(shù)的調(diào)用——在不牽涉動(dòng)態(tài)鏈的情況下——有時(shí)可以確定為一個(gè)實(shí)際的函數(shù)調(diào)用。在這種情況下,就可以用一個(gè)正常的函數(shù)調(diào)用取代虛函數(shù)調(diào)用,甚至用inline的方式取代。現(xiàn)在已經(jīng)存在能做這種事的C++ 實(shí)現(xiàn)。當(dāng)然,對(duì)于生成高效代碼,這種優(yōu)化并不是必需的,它們不過是在希望更高的運(yùn)行效率,而不是編譯效率和動(dòng)態(tài)連接新派生類的情況下,可以獲得的一些附加利益。當(dāng)無法合理地做到這類全局優(yōu)化時(shí),還是可以通過優(yōu)化去掉一些虛函數(shù)調(diào)用,只要該虛函數(shù)是應(yīng)用在已知類型的對(duì)象上,Cfront的Release 1.0就能做這件事。

對(duì)大系統(tǒng)的支持,經(jīng)常是在“對(duì)于庫(kù)的支持”的題目下討論的(第8章)。

4.4 語言的技術(shù)性規(guī)則

下面規(guī)則針對(duì)的問題是如何在C++里表述各種事物,這里不討論能表述什么。

不隱式地違反靜態(tài)類型系統(tǒng):每個(gè)對(duì)象在建立時(shí)就具有特定的類型,例如double、char*dial_buffer等。如果以與對(duì)象的類型不一致的方式去使用它,那就是違背了類型系統(tǒng)。絕不允許這種情況發(fā)生的語言稱為是強(qiáng)類型的。如果一種語言能在編譯時(shí)確認(rèn)所有違反類型系統(tǒng)的情況,那么它就是強(qiáng)靜態(tài)類型的。

C++ 從C語言繼承了許多特征,例如聯(lián)合、強(qiáng)制轉(zhuǎn)換和數(shù)組,這就使它不可能在編譯時(shí)檢查出所有違反類型系統(tǒng)的情況。這就是說,你需要顯式使用聯(lián)合、強(qiáng)制轉(zhuǎn)換、數(shù)組、明確不加檢查的函數(shù)參數(shù),或者顯式使用不安全的C連接去違反這里的類型系統(tǒng)。所有不安全特征的使用都可以處理為(在編譯時(shí))產(chǎn)生警告。更重要的是,目前的C++ 已經(jīng)擁有了一些很好的語言特征,采用它們更方便而又同樣有效,因此可以避免使用不安全的特征。這方面的例子包括派生類(2.9節(jié))、標(biāo)準(zhǔn)數(shù)組模板(8.5節(jié))、類型安全的連接(11.3節(jié)),以及動(dòng)態(tài)檢查的強(qiáng)制轉(zhuǎn)換(14.2節(jié))。由于與C語言兼容的需要以及常見的實(shí)踐,維持目前這種狀態(tài)的路還很長(zhǎng)也很困難,但大部分程序員已經(jīng)采納了更安全的方式。

只要有可能,總在編譯時(shí)進(jìn)行檢查。只要有可能,那些在處理單獨(dú)編譯單位時(shí)只能提供信息而無法檢查的東西,都要在連接時(shí)檢查。最后,這里還提供了運(yùn)行時(shí)的類型信息(14.2節(jié))和異常機(jī)制(第16章),以幫助程序員處理編譯和連接都無法捕捉的錯(cuò)誤條件。當(dāng)然,在實(shí)踐中,還是編譯時(shí)檢查的代價(jià)更低,也更值得信賴。

為用戶定義類型提供與內(nèi)部類型同樣好的支持:因?yàn)槲覀儼延脩舳x類型看作C++ 程序的核心,語言當(dāng)然應(yīng)該給它們盡可能多的支持。因此,例如“類對(duì)象只能在自由空間中分配”這樣的限制就是無法接受的了。對(duì)于例如complex這樣的算術(shù)類型,確實(shí)需要真正的局部變量,這也就導(dǎo)致了對(duì)于面向值的類型(實(shí)在類型)的支持不但可以與內(nèi)部類型媲美,甚至還超過了它們。

局部化是好事情:人們寫一段代碼時(shí)總希望它是自足的,除了可能需要從其他地方得到一些服務(wù)。也希望能使用一種服務(wù)又不帶來過多的麻煩和干擾。另外,人們也需要為其他人提供函數(shù)和類等,同時(shí)不擔(dān)心其實(shí)現(xiàn)細(xì)節(jié)與其他人的代碼出現(xiàn)相互干擾。

C語言距離這些思想都非常遙遠(yuǎn),連接器可以看到所有全局函數(shù)和全局變量的名字,這些名字會(huì)與同樣名字的其他使用互相沖突,除非顯式將它們聲明為static。任何名字都可以當(dāng)作函數(shù)名使用而不必事先聲明。作為早年把結(jié)構(gòu)成員名也看成全局名的遺風(fēng),在一個(gè)結(jié)構(gòu)里面聲明的結(jié)構(gòu)也是全局的。此外,預(yù)處理程序的宏處理根本不考慮作用域問題,因此,只要改變了頭文件或編譯器的某些選項(xiàng),程序正文中的任意一段字符都可能變成另外的任何東西(18.1節(jié))。如果你想去影響某些看起來是局部的代碼,或希望通過某些小的“局部”修改影響整個(gè)世界的其他部分,上面這些東西的威力異常強(qiáng)大。公平地說,我認(rèn)為這些東西對(duì)于理解和維護(hù)復(fù)雜的軟件具有破壞性。因此決心提供更好的隔離手段,以對(duì)抗從“其他地方”來的破壞,對(duì)能從自己的代碼中“引出”什么東西提供更好的控制。

對(duì)于代碼局部化、使訪問總是通過良好定義的接口進(jìn)行而言,類是第一位的最重要的機(jī)制。嵌套類(3.12節(jié)和13.5節(jié))和名字空間進(jìn)一步擴(kuò)展了局部作用域和訪問權(quán)的顯式授予的概念。由于這些情況,在一個(gè)系統(tǒng)里的全局信息的總量大大減少了。

訪問控制使訪問局部化,而且沒有因?yàn)橥耆母綦x而造成運(yùn)行時(shí)間或存儲(chǔ)空間的額外開銷(2.10節(jié))。抽象類使人可以以最小的代價(jià)得到最大程度的隔離(13.2節(jié))。

在類和名字空間里,人們可以將聲明和實(shí)現(xiàn)分開,這也非常重要,因?yàn)檫@樣做使人更容易看到一個(gè)類到底做了些什么,而不必不斷地跳過描述有關(guān)工作如何完成的函數(shù)體。允許在類聲明中寫inline函數(shù),這樣,當(dāng)上述分離不合適時(shí),可以得到另一種局部性。

最后,如果代碼中重要的塊能放進(jìn)一個(gè)屏幕,對(duì)于理解和操作也將大有裨益。C語言傳統(tǒng)的緊湊性在這方面很起作用,C++ 允許在需要使用的地方引進(jìn)新變量(3.11.5節(jié)),也是在這個(gè)方向上前進(jìn)了一步。

避免順序依賴性:順序依賴性很容易使人感到困惑,在重新組織代碼時(shí)也容易引進(jìn)錯(cuò)誤。人們都會(huì)注意到,語句將按定義的順序執(zhí)行,但卻往往會(huì)忽視全局聲明之間和類成員聲明之間的相互依賴性。重載規(guī)則(11.2節(jié))和基類的使用規(guī)則(12.2節(jié))都經(jīng)過了特殊處理,避免其中出現(xiàn)對(duì)順序的依賴性。理想情況是,如果交換兩個(gè)聲明的順序會(huì)導(dǎo)致另一種不同的意思,那么這就應(yīng)該是一個(gè)錯(cuò)誤。對(duì)于類成員的規(guī)則就是這樣(6.3.1節(jié))。但是,對(duì)全局聲明不可能做到這一點(diǎn)。C預(yù)處理程序可以通過宏處理引進(jìn)根本無法預(yù)期的病態(tài)依賴性,從而可能造成很大的破壞(18.1節(jié))。

我在某個(gè)時(shí)候曾經(jīng)表達(dá)過有關(guān)避免微妙的解析方式的愿望,說:“幫助你下決心不應(yīng)該是編譯器的事情”。換句話說,產(chǎn)生編譯錯(cuò)誤將比產(chǎn)生某種含糊的解析更容易接受。多重繼承的歧義性規(guī)則是這方面的好例子(12.2節(jié))。關(guān)于重載函數(shù)的歧義性規(guī)則是另一個(gè)例子,它也說明了在兼容性和靈活性的約束下,要做好這件事有多么困難(11.2.2節(jié))。

如果有疑問,就選擇該特征的最容易說清楚的形式:這是在不同可能性之中做選擇的第二規(guī)則,使用起來很有技巧性,因?yàn)樗锌赡茏兂梢环N關(guān)于邏輯美的爭(zhēng)論,而且可能與熟悉不熟悉有關(guān)。寫出描述它的輔導(dǎo)材料和參考手冊(cè),看看人們是否容易理解,是這個(gè)規(guī)則的一種實(shí)踐方式。這里的一個(gè)意圖就是簡(jiǎn)化教學(xué)人員和維護(hù)人員的工作。還應(yīng)該記住,程序員們不笨,不應(yīng)該通過付出重要的功能方面的代價(jià)去換取簡(jiǎn)單性。

語法是重要的(常以某些我們不希望的方式起作用):保證類型系統(tǒng)的一致性,一般而言,保證語言的語義清晰、定義良好,是最基本的東西。語法是第二位的,而且,看起來人們能學(xué)會(huì)去喜愛任何語法形式。

當(dāng)然,語法就是人們看到的東西,也是語言最基本的用戶接口。人們喜愛某些形式的語法,并以某種奇特的狂熱去表達(dá)他們的意見。我認(rèn)為,想改變這些東西,或者不顧人們對(duì)某些特定語法的對(duì)抗情緒去引進(jìn)新的語義或設(shè)計(jì)思想,都是沒希望成功的。因此,C++ 的語法,在設(shè)法使其更合理和規(guī)范的同時(shí),也盡可能避免去觸犯程序員們的成見。我的目標(biāo)是逐漸使一些討厭的東西淡出,例如隱含的int(2.8.1節(jié))和老風(fēng)格的強(qiáng)制(14.3.1節(jié))等,同時(shí)又盡可能地減少使用更復(fù)雜形式的聲明符語法(2.8.1節(jié))。

我的經(jīng)驗(yàn)是,人們往往過分熱衷于通過關(guān)鍵詞來引進(jìn)新概念,以至于如果一個(gè)概念沒有自己的關(guān)鍵詞,教起來就非常困難。這種作用是很重要的、根深蒂固的,遠(yuǎn)遠(yuǎn)超過人們口頭上表述的對(duì)新關(guān)鍵詞的反感。如果給他們一點(diǎn)時(shí)間去考慮并做出選擇,人們無疑地會(huì)選擇新的關(guān)鍵詞,而不是某種聰明的迂回方案。

我試著把重要操作做成很容易看見的東西。例如,老風(fēng)格強(qiáng)制的一個(gè)重要問題是它們幾乎不可見。此外,我也喜歡把語義上丑陋的操作在語法上也弄成丑陋的,與語義相匹配,例如病態(tài)的類型強(qiáng)制(14.3.3節(jié))。一般說,也應(yīng)該避免過分啰嗦。

清除使用預(yù)處理程序的必要性:如果沒有C預(yù)處理程序,C語言本身和后來的C++ 可能早就是死胎了。沒有Cpp,它們根本就不能有足夠的表達(dá)能力和靈活性,不能處理重要項(xiàng)目中所需要完成的各種任務(wù)。但在另一方面,Cpp丑陋低級(jí)的語義也使構(gòu)造和使用更高級(jí)、更優(yōu)雅的C程序設(shè)計(jì)環(huán)境變得過分困難、代價(jià)過分昂貴。

因此,必須針對(duì)Cpp的每個(gè)基本特征,找到符合C++ 語法和語義的替代品。如果這個(gè)工作能夠完成,我們就可能得到一個(gè)更便宜的大大改進(jìn)的C++ 程序設(shè)計(jì)環(huán)境。沿著這個(gè)方向,我們也將清除許多很難對(duì)付的錯(cuò)誤的根源。模板(第15章)、inline函數(shù)(2.4.1節(jié))、const(3.8節(jié))和名字空間(第17章)都是在這個(gè)方向上留下的腳印。

4.5 低級(jí)程序設(shè)計(jì)支持規(guī)則

很自然,上面提出的規(guī)則基本上都適用于所有語言特征。下面的規(guī)則也同樣影響C++ 如何作為一種表述高層設(shè)計(jì)的語言。

使用傳統(tǒng)的(笨[1])連接器:初始目標(biāo)就包括了容易移植,容易與用其他語言寫的軟件互操作。強(qiáng)調(diào)C++ 應(yīng)該可以用傳統(tǒng)連接器實(shí)現(xiàn),就是為了保證這些東西。要求通過在Fortran早期就有的連接技術(shù)必然是一件很痛苦的事情。C++ 的一些特征,特別是類型安全的連接(11.3節(jié))和模板(第16章)都可以用傳統(tǒng)的連接器實(shí)現(xiàn),但如果有更多的連接支持,它們還可以實(shí)現(xiàn)得更好。C++ 的第二個(gè)目標(biāo)就是想推動(dòng)連接器設(shè)計(jì)的改革。

采用傳統(tǒng)連接器,使維持與C的連接兼容性變得相對(duì)簡(jiǎn)單。對(duì)平滑地使用操作系統(tǒng)功能,使用C和Fortran等,使用庫(kù),以及寫為其他語言所用的庫(kù)代碼,這一特性都具有本質(zhì)性。對(duì)于寫想作為系統(tǒng)底層部分的代碼,例如設(shè)備驅(qū)動(dòng)程序等,使用傳統(tǒng)連接器也是最關(guān)鍵的事情。

沒有無故的與C的不兼容性:C語言是有史以來最成功的系統(tǒng)程序設(shè)計(jì)語言。數(shù)以十萬計(jì)的程序員熟悉C,現(xiàn)存的C代碼數(shù)以十億行計(jì),存在著集中關(guān)注C語言的工具和服務(wù)產(chǎn)業(yè)。而且C++ 又是基于C的。這就帶來一個(gè)問題:“C++ 的定義在與C相匹配方面到底應(yīng)該靠得多么近?”C++ 不可能把與C的100% 兼容作為目標(biāo),因?yàn)檫@將危及它在類型安全性和對(duì)設(shè)計(jì)的支持方面的目標(biāo)。當(dāng)然,在這些目標(biāo)不會(huì)受到干擾的地方,應(yīng)該盡量避免不兼容性——即使這樣做出的結(jié)果不太優(yōu)雅。在大部分情況下,已經(jīng)接受的與C語言的不兼容性,都出現(xiàn)在C規(guī)則給類型系統(tǒng)留下重大漏洞的地方。

在過去這些年里,C++ 最強(qiáng)的和最弱的地方都在于它與C的兼容性。這種情況不奇怪。與C兼容性的強(qiáng)弱將來也一直會(huì)是一個(gè)重要議題。在今后的年代里,與C的兼容性將越來越少地看作是優(yōu)點(diǎn),而更多變成一種義務(wù)。必須找到一條發(fā)展的道路(第9章)。

在C++ 之下不為更低級(jí)的語言留下空間(除匯編語言之外):如果一個(gè)語言的目標(biāo)就是真正成為高級(jí)的——也就是說,它想完全保護(hù)自己的程序,使之避開基礎(chǔ)計(jì)算機(jī)中丑陋且使人厭倦的細(xì)節(jié)——那么它就必須把做系統(tǒng)程序設(shè)計(jì)的工作讓給其他語言。典型情況下,這個(gè)語言就是C。但另一種情況也很典型,C在許多領(lǐng)域中將取代這種高級(jí)語言,只要在這里控制或速度被認(rèn)為是最關(guān)鍵的問題。常見情況是,這最終將導(dǎo)致整個(gè)系統(tǒng)完全用C語言來編寫;或者是導(dǎo)致這樣的一個(gè)系統(tǒng),只有對(duì)兩種語言都非常熟悉的人才能夠把握它。在后一情況下,程序員常常會(huì)遇到一個(gè)艱難的選擇:給定的任務(wù)究竟適合在哪個(gè)層次上做程序設(shè)計(jì)呢,他不得不同時(shí)記住兩種語言的原語和準(zhǔn)則。C++ 試圖給出另一條路,它同時(shí)提供了低級(jí)特征和抽象機(jī)制,支持用這兩種東西構(gòu)造混合的系統(tǒng)。

為了繼續(xù)成為一種可行的系統(tǒng)程序設(shè)計(jì)語言,C++ 必須保持C語言的那種直接訪問硬件、控制數(shù)據(jù)結(jié)構(gòu)布局的能力,保有那些能以一對(duì)一的風(fēng)格直接映射到硬件的基本操作和數(shù)據(jù)結(jié)構(gòu)。這樣,它的替代品就只能是C或者匯編語言。語言設(shè)計(jì)的工作就是去隔離這些低級(jí)特征,使不直接操作系統(tǒng)細(xì)節(jié)的代碼不需要用這些低級(jí)特征。這里的目標(biāo)是保護(hù)程序員,防止出現(xiàn)無意中越界的偶然的錯(cuò)誤使用。

對(duì)不用的東西不需要付出代價(jià)(0開銷規(guī)則):對(duì)于規(guī)模較大的語言,有一種論斷人人皆知,說它們會(huì)產(chǎn)生大而慢的結(jié)果代碼。最常見的是由于支持某些假設(shè)的高級(jí)特征而產(chǎn)生的額外開銷,而這種開銷又散布在整個(gè)語言的所有特征中。例如,所有對(duì)象都需要擴(kuò)大,以保存為某種系統(tǒng)簿記而使用的信息;對(duì)所有數(shù)據(jù)都采用間接訪問方式,因?yàn)槟承┨卣魍ㄟ^間接訪問特別容易管理;或是對(duì)各種控制結(jié)構(gòu)都進(jìn)行加工,以迎合某種“高級(jí)控制抽象”。對(duì)C++ 而言,這類“分布式增肥”根本就不合適,接受它就會(huì)在C++ 之下為更低級(jí)的語言留下空間,使得對(duì)那些低級(jí)和高性能的應(yīng)用而言,C語言將成為比C++更好的選擇。

這個(gè)規(guī)則在C++的設(shè)計(jì)決策中不斷成為最關(guān)鍵的考慮。虛函數(shù)(3.5節(jié))、多重繼承(12.4.2節(jié))、運(yùn)行時(shí)的類型識(shí)別(14.2.2.2節(jié))、異常處理和模板,都是與此有關(guān)的特征實(shí)例,它們的設(shè)計(jì)也部分地可以歸于這條規(guī)則,都是到了我自己已經(jīng)確信能構(gòu)造出遵守0開銷規(guī)則的實(shí)現(xiàn)方式時(shí),這些特征才被接受進(jìn)來。當(dāng)然,一個(gè)實(shí)現(xiàn)者可以決定在0開銷規(guī)則和系統(tǒng)所需要的某些性質(zhì)之間如何做一種折中,但是也必須仔細(xì)地做。程序員通常對(duì)于分布式的增肥會(huì)有刺耳的、非常情緒化的反應(yīng)。

如果想拒絕人們建議的一個(gè)特征,0開銷規(guī)則可能是所有規(guī)則中最鋒利的一個(gè)。

遇到有疑問的地方就提供手工控制的手段:我對(duì)信任“高級(jí)技術(shù)”總是非常勉強(qiáng),也特別不愿意去假定某些真正復(fù)雜的東西是普遍可用的和代價(jià)低廉的。inline函數(shù)是這方面的一個(gè)很好的例子(2.4.1節(jié))。模板初始化是另一個(gè)例子,我在那里應(yīng)該更當(dāng)心一點(diǎn),后來又不得不增加了一種顯式控制的機(jī)制(15.10節(jié))。對(duì)存儲(chǔ)管理的細(xì)節(jié)控制也是一個(gè)例子,通過手工控制可能得到重要的收獲,然而,只有時(shí)間才能告訴我們這些收獲是不是可以通過某種自動(dòng)化技術(shù)以類似的代價(jià)得到(10.7節(jié))。

4.6 最后的話

對(duì)于各種主要的語言特征,所有這些規(guī)則都必須考慮。忘掉任何一個(gè),都很可能帶來某種不平衡,從而傷害到一部分用戶。與此類似,讓某個(gè)規(guī)則成為主導(dǎo)而損害其他方面,同樣可能帶來類似的問題。

我試著把這些規(guī)則都陳述為正面的命令式的句子,而不是構(gòu)造出一個(gè)禁止表。這可以使它們從本質(zhì)上說更不容易被用于排除新思想。我對(duì)C++ 的觀點(diǎn)是,它是一種生產(chǎn)軟件的新語言,特別關(guān)注那些影響程序結(jié)構(gòu)的機(jī)制。與只做一些小調(diào)整的自然傾向相比,這種觀點(diǎn)走的完全不是同一條路。

ANSI/ISO委員會(huì)工作組對(duì)語言的擴(kuò)充提出了一個(gè)檢查表(6.4.1節(jié)),那是對(duì)一個(gè)語言特征應(yīng)該考慮的問題的更特殊、更細(xì)節(jié)的描述。


[1] 笨(dumb)連接器,指那些傳統(tǒng)的最基本的,不提供任何特殊功能的連接器,也就是一般的系統(tǒng)上普遍使用的連接器?!g者注

本文摘自C++語言之父jarne Stroustrup的經(jīng)典著作《C++語言的設(shè)計(jì)和演化》。

在傳統(tǒng)上,關(guān)于程序設(shè)計(jì)和程序設(shè)計(jì)語言的書都是在解釋某種語言究竟是什么,還有就是如何去使用它。但無論如何,有許多人也很想知道某個(gè)語言為什么會(huì)具有它現(xiàn)在的這個(gè)樣子,以及它是怎樣成為這個(gè)樣子的。本書就是想針對(duì)C++ 語言,給出對(duì)后面這兩個(gè)問題的解釋。在這里要解釋C++ 怎樣從它的初始設(shè)計(jì)演化到今天的這個(gè)語言,要描述造就了C++ 的各種關(guān)鍵性的問題、設(shè)計(jì)目標(biāo)、語言思想和各種約束條件,以及這些東西又是如何隨著時(shí)間的推移而變化的。

當(dāng)然,C++ 語言和造就它的設(shè)計(jì)思想、編程思想自身不會(huì)演化,真正演化的是C++ 用戶們對(duì)于實(shí)際問題的理解,以及他們對(duì)于能夠幫助解決這些問題的工具的理解。因此,本書也將追溯人們用C++ 去處理的各種關(guān)鍵性問題,以及實(shí)際處理那些問題的人們的認(rèn)識(shí),這些都對(duì)C++ 的發(fā)展產(chǎn)生了重要影響。

C++ 仍然是一個(gè)年輕的語言,許多用戶對(duì)這里將要討論的一些問題還不知曉。這里所描述的各種決策的進(jìn)一步推論,可能還需要一些年才能變得更清晰起來。本書要展示的是我個(gè)人關(guān)于C++ 如何出現(xiàn)、它是什么以及它應(yīng)該是什么的觀點(diǎn)。我希望這些東西能幫助人們理解怎樣才能最好地使用C++,理解C++ 的正在繼續(xù)進(jìn)行的演化進(jìn)程。

書中特別要強(qiáng)調(diào)的是整體的設(shè)計(jì)目標(biāo)、現(xiàn)實(shí)的約束以及造就出C++ 的那些人們。有關(guān)各種語言特征的關(guān)鍵性設(shè)計(jì)決策的討論被放到了相應(yīng)的歷史環(huán)境里。這里追溯了C++ 的演化過程,從C with Classes開始,經(jīng)過Release 1.0和2.0,直到當(dāng)前ANSI/ISO的標(biāo)準(zhǔn)化工作,討論了使用、關(guān)注、商業(yè)行為、編譯器、工具、環(huán)境和庫(kù)的爆炸性增長(zhǎng),還討論了C++ 與C、Simula之間關(guān)系的許多細(xì)節(jié)。對(duì)于C++ 與其他語言的關(guān)系只做了簡(jiǎn)短討論。對(duì)主要語言功能的設(shè)計(jì),例如類、繼承、抽象類、重載、存儲(chǔ)管理、模板、異常處理、運(yùn)行時(shí)類型信息和名字空間等,都在一定細(xì)節(jié)程度上進(jìn)行了討論。

本書的根本目的,就是想幫助C++ 程序員更好地認(rèn)識(shí)他們所用的語言,該語言的背景和基本概念;希望能激勵(lì)他們?nèi)ピ囼?yàn)?zāi)切?duì)他們而言全新的C++ 使用方式。本書也可供有經(jīng)驗(yàn)的程序員和程序設(shè)計(jì)語言的學(xué)生閱讀,有可能幫助他們確定使用C++ 是不是一件值得做的事情。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
什么是面向?qū)ο笠呀?jīng)面向?qū)ο笈c面向過程的區(qū)別?
hll
搞程序不再霧里看花,分析初學(xué)者編程者應(yīng)從何種語言開始學(xué)起?
算法表達(dá)中的抽象機(jī)制(一)
Thinking in Java | CHAPTER 1
《C++程序設(shè)計(jì)語言(第1
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服