C++ 記事本: 從歷史說起


C 的簡史

在談論 C++ 的歷史那么必須先得了解 C 的歷史,那么我們先來看一段來自於 <<C專家編程>> 對 C 語言史前階段的簡單闡述:


Ken Thompson(左), Dennis Ritchie (右)

聽上去有些荒謬,C 語言竟然源於一個失敗的的項目.1969 年,通用電氣、麻省理工、學院和貝爾實驗室聯合創建了一個龐大的項目 -- Multics 工程。該項目的目的是創建一個操作系統,當是顯然遇到了麻煩: 它不但無法交付原先所承諾的快速而便捷的在線系統,甚至連一點有用的東西都沒弄出來.雖然開發小組最終勉強讓 Multics 開動起來,但他們還是陷入了泥塘,就像 IBM 在 OS/360 上面一樣.他們試圖建立一個非常巨大的操作系統,能夠應用於規模很小的硬件系統中.Mutics 成了總結工程教訓的寶庫,但它同時也為 C 語言體系 "小即使美" 鋪平了道路.
當心灰意冷的貝爾實驗室的專家們撤離 Multics 工程后,他們又去尋找其他任務.其中一名叫 Ken Thompson 的研究人員對另一個操作系統很感興趣,他為此好幾次向貝爾管理層提議,但均遭否決.在等待官方批准時,Thompson 和他的同事 Dennis Ritchie 自娛自樂,把 Thompson 的 "太空旅行軟件" 移植到不太常用的 PDP-7 系統上.太空旅行軟件模擬太陽系統的主要星體,把它們顯示在圖形屏幕上.並創建了一架航天飛機,它能夠飛行並降落到各個行星上.於此同時, Thompson 加緊工作,為 PDP-7 編寫了一個簡易的新型操作系統.它比 Multics 簡單的許多,也輕便許多.整個系統都是用匯編寫的.Brian Kernighan 在 1970 年給它取名為 Unix,自嘲笑總結了從 Multics 中獲取得的那些不應該做的教訓.

然而上面所述的好像和 C 語言沒有太大的關系.好吧是的,到目前為止所說的都是為引出下面的正文.來看一段中文 wikipedia 對 C 語言的wikipedia

而 C 語言最早是由丹尼斯·里奇為了在 PDP-11 電腦上運行的 Unix 系統所設計出來的編程語言,第一次發展在 1969 年到 1973 年之間.之所以被稱為 "C" 是因為 C 語言的很多特性是由一種更早的被稱為 B 語言的編程語言中發展而來.早期操作系統的核心大多由匯編語言組成,隨着 C 語言的發展,C 語言已經可以用來編寫操作系統的核心.1973年,Unix 操作系統的核心正式用 C 語言改寫,這是 C 語言第一次應用在操作系統的核心編寫上.

其實在 1970 年, Thompson 發現 BCPL 太慢了,而且缺乏運行時的支持,他將 BCPL 進行了實驗性的修改,並為它起了一個有趣的名字 B 語言,意思是將 CPL 語言進行壓縮,提煉出它的精華.B 是 BCPL 的一個簡化版,而且被設計成專門用來進行系統編程,但它依然不能滿足程序員們的要求:它的字符處理機制太丑陋了,而且浮點數運算被實現得並不是很理想,處理指針時開銷太大.

過了兩年即 1972 年,當 PDP-11 進入貝爾實驗室時,Thompson 的同伴,同樣在貝爾實驗室的 Dennis Ritchie,在從 BCPL 中抽取了一些共性放入 B 語言中,對 B 進行了改進,並且在里面加入了數據類型,他把這個擴展的語言稱為 NB(New B).隨后,他又繼續對新語言進行大量修改,似乎可以用新的名字來重新命名它了,於是他取了 B 后面的那個字母作為這種語言的名字,這就是 C 語言.(曾幾何時,人們猜測 C 的后裔會被命名為 P──BCPL 的第三個字母,而不是 D,但如今最顯見的 C 的后裔語言是叫 C++.).那么下圖便是 C 語言大概的發展史:

后來有進過一段的時間 C 語言在此基礎上得到了一些改進和發展.形成了一系列對應的體系.體系如下(若想看每個標准中對 C 語言的改進, 點這里):

C++ 由來

在 c 語言風靡一時的時候,由於 Dennis Ritchie 相信程序員能夠做好自己的事情所以沒有做出過多的假定.所以開發團隊的專業水平會導致程序的可讀性,以及維護性與擴展性有着天壤之別.於是有些人便希望引入一些特性來緩解這個問題.讓程序的具有更好的模塊化和可維護性.於是在 1983 年 Stroustrup 的 C++ 橫空出世. 來看看 C++ 是如何由來的.下面引入一段在 wikipedia 的 C++ 發展史:


Bjarne Stroustrup

Stroustrup 工作起於1979年的 C with Classes.這個構思起源於 Stroustrup 做博士論文時的一些程序撰寫經驗.他發現 Simula 具備很利於大型軟件開發的特點,但 Simula 的運行速度太慢,無法對現實需求發揮功效;BCPL 雖快得多,但它過於低級的特性,使其不適於大型軟件的開發.當 Stroustrup 開始在貝爾實驗室工作時,他有分析 UNIX 核心關於分散式計算的問題.回想起他的博士論文經驗,Stroustrup 開始為 C 語言增強一些類似 Simula 的特點.之所以選擇 C,是因為它適於各種用途、快速和可移植性.除了 C 和 Simula 之外,同時也從其它語言中取得靈感,如 ALGOL 68、Ada、CLU 以及 ML.剛開始時,類型、派生類、存儲類型檢查、內聯和默認參數特性,都是通過 Cfront 引入 C 語言之中.1985 年 10 月出現了第一個商業化發布.
1983 年,C with Classes 改命名為 C++.加入了新的特性,其中包括虛函數、函數名和運算符重載、參考、常數、用戶可控制的自由空間存儲區控制、改良的類型檢查,以及新的雙斜線 (//) 單行注解風格.1985 年,發布第一版《C++程序設計語言》,提供一個重點的語言參考,至此還不是官方標准.1989 年,發布了 Release 2.0.引入了多重繼承、抽象類型、靜態成員函數、常數成員函數,以及成員保護.1990 年,出版了 The Annotated C++ Reference Manual.這本書后來成為標准化的基礎.稍后還引入了模板、異常處理、命名空間、新的強制類型轉換,以及布爾.

C++ 引進了一些列新的特性.用類來讓程序具有更好的模塊化,更好的可讀性.用靜態檢查來排錯.用模板來解決代碼復用的問題.若還想初略地了解下 C++ 的特性可以 點這里.下圖是 C++ 的大概的發展:

隨着時間的推移,C++ 也形成了一系列對應的體系.體系如下:

后敘(純屬個人觀點)

看完 C 與 C++ 的發展由來也可以看出 C 與 C++ 最初的設計初衷,其實每一門語言的設計,都有它的權衡.到底它是設計者怎樣的願景,語言也會在其願景的特定條件下體現出明顯的優勢.熟不用其長避其短.語言的特性也一樣.例如 C++ 的眾多特性一樣.它們都有其最適合的使用場景.在編程中應該根據場景而選擇性的使用其中的特性 (而選擇合適的技術去開發而不是選擇最熟練的技術來開發,往往也是最難的).從而提供程序整體的可讀性,維護性與擴展性.當然程序的質量,不取決於語言而取決於編碼者的編碼水平.所以這里不討論 C 與 C++ 孰優孰劣.

不過 C++ 的特性眾多.就像個怪胎.每個特性要是用的好的話也是可以 "一招鮮,吃遍天" 的.但是本人不是太贊成這種做法便是.放松一下.下面來幅 coolshell 21天教你學會C++ 的趣圖,有興趣的朋友可以點擊上面鏈接查看原文:

由於 C++ 的特性眾多若想要一一精通的話也是需要不少時間的.下面便是程序員自信心曲線圖.同樣也來至於 coolshell 中的 C++程序員自信心曲線圖 (有興趣的朋友可以 點這里)

其實,個人感覺 C++ 為一門特性非常多的語言並且它的特性相互不影響.所以這些特點導致你要在特定場景下選擇合適的特性使用,否則可能會出現運行效率低下且難以維護的窘境.所以想要能夠優雅的使用它或稱為一名合格的 C++ 程序員必須付出一段艱辛的學習過程,去了解編譯器和類背着你做了很多你不知道的事,例如去了解虛函數表,了解多重繼承 (不太建議使用),了解宏和模板等等,讓它稱為你所使用的一種高效的開發語言.最好拋棄可以在十幾天就能搞定它的想法哈.好了上一趣圖作為全文結束.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM