C到C++語言進(jìn)化史
C++語言的順利推廣顯然要很感謝C語言已有的龐大用戶群,但是在C++的語言風(fēng)格中也深深的烙上了C語言的印記,這就是許多人為什么喜歡使用C++語言的理由吧。
程序代碼也有風(fēng)格,這算不得什么新鮮事。早在20世紀(jì)80年代, C語言程序員就必須在K&R風(fēng)格和ANSI風(fēng)格之間擇善而從。但平心而論。我確實沒有見過哪一種語言能像C++這樣,在代碼風(fēng)格方面表現(xiàn)得如此詭譎和難以捉摸:誰也說不清C++代碼究竟能衍生出多少種迥異的風(fēng)格。
但我知道,有許多C++初學(xué)者在面對不同風(fēng)格的C++代碼時,經(jīng)常會誤以為自己看到的是好幾種完全不同的編程語言——僅此一點就足以提醒我們,研究和廓清C++語言風(fēng)格的演化和發(fā)展規(guī)律已是當(dāng)務(wù)之急了。
和文體學(xué)家們研究歷朝歷代文體變遷的工作相仿,研究C++語言風(fēng)格的流變史也沒有什么捷徑可走。我們只能依據(jù)劉勰在《文心雕龍》中提倡的“原始以表末”[1]的研究方法,循著歷史的脈絡(luò),推求代碼風(fēng)格的來源,探尋風(fēng)格演化的內(nèi)因,并借以闡明技術(shù)發(fā)展的趨勢和規(guī)律。
1. 帶類的C——對C語言風(fēng)格的因襲
在1983年12月Bjarne Stroustrup采納Rick Mascitti的建議,將其發(fā)明的新語言命名為“C++”之前,人們一直用“帶類的C(C with Classes)”來稱呼這種脫胎于C語言的,帶有數(shù)據(jù)抽象機制的“方言”。雖然帶類的C在本質(zhì)上僅僅是一種可以被預(yù)處理程序Cpre轉(zhuǎn)換為傳統(tǒng)C語言代碼(這類似于我們在Oracle中見到的Pro*C語言的預(yù)處理過程)的擴(kuò)展性語言,但它的確在風(fēng)格上奠定了后來所有C++代碼的基礎(chǔ)。
- class stack {
- char s[SIZE];
- char* min;
- char* top;
- char* max;
- void new();
- public:
- void push(char);
- char pop();
- };
這段“帶類的C”代碼錄自Stroustrup所著的《C++語言的設(shè)計和演化》。代碼中的new()其實是類stack的構(gòu)造函數(shù),這與后來的C++語言有很大的不同。顯而易見,帶類的C在風(fēng)格上幾乎完整地承襲了C語言的衣缽。代碼中的聲明語句看上去與C語言一模一樣,class的結(jié)構(gòu)也與C語言中struct的結(jié)構(gòu)大致相仿。
這些跡象反映出C++語言來源于C又盡量與C保持兼容的設(shè)計思想——這種設(shè)計思想既為C++的迅速普及提供了便利(C++語言的順利推廣顯然得益于C語言已有的龐大用戶群)。
也在C++語言風(fēng)格中深深地烙上了C語言的印記,以至于在若干年后,當(dāng)C++語言已經(jīng)基本具備了“獨立人格”的時候,Stroustrup還不得不時常提醒人們要盡量拋開C語言的思維方式。
另一方面,Stroustrup從Simula語言借用的類、派生、訪問控制等面向?qū)ο蟾拍钤趲ь惖腃中牢牢地扎下了根。據(jù)Stroustrup介紹,他為C語言引入面向?qū)ο髾C制的本意在于尋找一種“合適的工具”[2],以便實現(xiàn)分布式系統(tǒng)或解決類似的復(fù)雜問題。但無論怎樣,Stroustrup將C的高效和Simula的優(yōu)雅捆綁在一起的做法都在事實上為C++語言埋下了“雙重性格”的種子——很難說這不是C++語言風(fēng)格多樣化的直接誘因。
【編輯推薦】