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