1.1 C++與C
有人說C++語言是從C語言發展過來的,下面我們就先從C語言開始來探討一下C語言和C++語言的發展歷史。
1.1.1 C語言
早期的操作系統等系統軟件主要是用匯編語言編寫的,如UNIX操作系統。由于匯編語言依賴于計算機硬件,程序的可讀性和可移植性都比較差。為了提高可讀性和可移植性,最好改用高級語言,但一般高級語言難以實現匯編語言的某些功能,而匯編語言可以直接對硬件進行操作,例如,對內存地址的操作、對位(bit)操作等。人們設想能否找到一種既具有一般高級語言特性,又具有低級語言特性的語言,于是C語言就應運而生了,之后成為國際上廣泛流行的計算機高級語言。它適合作為系統描述語言,既可用來寫系統軟件,也可用來寫應用軟件。
C語言是在B語言的基礎上發展起來的,它的根源可以追溯到ALGOL 60。1960年出現的ALGOL 60是一種面向問題的高級語言,它離硬件比較遠,不宜用來編寫系統程序,1963年英國劍橋大學推出了CPL(Combined Programming Language)。CPL在ALGOL 60的基礎上更接近硬件,但規模比較大,難以實現。1967年英國劍橋大學的Matin Richards對CPL作了簡化,推出了BCPL(Basic Combined Programming Language)。1970年美國貝爾實驗室的Ken Thompson以BCPL為基礎,又作了進一步簡化,它使得BCPL能擠壓在8KB內存中運行,這個很簡單而且很接近硬件的語言就是B語言(取BCPL的第一個字母),并用它寫了第一個UNIX操作系統,在DEC PDP-7上實現。1971年在PDP-11/20上實現了B語言,并寫了UNIX操作系統。但B語言過于簡單,功能有限,并且和BCPL都是“無類型”的語言。
1972年至1973年間,貝爾實驗室的D.M.Ritchie在B語言的基礎上設計出了C語言(取BCPL的第二個字母)。C語言既保持了BCPL和B語言的優點(精練、接近硬件),又克服了它們的缺點(過于簡單、數據無類型等)。最初的C語言只是為描述和實現UNIX操作系統提供一種工具語言而設計的。1973年,K.Thompson和D.M.Ritchie兩人合作把UNIX中的90%以上的功能用C語言進行了編寫,即UNIX第5版。原來的UNIX操作系統是1969年由美國貝爾實驗室的K.Thompson和D.M.Ritchie開發成功的,是用匯編語言寫的。這樣,UNIX使分散的計算系統之間的大規模聯網以及互聯網成為可能。
后來,C語言多次進行了改進,但主要還是在貝爾實驗室內部使用。直到1975年UNIX第6版公布后,C語言的突出優點才引起人們普遍注意。1977年出現了不依賴于具體機器的C語言編譯文本——可移植C語言編譯程序,使C移植到其他機器時所需做的工作大大簡化了,這也推動了UNIX操作系統迅速地在各種機器上實現。例如,VAX、AT&T等計算機系統都相繼開發了UNIX。隨著UNIX的日益廣泛使用,C語言也得到迅速推廣。C語言和UNIX可以說是一對孿生兄弟,在發展過程中相輔相成。1978年以后,C語言已先后移植到大、中、小、微型機上,如IBM System/370、Honeywell 6000和Interdata 8/32,且已獨立于UNIX和PDP了。現在C語言已風靡全世界,成為世界上應用最廣泛的幾種計算機語言之一。
以1978年由美國電話電報公司(AT&T)貝爾實驗室正式發表的UNIX第7版中的C編譯程序為基礎,Brian W.Kernighan(柯尼漢)和Dennis M.Ritchie(里奇)合著了影響深遠的名著《The C Programming Language》,我們常常稱它為“K&R”,也有人稱之為“K&R標準”或“白皮書”(White Book),它成為后來廣泛使用的C語言版本的基礎,但在K&R中并沒有定義一個完整的標準C語言。為此,1983年,美國國家標準化協會(ANSI)X3J11委員會根據C語言問世以來的各種版本對C進行了發展和擴充,制定了新的標準,稱為ANSI C,ANSI C比原來的標準C有了很大的發展。K&R在1988年修改了他們的經典著作《The C Programming Language》,按照ANSI C標準重寫了該書。1987年,ANSI又公布了新標準——87 ANSI C,目前流行的C編譯系統都是以它為基礎的。當時廣泛流行的各種版本的C語言編譯系統雖然基本部分是相同的,但也有一些不同之處。在微型機上使用的有Microsoft C(MS C)、Borland Turbo C、Quick C和AT&T C等,它們的不同版本又略有差異。到后來的Java、C++、C#都是以C語言為基礎發展起來的。
1989年,C語言被ANSI標準化(ANSI X3.159-1989),標準化的目的是擴展K&R C,這個標準包括了一些新的特性。在K&R推出后,一些新的特征被“非官方”地加到C語言中。
在ANSI標準化自己的過程中,一些新的特征被加了進去。ANSI也標準了函數庫。ANSI C標準被ISO(國際標準化組織)采納成為ISO 9899。ISO的第一個版本文件在1990年出版。
在ANSI標準化后,C語言的標準在相當一段時間內都保持不變,盡管C++繼續在改進。實際上,Normative Amendment1在1995年已經開發了一個新的C語言版本,但是這個版本鮮為人知。標準在20世紀90年代才經歷了改進,這就是ISO9899:1999(1999年出版),這個版本就是我們通常提及的C99,它被ANSI于2000年3月采用。
在C99中包括的特性有:
? 可變范圍的數組;
? 新增加的數據類型,包括long long int、布爾類型和用于表示復數的類型;
? 支持用//表示注釋(這個特性實際上在C89的很多編譯器上已經被支持了)。
但是各個公司對C99的支持所表現出來的興趣不同。當GCC和其他一些商業編譯器支持C99的大部分特性的時候,微軟和Borland卻似乎對此并不感興趣。
從C語言誕生之日起直到現在,C語言已經被世界各國的程序開發人員所采用,從而成為編程語言中使用最廣泛的編程語言。
1.1.2 C++
語言的發展是一個逐步遞進的過程,C++是直接從C語言發展過來的。1979年4月,Bjarne博士等人開始分析研究UNIX的內核。同年10月,Bjarne博士完成了一個可以運行的預處理程序,稱之為Cpre,它為C加上了類似Simula的類機制。在這個過程中,Bjarne博士開始思考是不是要開發一種新的語言,當時貝爾實驗室對這個想法很感興趣,就讓Bjarne博士等人組成了一個開發小組,專門進行研究。
當時不是叫做C++,而是C with class,這是把它當作一種C語言的有效擴充。由于當時C語言在編程界居于老大的地位,要想發展一種新的語言,最強大的競爭對手就是C語言,所以當時有兩個問題最受關注:C++要在運行時間、代碼緊湊性和數據緊湊性方面能夠與C語言相媲美,但是還要盡量避免在語言應用領域的限制。在這種情況下,一個很自然的想法就是讓C++從C語言繼承過來,但是Bjarne博士更具有先見之明,他為了避免受到C語言局限性的影響,參考了很多語言,例如:從Simula繼承了類的概念,從Algol68繼承了運算符重載、引用以及在任何地方聲明變量的能力,從BCPL獲得了“//”注釋,從Ada得到了模板、名字空間,從Ada、Clu和ML獲得了異常。
到今天為止,C++已經有20多年的歷史了,在這20多年中,大致可以分為以下三個階段。
? 第一階段從20世紀80年代到1995年。這一階段C++語言基本上是傳統類型上的面向對象語言,并且憑借著接近C語言的效率,在工業界使用的開發語言中占據了相當大的份額。
? 第二階段從1995年到2000年,這一階段由于標準模板庫(STL)和后來的Boost等程序庫的出現,泛型程序設計在C++中占據了越來越多的比重,同時由于Java、C#等語言的出現和硬件價格的大規模下降,C++受到了一定的沖擊。
? 第三階段從2000年至今,由于以Loki、MPL等程序庫為代表的產生式編程和模板元編程的出現,C++出現了發展歷史上又一個新的高峰,這些新技術的出現以及和原有技術的融合,使C++已經成為當今主流程序設計語言中最復雜的一員。
C++的發展過程中已經形成了一個自身的標準,稱為標準C++,標準C++的最大好處就是可以在不同標準的C++編譯器上運行并得到相同的運行結果,使用標準C++的開發人員之間可以充分地使用標準C++提供的標準庫,從而提高開發人員的開發速度和工作效率,提高抽象編程的程度。
使用C++語言進行編程時可以根據實際情況采用不同的程序設計方法,在現代社會中,編程的規模既有小且經濟型的又有大且復雜型的,因此,當開發人員進行編程時,就要根據實際的情況選擇不同的程序設計方法,而編程語言也應該更加靈活、方便且涉及面較廣,可以說C++語言是一種復合性的語言,而且這種復合不但沒有以放棄計算機高效運行的速率為代價,而且在面對較復雜的編程時也提高了程序的編程質量以及程序語言的描述能力。C++語言較好地繼承了C語言的優良傳統,而且在C語言的基礎上繼續發揚光大。
1.1.3 C和C++比較
C++語言是在C語言的基礎上發展起來的,C++的發展與壯大主要體現在其程序設計思想的進步,使其更加有利于大型復雜程序的開發,尤其是面向對象開發思想的提出,從很大程度上提高了開發人員的編程效率和代碼組織能力,C語言到C++的轉變是編程思想由面向過程的程序設計思想到面向對象的程序設計思想的轉變,在本節中,我們將對C語言和C++語言進行比較。C語言主要擁有以下特點。
? 簡潔、靈活:C語言將高級語言的基本結構和語句與低級語言的實用性進行了結合,使其可以像匯編語言一樣對位、字節和地址進行操作,使得開發人員使用C語言進行編程時更加靈活。
? 運算符比較豐富:C語言中大概有34個運算符,使用這些運算符可以表達和計算各種各樣的表達式,通過運算符的靈活使用可以表達在其他高級程序語言中才能表達的表達式。
? 數據結構比較豐富:C語言中除了包含其他語言中包含的基本數據類型(如整型、字符型等),還引入了指針類型的數據類型,在程序中恰當地運用指針可以極大提高程序的靈活性和工作效率。
? C語言是結構式的語言:程序的結構化可以降低程序之間的耦合度,利用C語言中提供的控制語句,可以很容易將C語言中的功能進行單獨開發,為后期代碼的維護提供了方便。
? 可以直接對硬件進行操作:C語言可以像匯編語言那樣直接對計算機硬件進行操作,利用C語言可以進行計算機操作系統的開發,例如著名的Linux操作系統。
? 執行效率比較高。
? C語言開發出來的軟件具有較強的移植性。
使用C語言進行開發的軟件可以在不同的操作平臺之間運行,并得到正確的結果。具有較強的移植性也是C語言一直以來受到廣大開發人員青睞的一個重要特點。
C++語言從C語言的基礎上發展而來,其不但繼承了C語言的優點,而且還在C語言的基礎之上設計出了新的編程思想,下面來著重講述一下C++語言的優點。C++語言主要擁有以下特點。
?C++語言繼承了C語言的一些特點,不但具有面向過程的思想,還支持面向對象的思想,使熟悉C語言的程序員可以快速地進入C++領域的開發工作。
? C++語言生成的代碼質量高且運行速度與C語言的差距在±5%之間。
? C++語言中引入了異常處理機制,在代碼中使用異常處理機制可以提高軟件系統的健壯性,使開發人員可以利用較少的代碼來處理程序中的異常信息。
? C++語言提供了重載函數以及可以在函數中使用默認參數。重載函數的函數名可以相同但是函數的參數個數和參數類型卻不可以完全相同,程序運行時系統根據參數的個數和類型來匹配相應的函數。默認參數可以使得程序員能夠以不同的方法調用同一個函數,并且可以利用默認參數提供的默認參數值。如果在調用時傳遞了參數值,則忽略函數定義時的默認參數值。
? 提供了模板機制。模板技術可以大大地減少代碼的開發量。模板又可以分為函數模板和類模板。模板的使用提高了代碼重復使用的效率,并且減少了代碼的開發成本。
? 類的使用,類可以將具有相同特征的一些數據、方法組織到一起,且能夠很好地實現代碼的封裝。
? 除此之外,C++語言還對C語言進行了擴展,例如注釋符的使用,不但繼承了C語言的“/**/”注釋符號,還擴展了“//”注釋符號。
在現在的開發過程中,C語言和C++都扮演著重要的角色,很難從某一方面來判斷到底哪種語言更加優越,C和C++語言將在很長一段時間內相互依存,程序開發者要根據實際情況以及實際工作要求來選擇合適的語言進行程序的開發。