作者:伊利貴 張虹 2001年01月05日 14:48
現在,對於一個正在進行項目開發的公司來說,選擇一門Windows下的開發語言已經不再像以前那麼容易。C++曾經是商業開發最好的選擇,但是現在,開發者們已經沒有時間,也沒有耐心一遍遍重復“編寫代碼——編譯——排錯”這樣一個無休止的循環,也不再想去一次次地修補多年前編制的程序裡的漏洞,他們已經厭倦了這一切。雖然Windows下的C++編程相對來說比較容易,但網絡時代的飛快節奏已經不允許他們慢條斯理地跟自己的開發工具較勁。他們需要一個高效的、安全的開發工具。
相對於C++而言,Java的優勢是開發周期短、代碼安全(因為沒有指針),以及平台無關性等。然而對於底層開發,Java還是不夠理想。盡管這樣,還是有眾多的程序員開始選擇Java作為開發工具,這其中當然包括很多原先Windows的開發者。也許正因為這樣,微軟才匆忙發行了其.NET SDK(軟件開發工具箱)的beta預覽版。該開發工具下載下來後共有86M,它向我們展示了未來Windows環境下的一個新開發理念。在工具包中包含有一個C#編譯器,它是一種新的程序語言,被命名為“利齒的C”。不知這一利齒,會把Java咬成什麼樣子。不過對於C++,C#似乎有趕盡殺絕之意。
C++上長出的利齒 這款微軟打制的另類C++對於那些投身於Windows C++開發的人來說,應該說是一大福音,因為它減輕了C++給程序員帶來的痛苦。它不同於C++,當然也不同於Java,它使得訪問Windows本身所具有的各項服務(包括網絡對象、Uis和網絡通信)變得非常容易。和Java一樣,C#通過避免一般的編程錯誤和自動資源管理,使得C#的穩定性得到了極大的增強。
如果已經熟悉了C++,那麼學習C#要比學習Java要容易得多。C#不是由微軟來管理,而是由ECMA(歐洲計算機制造聯合會)來管理,和JavaScript一樣。ECMA是一個獨立的實體。並且,然beta預覽版裡沒有做什麼暗示,但是有消息稱微軟將發行其它操作系統版的.NET和C#(beta版只能在Windiws2000上運行)。如果這是真的,那麼不久的將來,C#很有可能大行其道。
有批評家告誡說:.NET和C#只不過是一種已經被宣布或銷售但還沒有正式生產的新型軟件。即使是這樣,也不能阻止人們使用C#的熱情。我們用它工作了近一個月,發現它的確要比我們以前使用過的編譯器好得多。事實上,因為這款編譯器表現確實非常的好,以至於現在已經有開發者在Internet和Web論壇上進行一些C#的代碼交換(比如:http://www.csharpindex.com)。
現在已經出現了一種編寫C#的編輯器,並且其它從事商業編輯器的商家也正在測試其對C#的支持情況。一個好的代碼編輯應該使得編寫一個Web服務器變得很容易。現在微軟正在聯合Vertigo Software,准備再推出一個實用的.NET電子商務示范產品。
C++症結何在? Java的創始者認為,C++對於程序設計的放任政策給了C++開發者予極大的自由。他們不僅可以輕松訪問系統資源,甚至對於語言本身也可以進行重新修改。這也許算得上是一大特色,但也正是這一大特色毀掉了C++本身。用C++編制的程序,代碼的錯誤有可能導致系統漏洞,導致非法或者惡意的內存操作。不僅如此,因為它的問題很難排除,所以令很多程序員大傷腦筋。
Java應用程序的穩定性,主要得力於其摒棄了C++的一些諸如人工內存定位、指針(直接指向內存)、瞬時變量和超載管理員等功能。此外,其自動的內存管理、方便的平台無關性以及大量的預定義Java對象,都使得Java開發者對於對象的定義和使用都變得非常容易。
應該說,Java卓越的設計使得企業軟件的開發有了很大的改變,但是由於它背離了C++的語法,使得它很難被C++的開發者們所接受。這在很大程度上阻礙了其發展和普及。
和Java相反,C#則是將C++向類似Java的方向擴展,這些擴展包括自動內存管理、對象壽命管理、解釋執行、輕松訪問外部對象和簡化對象的創建。C++有益的概念被Java摒棄了,比如超載管理員和參考變量,而C#則保留了這些概念。被Java拋棄的指針在C#中也得到了保留,只不過它不再像以前那樣無所不能。它僅被使用在那些被標記為非安全的代碼段裡。
向C#移植 從C++轉變到C#,就像從人工方式轉化到自動方式一樣?在C++裡,必須為對象分配一明確的空閒內存,而在C#裡,內存的分配則是自動完成的。被C#的對象占用的內存在該對象不再被使用時,將被釋放(即內存垃圾的回收技術,這是Java裡被人們廣為稱贊的一項技術)。
在C++裡,為了訪問一些系統服務,就必須在文件頭裡包含進許多文件,而這些文件中的大部分,在對象設計中,根本用不上。在C#裡,系統服務被透明地包裝在一些和C#兼容的對象裡。在C++裡,要把C++對象變換成Windows的COM(Component Objec Model)是非常困難的,而在C#裡對象會被自動地轉換成.NET模式,並且可以從各種.NET語言裡進行訪問。
.NET層保證了對象可以在各種語言中使用,所以就沒有必要進行數據的轉換或者外部對象的轉換。
現在,使用C#最大的困難就是要求程序員習慣於在不用離合器的情況也能換檔。也就說,一旦調整過來以後,C#將要比C++容易駕馭得多。Java需要其C++開發者們學習的是一種新的做事情的方法。而對於轉向C#來說,C++的開發者們放棄的只是在系統開發過程中的那些用代碼編寫的難看的對象和糟糕的內存管理。而他們還依舊可以使用指針和參考變量,這給了C#開發者們一種直接、簡單的訪問外部模塊(包括32位的Windows動態鏈接庫)的途徑。
把Windows C++應用程序轉換成Java應用程序將是一件非常痛苦的事情,但是如果把它轉換成C#,.NET多語言交叉的功能將使這一切變得比較容易,並且轉換後的應用程序將會在穩定性上得到很大的增強。微軟似乎對於輕松訪問現有程序方面下了很大的功夫,效果也很不錯。
除了模塊要求具有很好的性能外,要把現有的C++應用程序移植到.NET,選擇C#將是一個明智之舉。微軟的.NET擴展到Visual C++,使得其和C#代碼整合變得非常的容易。
C#是繼承人 C#的產生是因為微軟在.NET上需要一種類Java的語言,而Java本身卻不能勝任這一需求。C#太像C++了,以至於它很難給人帶來體驗新事物時的那種興奮。不過,可以相信,絕大部分的C++開發者將會因為C#保留了C++中大部分其喜歡的、強大的、令人激動的功能而選擇使用它。不管微軟的動機如何,就C#直接由ECMA來管理這件事,還是很令公眾滿意的。這使我們有機會得到非微軟的C#工具和編譯器以及其它機構發行的資源。
第三方的C#開發工具將不需要從微軟獲得語言許可證書,這就會使得這些工具的價格維持在一個較低的水平。相反的,因為Sun使其Java脫離標准的軌跡,以至它只能孤軍奮戰,在Java發展的道路上獨行。
因為.NET依賴於C#,且只能在Windows上運行,所以微軟在企業級的開發上實際已經落後於Sun。不過,由於其.NET框架是獨立於特定語言的,所以將使得微軟在競爭中也能占到了一部分市場份額。即使是在beta版裡,開發者也可以使用C++、C#、Visual Basic、JavaScript、 Visual FoxPro來開發.NET應用程序。他們可以譯成一種所謂IL(中間語言)的代碼語言,並且共享一個定義在數據無關技術上的框架。因為沒有VB、C#和JavaScript對象,而只有.NET對象,所以開發者可以使用幾種語言代碼進行混合編程。
對於傳統編程來說,在項目開發中,開發者們都喜歡選用同一種語言,因為這樣便於不同開發者間進行連接。現在.NET將不再有這種限制,開發者可以把C#、VB、C++和JavaScript放在同一代碼編譯器裡,而.NET層可以把這些塊捏合在一起,並且還會有更多的程序語言將可以.NET中使用。開發者可以選用自己最熟悉的和最喜歡的程序語言來進行開發。這就意味著可以使用盡量少的時間、更低的培訓費用、明了簡潔的源代碼,這一切都將使得開發者的開發過程變得非常愉快。
對於C#來說,其完成的一項首要工作是使得C++的開發者們能夠訪問其.NET框架。這可不是一件容易的事,因為.NET的目的是要成為Windows企業應用開發的核心。在佛羅裡達州奧蘭多舉行的專業開發人員大會上,.NET初次亮相,微軟向世人展示了.NET不僅是獨立於硬件的,而且在多平台間交互也很方便。
微軟對於其.NET的移植計劃一直保持著沉默,當然使其運行在Windows下是首位的問題,但我們懷疑微軟是否會將其盡快地移植到Solaris和Linux上。一旦.NET擴展到Windows以外的其它系統,那麼C#將成為Java真正的強有力的競爭對手。到那時,C#將成為C++在Windows企業開發中的真正繼承人。