主流的程序設計語言:C++、Delphi(ObjectPascal)、Java、C#
桌面應用程序框架:MFC、VCL、QT、JavaAWTSWING、.Net
企業應用程序框架:WindowsDNA(ASP、COM、COM+)、J2EE、.NetFramework
開發工具:VisualBasic、Delphi、VisualC++、C++Builder、VisualC#
*程序設計語言:C++Delphi(本來應該是ObjectPascal,但為了簡單,我就語言和工具混為一談吧)JavaC#(雖然他剛剛推出,但因為微軟為之傾注了大量心血,一定會成為一種重要的開發語言)
*桌面應用程序框架:MFCVCL
*企業應用程序框架:WindowsDNAJ2EE.Net
*COM技術:我單獨提出這項技術,是因為它無法簡單的被視為語言、桌面應用程序框架或企業應用程序框架,它與這些都有關系。
2.1 程序設計語言
2.1.1 C++語言的演進
最初要從二進制代碼和匯編說起,但那太遙遠了。我們就從面向過程的語言說起吧(包括BasicCFortranPascal)。這種面向過程的高級語言終于把計算機帶入了尋常的應用領域。其中的C語言因為它的簡單和靈活造就了Unix和Windows這樣的偉大的軟件。
面向對象的語言是計算機語言的一個合乎邏輯的進化,因為在沒有過多的影響效率、簡單性的前提下提供了一種更好的組織數據的方法,可使程序更容易理解,更容易管理——這一點可能會引出不同意見,但事實勝于雄辯,C++終于讓C語言的領地越來越小,當今還活著的計算機語言或多或少的都具備面向對象的特征,所以這一點并不會引起太多困惑。C++的成功很大程度要歸因于C,C++成為它今天的樣子是合乎邏輯的產物。因為在面向過程的時代,C幾乎已經統一天下了。今天著名的語言象JavaC#都從C借鑒了很多東西,C#本來的意思就是C++++。其實C++曾經很有理由統一面向對象程序設計語言的天下來著,但可惜的是,C++太復雜了。即使是一個熟練的程序員,要你很清楚的解釋一些問題你也會很頭痛。舉幾個還不是那么復雜的例子來說:
對=的重載成員轉換函數拷貝構造函數轉化構造函數之間有什么區別和聯系呢?
定義一個類成員函數private:virtualvoidMemFun()=0;是什么意義呢?
int(*(*x(int))[4])(double);是什么意思?
還有其他的特征,比如說可以用來制造一種新語言的typedef和宏(雖然宏不是C++的一部分,但它與C++的關系實在太密切了),讓你一不小心就摔跤的內存問題(只要new和delete就可以了嗎?有沒有考慮一個對象存放在容器中的情況?)……諸如此類,C++是如此的復雜以至于要學會它就需要很長的時間,而且你會發現即使你用C++已經好幾年了,你還會發現經常有新東西可學。你想解決一個應用領域的問題——比如說從數據庫里面查詢數據、更改數據那樣的問題,可是你卻需要首先為C++頭痛一陣子才可以,是的,你精通C++,你可以很容易的回答我的問題,可是你有沒有想過你付出了多大的代價呢?我不是想過分的譴責C++,我本人喜歡C++,我甚至建議一個認真的開發普通的應用系統的程序員也去學習一下C++,C++中的一些特性,比如說指針運算模板STL幾乎讓人愛不釋手,宏可以用幾個字符代替很多代碼,對系統級的程序員來說,C++的地位是不可替代的,Java的虛擬機就是C++寫的。C++還將繼續存在而且有旺盛的生命力。
2.1.2 Java和C#
Java和C#相對于C++的不同最大的有兩點:第一點是他們運行在一個虛擬環境之中,第二點是語法簡單。對于開發人員而言,在語法和語言機制的角度可以把Java和C#視為同一種語言。C#更多的是個政治的產物而不是技術產物。如果不是Sun為難微軟的話,我想微軟不會費盡心力推出一個和Java差不多的C++++,記得Visual J++嗎,記得WFC嗎?看看那些東西就會知道微軟為Java曾經傾注了多少心血。而且從更廣泛的角度來說,兩者也是非常相似的——C#和Java面對的是同樣的問題,面向應用領域的問題:事務處理、遠程訪問、Webservice、Web頁面發布、圖形界面。那么在這一段中,我暫且用Java這個名字指代Java和C#兩種語言——盡管兩者在細節上確實有區別。Java是適合解決應用領域的問題的語言。最大的原因Java對于使用者來說非常簡單。想想你學會并且能夠使用Java需要多長時間,學會并且能夠使用C++要多長時間。由于Java很大程度上屏蔽了內存管理問題,而且沒有那么多為了微小的性能提升定義的特殊的內容(比如說,在Java里面沒有virtual這個關鍵字,Java也不允許你直接在棧上創建對象,Java明確的區分bool和整型變量),他讓你盡量一致的方式操作所有的東西,除了基本數據類型,所有的東西都是對象,你必須通過引用來操 作他們;除了這些之外,Java還提供了豐富的類庫幫助你解決應用問題——因為它是面向應用的語言,它為你提供了多線程標準、JDBC標準、GUI標準,而這些標準在C++中是不存在的,因為C++并不是直接面向解決應用問題的用戶,有人試圖在C++中加入這些內容,但并不成功,因為C++本身太復雜了,用這種復雜的語言來實現這種復雜的應用程序框架本身就是一件艱難的事情,稍后我們會提到這種嘗試——COM技術。漸漸的,人們不會再用C++開發應用領域的軟件,象MFCQTCOM這一類的東西最終也將退出歷史舞臺。
2.1.3 Delphi
Delphi是從用C++開發應用系統轉向用Java開發應用系統的一個中間產物。它比C++簡單,簡單的幾乎象Java一樣,因為它的簡單,定義和使用豐富的類庫成為可能,而且Delphi也這么做了,結果就是VCL和其他的組件庫。而另一方面,它又比運行于虛擬環境的Java效率要高一些,這樣在簡單性和效率的平衡之中,Delphi找到了自己的生存空間。而且預計在未來的一段時間之內,這個生存空間將仍然是存在的?梢悦黠@的看出,微軟放棄了這個領域,他專注于兩方面:系統語言C++和未來的Java(其實是.Net)。也許這對于Borland來說,是一件很幸運的事情。如果我能夠給Borland提一些建議的話,那就是不要把Delphi弄得越來越復雜,如果那樣,就是把自己的用戶趕到了C++或Java的領地。在虛擬機沒有最終占領所有的應用程序開發領域之前,Delphi和Delphi的用戶仍然會生存得很好。
2.2桌面應用程序框架
目前真正成功的桌面應用程序框架只有兩個,一個是MFC,一個是VCL,還有一些其他的,但事實上并未進入應用領域。遺憾的是我對兩個桌面應用程序框架都不精通。但這不妨礙我對他做出正確的評價。
2.2.1MFC
MFC(還有曾經的OWL)是SDK編程的正常演化的結果,就象是C++是C的演化結果一樣。MFC本身是一件了不起但不那么成功的作品,而且它過時了。這就是我的結論。MFC凝聚了很多天才的智慧——當然,OWL和VCL也一樣,侯捷的《深入淺出MFC》把這些智慧擺在了我們的面前。但是這件東西用起來估計不會有人覺得很舒服,如果你一直在用Java、VB或者Delphi,再回過頭來用MFC,不舒服的感覺會更加強烈。我不能夠解釋MFC為什么沒有能夠最終發展成和VCL一樣簡單好用的桌面程序框架,也許是微軟沒精力或者沒動力,總之MFC就是那個樣子了,而且也不會再有發展,它已經被拋棄了。我有時候想,也許基于C++這種復雜的語言開發MFC這樣的東西本身就是錯誤的——可以開發這樣的一個框架,但不應當要求使用它的人熟悉了整個框架之后才能夠使用這個系統,但很顯然,如果你不了解MFC的內部機制,是不太可能把它用好的,我不能解釋清楚為什么會出現這種現象。
2.2.2VCL
相比之下VCL要成功的得多。我相信很多使用VCL的人可能沒有像MFC的用戶研究MFC那樣費勁的研究過VCL的內部機制。但這不妨礙他們開發出好用好看的應用程序,這就足夠了,還有什么好說的呢?VCL給你提供了一種簡單一致的機制,讓你可以寫出復雜的應用程序。在李維的Borland故事那篇文章中曾經說過,在Borland C++ 3.1推出之后Borland就有人提出開發類似C++ Builder一類的軟件,后來竟未成行。是啊,如果C++ Builder是在那個時候出現的,今天的軟件開發領域將會是怎么樣的世界呢?真的不能想象。也許再過一段時間,這些都將不再重要。因為新生的語言如Java和C#都提供了類似于VCL的桌面應用程序框架。那個時候,加上Java和C#本身的簡單性,如果他們的速度有足夠塊,連Delphi這種語言也要消失了,還有什么好爭論的呢?只是對于今天的桌面程序開發人員來說,VCL確實是最好的選擇
|