這個(gè)問(wèn)題很奇怪嗎?大概是。不過(guò),當(dāng)我又看到有人發(fā)表諸如“Windows/Office是VC編寫的”或者“VC是無(wú)所不能的”這種高論,我就禁不住這樣問(wèn)自己。
Visual C++究竟是什么?你平常在其中工作的那個(gè)標(biāo)記著“Microsoft Visual C++”的窗口,真的就代表Visual C++嗎?
按照我的理解,Visual C++是一個(gè)開(kāi)發(fā)工具包,它大概可以分成三個(gè)主要的部分:
1. Developer Studio,這是一個(gè)集成開(kāi)發(fā)環(huán)境,我們?nèi)粘9ぷ鞯?9%都是在它上面完成的,再加上它的標(biāo)題赫然寫著“Microsoft Visual C++”,所以很多人理所當(dāng)然的認(rèn)為,那就是Visual C++了。其實(shí)不然,雖然Developer Studio提供了一個(gè)很好的編輯器和很多Wizard,但實(shí)際上它沒(méi)有任何編譯和鏈接程序的功能,真正完成這些工作的幕后英雄后面會(huì)介紹。我們也知道,Developer Studio并不是專門用于VC的,它也同樣用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio當(dāng)成Visual C++, 它充其量只是Visual C++的一個(gè)殼子而已。這一點(diǎn)請(qǐng)切記!
2. MFC。從理論上來(lái)講,MFC也不是專用于Visual C++,Borland C++,C++Builder和Symantec C++同樣可以處理MFC。同時(shí),用Visual C++編寫代碼也并不意味著一定要用MFC,只要愿意,用Visual C++來(lái)編寫SDK程序,或者使用STL,ATL,一樣沒(méi)有限制。不過(guò),Visual C++本來(lái)就是為MFC打造的,Visual C++中的許多特征和語(yǔ)言擴(kuò)展也是為MFC而設(shè)計(jì)的,所以用Visual C++而不用MFC就等于拋棄了Visual C++中很大的一部分功能。但是,Visual C++也不等于MFC。
3. Platform SDK。這才是Visual C++和整個(gè)Visual Studio的精華和靈魂,雖然我們很少能直接接觸到它。大致說(shuō)來(lái),Platform SDK是以Microsoft C/C++編譯器為核心(不是Visual C++,看清楚了),配合MASM,輔以其他一些工具和文檔資料。上面說(shuō)到Developer Studio沒(méi)有編譯程序的功能,那么這項(xiàng)工作是由誰(shuí)來(lái)完成的呢?是CL,是NMAKE,和其他許許多多命令行程序,這些我們看不到的程序才是構(gòu)成Visual Studio的基石。
為什么我會(huì)覺(jué)得“Windows是用VC開(kāi)發(fā)的”這種說(shuō)法很奇怪?因?yàn)樗恕S肰C,可以編寫MFC應(yīng)用,也可以編寫純SDK程序,不論哪一種方式,都不一定是非VC不可。只要樂(lè)意,我完全可以用UltraEdit來(lái)寫出一個(gè)MFC程序,再用CL編譯之,沒(méi)有必要一定動(dòng)用VC這個(gè)大家伙。而且有許多黑客和買不起Visual Studio的人就是這么干的!用SDK編程就更不需要VC了,Down一個(gè)Borlan C++ Compiler下來(lái),或者用lcc之類的編譯器,同樣可以達(dá)到目的。再說(shuō)了,Windows可不是一個(gè)單純的產(chǎn)品。用VC來(lái)編寫Windows外圍程序是完全不成問(wèn)題的,可是操作系統(tǒng)的核心部分呢?就算可以用VC來(lái)編寫代碼,調(diào)試怎么辦?VC自身的調(diào)試器對(duì)一般的應(yīng)用功能是夠強(qiáng)大的,可是對(duì)于系統(tǒng)級(jí)的調(diào)試根本無(wú)能為力,因?yàn)檫@個(gè)調(diào)試器本身就是依賴于操作系統(tǒng)的。只有系統(tǒng)級(jí)的調(diào)試程序如debug,SoftIce和Wdebug這些工具才能完成如此重大的任務(wù)。
從歷史上來(lái)看,Visual C++ 1.0的出現(xiàn)晚于Windows 3.0,而且那時(shí)候的MFC只有一個(gè)雛形而已,用來(lái)開(kāi)發(fā)操作系統(tǒng)根本是不可能的事情。在Visual C++ 1.0的前面倒是有一個(gè)Microsoft C/C++ 7.0,但是它整體水平不如Borland C++ 3.1,在擴(kuò)展內(nèi)存管理方面的功能又不如Watcom C++ ,所以一直沒(méi)有占據(jù)很大的市場(chǎng)。它現(xiàn)在已經(jīng)不作為單獨(dú)的產(chǎn)品,但仍然作為Platform SDK的主要組成部分而存在于Visual Studio產(chǎn)品中,而且其功能比過(guò)去也不可同日而語(yǔ)了。到Windows 95問(wèn)世的時(shí)候,MFC仍然在盡力追趕操作系統(tǒng)的功能。應(yīng)該說(shuō)Visual C++ 5.0是一個(gè)轉(zhuǎn)折點(diǎn),一方面MFC已經(jīng)發(fā)展比較完善,另一方面,操作系統(tǒng)的基本結(jié)構(gòu)也已經(jīng)穩(wěn)定,后面就主要著眼于系統(tǒng)整合與完善作為商務(wù)平臺(tái)的功能。已經(jīng)穩(wěn)定的系統(tǒng)不可能再進(jìn)行翻天覆地的修改,所以,我比較能夠接受“Windows系統(tǒng)是用Microsoft C++和MASM作為編譯器完成的”這種說(shuō)法。研究Windows的系統(tǒng)文件可以看出,很多文件顯示出來(lái)的Linker Version明顯是Microsoft C++編譯器。至于代碼是用什么編寫的?我不知道,也不想知道,除了Developer Studio的編輯器之外,任何好的文本編輯器都能夠做到這一點(diǎn)。
Visual C++是無(wú)所不能的嗎?唔,最好也是分開(kāi)來(lái)說(shuō)。Developer Studio肯定不是—它只是個(gè)外殼而已。MFC呢?也不是。一方面它是對(duì)API的封裝,離開(kāi)了API它就什么也干不了;另一方面,MFC對(duì)API的封裝也不夠全面,有些時(shí)候還是要直接調(diào)用API函數(shù)才能夠“為所欲為”。至于Platform SDK,倒真的可以說(shuō)它幾乎是無(wú)所不能的。不過(guò),過(guò)分強(qiáng)調(diào)這一點(diǎn)并沒(méi)有太大意義。只要有一套完整的編譯器,和必須的支持文件,其他開(kāi)發(fā)工具也可以說(shuō)是“無(wú)所不能”的,比如Borland C++ Compiler或者lcc都可。
老實(shí)說(shuō),我并不喜歡“無(wú)所不能”這類字眼。關(guān)鍵在于各人的理解不同。如果我較起真來(lái),說(shuō)能不能寫個(gè)VC程序讓電腦拿起鼠標(biāo)砸向我不喜歡的老板,你說(shuō)它能辦得到嗎?所謂的“無(wú)所不能”究竟有何意義?讓我用VC寫一個(gè)Server,能在普通工作站上支持每秒幾千萬(wàn)的訪問(wèn)量,殺了我也辦不到,不管VC的優(yōu)化手段是多么有效。在具體的平臺(tái)上,在特定的操作系統(tǒng)中,不論多么強(qiáng)大的工具,最終還是要受到平臺(tái)和系統(tǒng)本身的限制。大家應(yīng)該知道這個(gè)悖論吧:上帝能否制造出一塊他自己也舉不起來(lái)的石頭?
我也常常看到“MFC永遠(yuǎn)不會(huì)過(guò)時(shí)”或者“C++是不會(huì)滅亡的”這種發(fā)言。我理解發(fā)言人的心情,不過(guò)這種說(shuō)法絕不客觀。一種語(yǔ)言也好,一個(gè)Application Framework也罷,它們之所以有今天的地位,并不是純粹自然形成的,有許多復(fù)雜因素的作用,也有時(shí)勢(shì)造英雄的理由在內(nèi),所謂“居高聲自遠(yuǎn),非是籍秋風(fēng)”是也。歷史的舞臺(tái)從來(lái)不是為某人專設(shè),即使真有所謂萬(wàn)古長(zhǎng)青的怪胎,恐怕也正應(yīng)了那句老話:“眾人都死了,只剩咱們兩個(gè)老妖精,有什么意思!”我們現(xiàn)在使用的語(yǔ)言,不論Basic,Pascal還是C++,甚至如日中天的Java和C#,終究都會(huì)有功成身退的一天。這并不是我們的損失,相反,薪盡火傳,一種語(yǔ)言中好的,合理的因素,肯定會(huì)被后續(xù)者所繼承和發(fā)揚(yáng),自然界的新陳代謝本該如此。
天空沒(méi)有飛翔的痕跡,而飛鳥已經(jīng)飛過(guò)。一種語(yǔ)言只要曾經(jīng)在歷史上留下濃墨重彩的一筆,完成它“為先賢繼圣學(xué),為萬(wàn)世開(kāi)太平”的歷史使命(有點(diǎn)夸張),這就夠了,何必纏綿不舍作兒女之態(tài)!不知道我有生之年會(huì)不會(huì)看到C++的消亡,如果真有這么一天,我會(huì)拍手歡呼,因?yàn)檫@說(shuō)明已經(jīng)有了另外一種更新更好的語(yǔ)言來(lái)代替它(或許是幾種)。不過(guò)照我猜想,像C++這種轟動(dòng)武林驚萬(wàn)教的語(yǔ)言,其滅亡恐怕也不會(huì)是悄無(wú)聲息,而多半屬于“始皇既沒(méi),余威震于殊俗”那種情況。
最后請(qǐng)?jiān)试S我發(fā)表一點(diǎn)感慨。語(yǔ)言的優(yōu)劣其實(shí)是一個(gè)無(wú)需討論的問(wèn)題,個(gè)人的經(jīng)歷和所處環(huán)境在很大程度上就決定了你對(duì)某種語(yǔ)言的看法,這是很個(gè)人的東西。好比碰到一位法國(guó)朋友,他多半會(huì)自豪的告訴你:法語(yǔ)是世界上最好最優(yōu)美的語(yǔ)言。對(duì)這種說(shuō)法我會(huì)微笑表示贊同,并且欣賞他的民族自豪感,而不會(huì)覺(jué)得這是對(duì)漢語(yǔ)或者英語(yǔ)的貶低—雖然我心底里一直深信,漢語(yǔ)才是世界上最好的語(yǔ)言。當(dāng)然,如果他對(duì)我說(shuō)“你們那些破爛中文是些什么玩意”,那我可能就是另外一種反應(yīng)了。
說(shuō)了這么多,意思無(wú)非是想少些無(wú)謂的爭(zhēng)論罷了。常在論壇上看到“XXX是最好的語(yǔ)言(編譯器),XX是什么東西”之類發(fā)言。我不想和他們爭(zhēng)論,一個(gè)人對(duì)一樣?xùn)|西既然完全失去了接觸和了解的興趣,那么說(shuō)什么大概都沒(méi)有用了。只是覺(jué)得遺憾而已。人世間的隔膜與誤會(huì),大多是由于彼此不了解而引起,而多少悲劇正是由此而發(fā)生呵。在編程的世界里大概不會(huì)這么嚴(yán)重,不過(guò)言為心聲,多少也可看出個(gè)人的品行。如果某個(gè)人A常在我面前說(shuō)B的壞話,那么我對(duì)B不會(huì)有惡感,相反我對(duì)A的印象分要減去20。自己不了解的人或者事,不管,不說(shuō),也就是了。何至于惡言相加呢。
我參加工作的時(shí)間不長(zhǎng),各種各樣的軟件工程師倒是見(jiàn)過(guò)不少。就我看到的情況,程序員實(shí)在是很沉默寡言的一類人,平時(shí)總是表現(xiàn)的溫文爾雅,有時(shí)候卻難得的能見(jiàn)到他們大發(fā)脾氣,扔鼠標(biāo),砸鍵盤,捶顯示器,干什么的都有(這種情況多半是遇到?jīng)]有辦法除掉的Bug了)。面對(duì)親人和朋友的時(shí)候他們有時(shí)候會(huì)選擇長(zhǎng)久的沉默,只有坐到機(jī)器前面時(shí)才會(huì)發(fā)現(xiàn)他們的癡迷和狂熱。雖然普遍的不善言談,但是他們似乎總能在游戲或者網(wǎng)絡(luò)中找到發(fā)泄的方式。所以我在各種各樣的論壇上看到語(yǔ)法錯(cuò)誤不忍卒讀的文字,看到互相指責(zé)乃至于人身攻擊的情況,甚至看到許多不雅的詞匯,雖然心情無(wú)論如何愉快不起來(lái),但是我想我能理解。只是,我仍然感到擔(dān)心,畢竟程序員這一行干幾年就了不起了,而人生還有很長(zhǎng)的路要走呢。沒(méi)有一個(gè)健全的心態(tài),沒(méi)有足夠?yàn)槿颂幨赖募记桑?0歲以后的人生該如何把握呢?