Visulal C++是什麼?——兼談其他

這個問題很奇怪嗎?大概是。不過,當我又看到有人發表諸如“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的優化手段是多麼有效。在具體的平臺上,在特定的操作系統中,不論多麼強大的工具,最終還是要受到平臺和系統本身的限制。大家應該知道這個悖論吧:上帝能否製造出一塊他自己也舉不起來的石頭?

  我也常常看到“MFC永遠不會過時”或者“C++是不會滅亡的”這種發言。我理解發言人的心情,不過這種說法絕不客觀。一種語言也好,一個Application Framework也罷,它們之所以有今天的地位,並不是純粹自然形成的,有許多複雜因素的作用,也有時勢造英雄的理由在內,所謂“居高聲自遠,非是籍秋風”是也。歷史的舞臺從來不是爲某人專設,即使真有所謂萬古長青的怪胎,恐怕也正應了那句老話:“衆人都死了,只剩咱們兩個老妖精,有什麼意思!”我們現在使用的語言,不論Basic,Pascal還是C++,甚至如日中天的Java和C#,終究都會有功成身退的一天。這並不是我們的損失,相反,薪盡火傳,一種語言中好的,合理的因素,肯定會被後續者所繼承和發揚,自然界的新陳代謝本該如此。

  天空沒有飛翔的痕跡,而飛鳥已經飛過。一種語言只要曾經在歷史上留下濃墨重彩的一筆,完成它“爲先賢繼聖學,爲萬世開太平”的歷史使命(有點誇張),這就夠了,何必纏綿不捨作兒女之態!不知道我有生之年會不會看到C++的消亡,如果真有這麼一天,我會拍手歡呼,因爲這說明已經有了另外一種更新更好的語言來代替它(或許是幾種)。不過照我猜想,像C++這種轟動武林驚萬教的語言,其滅亡恐怕也不會是悄無聲息,而多半屬於“始皇既沒,餘威震於殊俗”那種情況。

  最後請允許我發表一點感慨。語言的優劣其實是一個無需討論的問題,個人的經歷和所處環境在很大程度上就決定了你對某種語言的看法,這是很個人的東西。好比碰到一位法國朋友,他多半會自豪的告訴你:法語是世界上最好最優美的語言。對這種說法我會微笑表示贊同,並且欣賞他的民族自豪感,而不會覺得這是對漢語或者英語的貶低—雖然我心底裏一直深信,漢語纔是世界上最好的語言。當然,如果他對我說“你們那些破爛中文是些什麼玩意”,那我可能就是另外一種反應了。

  說了這麼多,意思無非是想少些無謂的爭論罷了。常在論壇上看到“XXX是最好的語言(編譯器),XX是什麼東西”之類發言。我不想和他們爭論,一個人對一樣東西既然完全失去了接觸和了解的興趣,那麼說什麼大概都沒有用了。只是覺得遺憾而已。人世間的隔膜與誤會,大多是由於彼此不瞭解而引起,而多少悲劇正是由此而發生呵。在編程的世界裏大概不會這麼嚴重,不過言爲心聲,多少也可看出個人的品行。如果某個人A常在我面前說B的壞話,那麼我對B不會有惡感,相反我對A的印象分要減去20。自己不瞭解的人或者事,不管,不說,也就是了。何至於惡言相加呢。

  我參加工作的時間不長,各種各樣的軟件工程師倒是見過不少。就我看到的情況,程序員實在是很沉默寡言的一類人,平時總是表現的溫文爾雅,有時候卻難得的能見到他們大發脾氣,扔鼠標,砸鍵盤,捶顯示器,幹什麼的都有(這種情況多半是遇到沒有辦法除掉的Bug了)。面對親人和朋友的時候他們有時候會選擇長久的沉默,只有坐到機器前面時纔會發現他們的癡迷和狂熱。雖然普遍的不善言談,但是他們似乎總能在遊戲或者網絡中找到發泄的方式。所以我在各種各樣的論壇上看到語法錯誤不忍卒讀的文字,看到互相指責乃至於人身攻擊的情況,甚至看到許多不雅的詞彙,雖然心情無論如何愉快不起來,但是我想我能理解。只是,我仍然感到擔心,畢竟程序員這一行幹幾年就了不起了,而人生還有很長的路要走呢。沒有一個健全的心態,沒有足夠爲人處世的技巧,30歲以後的人生該如何把握呢?

發佈了22 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章