介紹
計算機雖然功能十分強大。可以供你上網、打遊戲、管理公司人事關係等等,但是沒有程式,它就等於是一堆廢鐵,不會理會我們對它下達的“命令”。於是,我們要馴服它,只有通過一種方式——程式,這也是我們和計算機溝通的唯一方式。
程式也就是指令的集合,它告訴計算機如何執行特殊的任務。
寫出程式後,再由特殊的軟體將你的程式解釋或翻譯成計算機能夠識別的“
計算機語言”,然後計算機就可以“聽得懂”你的話了,並會按照你的吩咐去做事了。因此,編程實際上也就是“人給計算機出規則”這么一個過程。
電腦每做的一次動作,一個步驟,都是按照已經用
計算機語言編好的程式來執行,程式是計算機要執行的指令的集合,而程式全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過
計算機語言向計算機發出命令。
計算機所能識別的語言只有
機器語言,即由0和1構成的代碼。但通常人們編程時,不採用
機器語言,因為它非常難於記憶和識別。
彙編程式
彙編程式的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此彙編
源程式一般比較冗長、複雜、容易出錯,而且使用彙編語言編程需要有更多的計算機專業知識,但彙編語言的優點也是顯而易見的,用彙編語言所能完成的操作不是一般高級語言所能實現的,而且源程式經彙編生成的
執行檔不僅比較小,而且執行速度很快。
高級語言
高級語言是目前絕大多數編程者的選擇。和彙編語言相比,它不但將許多相關的
機器指令合成為單條指令並且去掉了與具體操作有關但與完成工作無關的細節,例如使用
堆疊、
暫存器等,這樣就大大簡化了程式中的指令。由於省略了很多細節,所以編程者也不需要具備太多的專業知識。
高級語言主要是相對於彙編語言而言,它並不是特指某一種具體的語言,而是包括了很多程式語言,如目前流行的VB、VC、FoxPro、Delphi等,這些語言的語法、命令格式都各不相同。
從二十世紀60年代以後,計算機得到了突飛猛進的發展。似乎歷史上沒有任何一門科學的發展速度超過了計算機的發展,無論硬體、軟體、還是網路都以驚人的速度向前發展。軟體的發展速度和硬體一樣,二十世紀九十年代中國的軟體業還不是很成熟,而現在大大小小 的軟體企業四處聳立,共享軟體網上隨處可見。不斷發展的技術需要不斷變化的
程式設計師,例如,如今Visual Basic可以快速構建Windows下的應用程式,
程式設計方面的技術不斷發展著,不斷引進新的概念、新的方法,如從結構化的C開始,當
面向對象的思想被提出後,出現了C++,
微軟在C++的基礎上為使用戶構建win32應用程式更加方便,推出了Visual C++。這也就需要
程式設計師也要不斷的更新自己的技術。
目前常用的基本程式語言的種類比較繁多,比較簡單的有:Pascal、c語言、qBasic、 Fortran、Visual Basic等等。但前幾種都是在DOS下進行編程的工具,Visual Basic是在 Windows下進行應用程式設計的編程工具,現在一般的計算機用戶幾乎都不再使用DOS了,因此我們通常會選擇Visual Basic作為初學者的編程工具。Visual Basic是Windows應用程式設計中最容易上手的編程工具,學習步驟也比較容易被初學者接受。對於剛開始學習編程的初學者來說,還是選擇Visual Basic,學習
程式語言不能想像著一步登天,一步一個腳印的學習才是最佳方法。
文字
早期的作業系統等
系統軟體主要是用彙編語言編寫的(包括 UNIX作業系統在內)。由於彙編語言依賴於
計算機硬體,程式的可讀性和可移植性都比較差。為了提高可讀性和可移植性,最好改用高級語言,但一般的高級語言難以實現彙編語言的某些功能(彙編語言可以直接對硬體進行操作),例如:對
記憶體地址的操作、
位操作等)。人們構想能否找到一種既具有一般高級語言特性,又具有低級語言特性的語言,集它們的優點於一身。於是,C語言就在這種情況下應運而生了。
C語言是在B語言的基礎上發展起來的,它的根源可以追溯到ALGOL 60。1960年出現的ALGOL 60是一種
面向問題的高級語言,它離硬體比較遠,不宜用來編寫系統程式。1963年英國的劍橋大學推出了CPL(CombinedProgram- ming Language)語言。CPL語言在ALGOL 60的基礎上接近了硬體一些,但規模比較大,難以實現。1967年英國劍橋大學的Matin Richards對 CPL語言作了簡化,推出了BCPL(Basic Combined Programming Language)語言。1970年美國貝爾實驗室的 Ken Thompson以 BCPL語言為基礎,又作了進一步簡化,設計出了很簡單的而且很接近硬體的 B語言( 取 BCPL的第一個字母),並用 B語言寫第一個UNIX作業系統,在PDP-7上實現。1971年在PDP-11/20上實現了B語言,並寫了UNIX作業系統。但B語言過於簡單,功能有限。1972年至 1973年間,貝爾實驗室的 D.M.Ritchie在B語言的基礎上設計出了C語言(取 BCPL的第二個字母)。C語言既保持了BCPL和B語言的優點(精練、接近硬體),又克服了它們的缺點(過於簡單、數據無類型等)。最初的C語言只是為描述和實現UNIX作業系統提供一種工作語言而設計的。1973年,K.Thom- pson和D.M.ritchie兩人合作把UNIX的90%以上用 C改寫(UNIX第5版。原來的 UNIX作業系統是1969年由美國的貝爾實驗室的 K.Thompson和D.M.Ritchie開發成功的,是用彙編語言寫的)。
後來,C語言多次作了改進,但主要還是在貝爾實驗室內部使用。直到1- 975年UNIX第6版公布後 ,C語言的突出優點才引起人們普遍注意。1977年出現了不依賴於具體機器的C語言編譯文本《可移植C語言編譯程式》,使C移植到其它機器時所做的工作大大簡化了,這也推動了UNIX作業系統迅速地在各種機器上實現。例如,VAX,AT&T等計算機系統都相繼開發了UNIX。隨著 UNIX的日益廣泛使用,C語言也迅速得到推廣。C語言和UNIX可以說是一對孿生兄弟,在發展過程中相輔相成。1978年以後,C語言已先後移植到大、中、小、微型機上,已獨立於UNIX和PDP了。現在C語言已風靡全世界,成為世界上套用最廣泛的幾種
計算機語言之一。
以1978年發表的UNIX第7版中的C
編譯程式為基礎,Brian W.Kernighan和 Dennis M.Ritchie(合稱K&R)合著了影響深遠了名著《The C Programming Lan- guage》,這本書中介紹的C語言成為後來廣泛使用的C語言版本的基礎,它被稱為標準C。1983年,美國國家標準化協會(ANSI)根據C語言問世以來各種版本對C的發展和擴充 ,制定了新的標準,稱為ANSI C。ANSI C比原來的標準C有了很大的發展。K&R在1988年修改了他們的經典著作《The C Progra- mming Language》 ,按照ANSI C的標準重新寫了該書。1987年,ANSI C又公布了新標準--87 ANSI C。目前流行的C
編譯系統都是以它為基礎的。
C++ 是脫胎自 C 語言的一種中級語言. 從計算機角度看,它可以嵌入ASM等低端語言; 從
面向對象的程式設計角度看,它有具備OOP的三個基本特徵 -- 抽象,封裝和繼承; 同時從市場角度來看,它又不是純面向對象,其實那些純粹的
面向對象語言的陣地只是在實驗室.
比較
顯著變化
名字空間的問題,
原始的C語言使用公共的名字空間,這樣無論是開發本人還是第三方團隊都面臨變數名字耗盡的問題. 而C++提供獨立的名字空間,而且對象的引入也為名字空間提供了進一步劃分
代碼復用的問題,
C語言使用函式館的方式或者DLL方式實現代碼復用,在接口穩定的前提下實現內部修改和數據及其實現的封裝. C++提供了類庫機制實現了具有層次的代碼復用,和多種繼承機制,同時重載等各種機制提供了進一步的復用實現. 使得類庫和代碼更加容易維護,雖然建立類庫在人員,組織等各個方面還是比較麻煩的.
安全機制
. 因為有了類機制,有一些初始化操作可以自動實現
效率問題
因為C語言本質上是站在計算機立場的非常注重效率的問題,但是事物總是具備矛盾的兩面,過於偏重效率和軟體危機的出現,反而增加了程式設計的難度. 而OOA的現實世界角度的考慮問題更加貼近自然,使得代碼或者程式更加具備穩定性,可擴展性和可維護性.
版本
Visual Studio 2005 速成版產品
使用速成版產品開發應用程式入門。速成版產品擴展了 Visual Studio 產品線,涵蓋了許多輕型、易學易用的工具,以供那些希望構建動態 Windows 應用程式的業餘愛好者、學生和初學者使用。
NET Framework 2.0 SDK 和可再發行組件
包括開發人員在編寫、生成、測試、部署和運行 .NET Framework 應用程式時所需的一切。64 位版本和 x86 版本已發布。
Visual Studio 2005!
要評估 Visual Studio 2005,可以有從 Express Edition 到 Trial Edition 到線上託管體驗多種選擇。找到最適合您的試用體驗,看看 Visual Studio 2005 的強大功能如何轉變您的應用程式。
Visual C++ Express 版
為業餘愛好者、 初學者和學生開發人員嘗試此免費、 輕便、 易用,易學的工具。獲取比其他 Express 版本更好的控制程度的所有馬力。
Microsoft Windows Vista SDK
Microsoft Windows Vista 提供了大量在安全,性能,可靠性和管理性方面的新功能。下載 SDK,獲得所有所需的工具來打造託管和本機應用程式,充分利用 WindowsVista 的強大功能。
為此,和經典物理同量子物理一樣. C/C++ 今天在不同領域各自發揮著最大的效率.
各種程式語言的比較
前言 Java群體每天都在擴大,它既包括一些世界最大的ISV,也包括公司CIO、信息技術人員、系統分析人員、C/S開發人員、編程人員、多媒體設計者、市場行銷人員、教育工作者、經理、影視生產者甚至業餘愛好者等廣泛的用戶。從傳統上看,這樣一些人在一起有效地工作是不多見的。當我們談到開放系統時,我們往往是就已發表的API及規格,或者源碼的可得性,或者硬體、聯網及作業系統而言的,沒有一個人是從人的開放意義上來談的。Java完成了開放系統的閉合鏈。它開發了人力資源,而反過來又開闢了共同工作的道路。一談到Java,人們馬上會想起一種類似於C++的、適用於分布環境的面向對象程式語言,想到這種語言的簡單、穩定、安全、與體系結構無關、可移植、可解釋、高性能、多執行緒和動態性等特徵。這些都是Java作為一種
程式設計語言的主要特徵。Java是由Sun公司的一個技術小組研製出來的。在實現Java語言的過程中,Sun小組的技術人員很快就意識到:C++無法成為一種完全面向對象的、網路化的開發語言。C++是通過給原先的C語言增加面向對象功能而開發出來的,因此,它存在著先天不足。這主要體現在C++種類繁多,功能大量冗餘,同時又沒有任何一種C++編譯器能夠支持它的全部功能。鑒於這種情況,Sun公司的技術人員決定不擴充C++,而開發一種全新的計算機語言(Java的前身Oak)。但是,C++已經成了大多數編程人員所熟練掌握的語言,Java的設計顯然不能無視這個現實。如果Java和C++之間的差別過大,那么程式設計師們在學會這種語言的過程中無疑要花費大量的時間和精力。因此,Java保留了儘可能多的C++風格。Java自誕生起,為網路用戶創造了無數客戶端的小應用程式,由於這類應用程式效果良好、數量巨大,以至於許多用戶想到Java程式語言時,會在腦海中出現一個不完全正確的印象-Java是用來編寫小的客戶端程式的。其實,隨著技術的進步,Java語言正在逐步改變自己執行效率較低、無法擔任企業關鍵計算任務的形象,不斷向計算技術的核心地帶前進。今天的Java技術正沿著網路滲入各個套用領域。企業計算:企業計算是Java最重要的技術主題。Sun公司已經公布了企業JavaBean(EJB,Enterprise JavaBean)的規格,隨後眾多公司開始開發企業套用領域的Java技術。IBM公司也已經為Windows NT開發了IBM HPCJ(High Performance Compiler for Java)12.0版,同時研製了IBM JDK(JavaDevelopment Kit)for Windows NT,Novell公司也在宣布了一個新的伺服器端的企業Java平台,而Sun公司也在積極地升級自己的JDK系統,這個形勢表明,Java正在穩步走向企業高端計算。對於Java來說,與其它程式語言爭奪企業計算主力編程工具的優勢在於:其一,Java在進行面向對象的編程工作時,比其它的程式語言如C++更加簡單,因此保證了編程的高效率,減少了編程投入;其二,Java虛擬機技術所提供的"一次編程,到處使用"的跨平台能力非常適合網路環境,這給Java在網路伺服器端的發展提供了便利條件;其三,Java擁有強大的提供商和支持者隊伍,該隊伍包括IBM、Oracle、Novell、Sybase和Netscape等公司。提速運行:許多企業的套用開發人員非常喜愛Java的語言特性,但是在開發重要系統時,語言特性和執行效率之間的抉擇往往令人傷透腦筋。在關鍵計算中,用戶可能並不在乎數據如何壓縮或者運行的延遲關係如何設定,但是對程式的運行速度卻非常重視,這使廠商將Java的編譯策略開發放在了首位。現在的Java語言,其執行方式已經不僅僅是解釋執行方式了,即時編譯器(JITC、just-in-time compiler)技術和原型編譯技術已經被許多廠家採用,包括Sun、IBM、Oracle以及Netscape等公司在內的技術提供商正在利用這些技術逐步提高Java的執行速度,其中IBM公司早已將Java虛擬機(JVM,JavaVirtual Machine)、作業系統和硬體的特性有機的結合在一起,非常有效地提高了Java的執行效率。嵌入計算:嵌入式Java是一個潛力巨大的套用技術,該技術充分發揮了Java小巧靈活的特點。以HP公司為例,該公司以自己的方式製造編譯工具和Java虛擬機,其目的是將Java嵌入各種設備,如印表機、醫學監視器和自動提款機等。嵌入設備依靠一個實時作業系統來處理某一個實時生效的事件,Java被嵌入這些設備後,通過實時擴展(real-time extension)開始發揮作用,使設備具備了一定的智慧型性,增強了嵌入設備的可管理性和可用性,大大提高了設備的工作效率。各廠商對這一潛力巨大的市場都非常重視,目前該市場缺乏的是一個標準,如果存在標準的話,相信很快就會有大量使用嵌入Java技術的設備上市。微軟剛剛發行的Windows XP放棄了對Java的支持,但Java能夠獨立運行於很多操作平台上,其中也包括Linux,並且在某些特性上要比在Windows上發揮得更好,我們完全有理由拋棄Windows而選擇使用Linux來做Java開發。現在,你可以左手拿著Linux,右手拿著Java,然後對面帶微笑手裡拿著Windows XP的Bill Gates說:"讓你的XP去見鬼吧!" 對於軟體開發者來講,任何一種程式語言都不可能是完美的。如果希望更好地理解Java語言,最好的方法是把這種語言與其同類型的語言相比較。既然Java類似於C++,把它同C++進行一番比較也是順理成章的事情,哪一個好,哪一個不好,每個開發人員都有各自的看法。我個人認為Java開發要比C++好一些。當然每個人的看法和喜好是不同的。後面的文章將向大家介紹Java和C++的不同和對其的改進。孰強孰弱,大家自然就會明白了。我們知道,Java一開始採用C++的語法格式,基本上是為了讓程式設計者可以很快地熟悉 Java的語法格式,縮短學習Java的時間,畢竟C和C++仍舊是最多人會的一種程式語言。但是如果我們仔細檢查Java程式語言的許多細節設計,我們可以發現Java去掉了不少C++的特點,並且加入一些新的特性。這些與C++的差異包括:1.不再有#define、#include等預處理程式(Preprocessor)的功能 C++語言很重要的一個特點就是它的預處理程式。有些其他程式語言雖然也加入了#include的功能,但是還是欠缺處理宏(Macro)的能力。#define的功能在Java中我們可以用定義常數(constant)的方式來取代,而#include在Java中是不需要的,因為在Java中程式在執行時,會把類型數據記錄在對象實體之中,我們不需要靠一些標頭檔案(header file)來知道我們使用的對象或數值是屬於什麼數據類型。如果你使用C++語言時,只使用預處理程式的#include和#define功能的話,那么你大概不會覺得Java這樣的設計對你產生什麼樣的困擾,但是如果你是使用C++語言預處理程式中宏功能的高手,你可能會覺得很不方便,進而懷疑Java如此設計的意義何在。使用預處理程式雖然可以很方便地達到許多功能,但是站在軟體工程的角度上看,對整個軟體的維護其實是很不利的。由於C++語言中預處理程式的功能太過強大,厲害的程式設計高手常會自行開發一套只有自己看的懂的宏語言,一旦整個軟體要交給其他人去維護,後繼者很難在短時間內了解前一個人所寫下的宏功能,增加軟體開發時團隊工作及日後維護的困難度。另外一點則是C++語言的編譯器所看到的程式代碼,其實和程式設計者看到的程式代碼是不同的。程式設計者看到的是尚未經過預處理程式處理過的程式代碼,而編譯器看到的則是預處理程式處理過的程式代碼,一旦交給預處理程式處理的宏內容有誤,編譯器產生的錯誤信息將不會是程式設計師所預料的。而這一點自然也增加了程式在排錯時的困難度。預處理程式的存在也造成了閱讀程式的不便。如果你想使用別人已經完成的C++語言程式,那么通常你不但要閱讀他所寫下的檔案,還必須一併查閱上檔案,才能了解其程式的全貌。如果換成是Java程式,只要查看java的程式檔案就夠了。2.不再有structure、union及typedef 事實上,早在C++中就可以去掉C語言中的structure和union等對複雜數據的自定結構類型,因為類(Class)的定義方式可以完全做到這項功能。而typedef也是不必要的,一切都用類就可以了。雖然C++這樣的設計是為了和C語言兼容,但是使用多餘的語言特點不但不必要,而且容易造成對程式認識的混淆。3.不再有函式 在Java程式語言中,去掉了程式嚮導語言中最重要的單元--函式(Function)。如果我們以對象嚮導的觀念來看待函式,就可以了解函式在對象嚮導的概念中,是不必要的。在對象嚮導的程式觀念里,對象的數據才是真正的主體,而處理對象數據的方法則必須依附在對象內才有意義。因此,去掉函式並不表示不再有子程式等模組化程 序的概念,相反地,是利用對象中的方法來取代函式,再一次強化對嚮導的發展策略。4.不再有多重繼承(Multiplelnheritance) 在C++中,多重繼承是一項很強的功能,但也是一般人難以掌控的部分。去掉多重繼承雖然降低了Java語言的功能,但是也大幅簡化撰寫程式時的困難度。雖然移除了多重繼承的功能,但是Java提供了interface的方式,可以達到部分多重繼承的功用。所謂的interface基本上定義了一個類的對外溝通的方法原型,以及類內部的常 數,和多重繼承不同之處在於interface並不會定義類方法的內容,以及類中的變數數據。5.不再有Goto 在程式語言的發展史上,Goto一直是毀譽參半的一項功能。在很多時候使用Goto可以大幅減少不必要的程式代碼,但是也由於Goto可以很自由地改變程式的流程,如果冒然地使用,更可能造成程式結構混亂的情況。一般來說,正確使用Goto的例子多出現在循環內部,想要提早結束某一層循環。在C語言中,我們可以使用break 或contine來改變某一層循環的流程, 但如果想要改變兩層以上的環執行流程,不是使用Goto就是以多餘的布爾(boolean)變數,配合上一串if-then-else的判斷來達成。Java一方面移除了Goto的功能, 而另一方面同時擴大了break和continue的功能,可以允許多層循環的break或continue。如此一來不但避免了濫用Goto的可能性,同時也保存下Goto的好處。6.不再有OperatorOverloading 在C++中,Operator Overloading同樣也是一項值得討論的設計。幾乎在所有C++的書中,都會引用一些例子,告訴你使用OperatorOverloading可以使你的程式看起來更為自然。如下面是一個程式設計師自定義的複數類://C++中自定義的複數類及0pemtor Overloading class Complex{public:Complex(double real,double image){Real_number=real;Image_number=image;}Complex operator+(Complex&rhs){Return Complex(rhs.real_number+real_number,rhs.image_number+image_,nulnbef);}private:doublereal_number //實部doublejmage_nunmber; //虛部}
在這裡,如果你使用+來作為複數的加法符號,大家都不會有疑義,但是如果你使用的是*或》這樣的符號,那么別人看到你的程式之後,難保不會產生認識上的錯誤。這也是Operator Overloading一大問題,當大家都對運算符賦予自己的定義後,整個程式的可讀性就會大受影響。Operator Overloading的存在並不是必要的,我們一樣可以定義類中的方法來達到同樣的目的,至於Java去掉這項功能的利弊,恐怕就要讀者自己去評斷了。7.取消自動類型轉換 Java是一個嚴格進行類型檢查的程式語言,對於下面這樣的程式,在C++的編譯器上編譯時最多只會出現警告的信息,但是在Java里則不予通過:Int aInteger; Double aDouble=2.71828; AInteger = aDouble; 雖然這樣的轉型在C++里是合法的,但是也會造成數據精確度的損失。Java為了要確定寫程式的人充分地了解這點,必須要程式設計強制轉型(type casting),Java的編譯器才會接受:int aInteger;doublea Double=2.71828;aInteger=(int)aDouble;8.不再有指針 取消指針(Pointer)這樣數據類型,可能會讓許多熟悉C++語言的程式設計師大吃一驚。在C++語言裡,靈活地運用指針是許多程式設計師的得意之作,但是占整個除錯時間最久的也是指針的問題。配合上C++對記憶體管理的態度,程式設計師必須要自己去追蹤自己向系統要到的記憶體,最後確實地交還給系統,並且在使用指針時,要小心翼翼地注意不要跨過合法的記憶空間,造成Segmentation Fault或General Protection Fault之類的問題。Java去掉了指針類型,並不表示程式設計師在開發高級數據結構,像堆疊(stack)、 佇列(queue)、二元樹(binarytree)時,都必須要像在傳統Basic上,利用大範圍的數組來自行模擬系統記憶體,自行建構類似指針的表示方式。相反地,Java提供了和Lisp語言中相似的Reference類型,通過Reference去讀取配置到的記憶體內容,可以確保不會去讀取到不屬於自己的記憶體空間,而另一方面,程式的執行系統也可以動態地去做記憶體垃圾回收的工作,將沒有被reference參考到的記憶體空間回收給系統使用。9.和C++連線 不管Java是多么強大,總是有人需要把它和C++連線起來。因為只要有一個新的程式語言或是軟體開發工具一出現,大家就會問:"它是否具有和原有程式庫連線的能力呢?"也因為C++語言在電腦界中占了很重要的地位。大家的問題其實就等於是直接問"它是否可以和C++連線?"。目前在Java中,的確提供了和C++語言連線的方法,它的做法基本上是先將C++語言所寫的程式建構成動態連結函式館(DynamicLinking Library,DLL),再由Java程式去調用DLL里的函式。這種連線的方式,使得DLL中的函式,從Java的眼光看就是一個"方法"。不過因為這種方法是直接由其他的程式語言所提供,而不是以Java語言所寫的,所以它被稱之為"原生方法"(NativeMethod)。由於Java Applet一些安全上的限制,所以這種連線外部程式的方法只能用在Java Application內。小結:事實上,constant和typedef這兩條語句包含了#define語句的作用。現在,結構和聯合已經被Java的類所代替。刪除這些特性的原因是:由於其希望維持與C語言的向後兼容性,C ++的語言規範包含了大量冗餘。比如,類實際上就已經包括了結構和聯合的作用,因此這兩種數據結構完全可以取消。關於#define語句,Java語言規範的制訂者認為:儘管該語句的出發點是為了增強程式的可讀性,但實際效果卻恰恰相反,它常常導致難讀的代碼,故應該予以取消。Java不再支持獨立函式,因此任何函式都必須封裝到某個類中。由於人們普遍認為, C++所用的超類是非常不穩定的,因此Java拋棄了C++中的多繼承並代之以接口。Java的接口指的是,在別的類看來一個類所能實現的方法。它所顯示的只是一個類的方法或常量和變數 ,而不是這個類的全部結構。最後,Java還取消了C++中的GOTO語句、操作符重載、自動類型轉換及指針數據類型。GOTO語句引起的爭議已經有很多年了,可一直陰魂不散,這跟某些程式設計師對該語句一直情有獨鐘有關。C++仍然支持數據類型的自動轉換,但Java要求編程人員顯式實現數據類型之間的轉換。自動數據類型轉換使得兩個數據類型互不兼容的變數可以相互賦值,而不需要給出顯式說明。這有時會導致一些問題,其中最常見的是精確度損失。比方說,如果把一個帶符號的32位整數賦給一個無符號整數,則所有的結果均為正數。Java的設計者們認為這很容易引起程式錯誤,從而決定不支持這種轉換方式。
C語言是一種
面向過程的基於模組的語言。一般用在和彙編混和編程的
嵌入式開發或者較低層的
驅動程式開發,作業系統設計。開發周期長,代碼維護成本高,可移植性差,但是程式運行效率高,可以更直接的控制硬體。
C++當然就是c的升級版本,兼容c的語法,並且多了oo,模板,重構等高級軟體技術。開發周期短,代碼維護也相對容易,功能強大,應該說是20年來軟體業近乎無敵的
程式設計語言。不過學習周期偏長,熟練掌握還需要時間和經驗的積累。
C#是
微軟從borland公司挖走的一位高手設計的,該神人曾經在borland公司用彙編設計了pascal
編譯器,程式設計能力之強,非常人能及。C#是一種類型於java的語言,需要運行環境支持才能執行。執行效率當然就不能和c,c++相提並論,不過這樣帶來了良好的可移植性,可以在支持。net運行環境的各種平台下執行,並且方便的與其他。net語言進行交換編程,更方便
程式設計師間進行交流。
我覺得C++最大的優勢在於她的通用和全面。我們往往聽到C++和其他語言的比較:諸如運行效率不如C啦、
套用軟體的開發效率上不如Java和.NET啦、GUI開發不如VB啦……以及在各個方面與各種專用語言和
腳本語言的比較。似乎C++就沒有自己最突出的地方,簡直一無是處。我想說的是,先不談比較的結果,這些比較能夠成立,本身就說明了C++的優勢——她是通用的,她是全面的。在成熟的主流語言中,除了C++,還有誰能夠做到這一點?!
另外一些比較則罕有提及:與C語言比開發套用軟體?與Java比做底層?與VB比運行效率?是的,很罕見。因為結論顯而易見以至任何的比較都是浪費時間。當然了,她們都有各自的適用範圍,做好本職就好了,何必與你比其他的。這是一種生存之道,無可厚非。唯有C++,選擇了另一條道路——“通用語言”,不是象C那樣“通用的”底層語言,也不是象Java那樣其實只能在一個平台上運行的“跨平台”語言,而是真正的通用:通用於所有層次、通用於所有平台、通用於所有領域,對所有的套用都不偏不倚、一視同仁。
要做到這一點是很困難的,C++往往被人指責野心過大。還有各種各樣的誤解:有指責VC只能在Windows上使用的(所以C++是不能跨平台的);有指責gcc無法快速開發GUI的(所以C++的套用是有局限的);有指責Java、.NET和
腳本語言占據了絕大部分
網站開發的(所以C++是不能適應網路時代的)……這些指責說得人多了,就成為了真理。我不想去一一解疑,只想說明一點:語言之間的比較很少是公正的,因為誤解是廣泛存在的。
無疑,C++的野心確實很大,“通用”二字貌似華麗有餘,實惠不足。常常有人說:學習C++,然後使用其他專門語言。是的,在一個特定領域裡,通用往往比不上專用的。但是,整體總是大於部分之和。如果說,“博”和“精”各有所長的話,那么又博且精不是更好嗎?就象我們常常用電腦,而不是分立的上網機、辦公機、遊戲機、編程機 ……雖然C++不能包攬所有的冠軍,但是如果她在哪方面都不算太差的話,又何必執著於虛幻的完美呢?
確實,C++能夠立足於世,不僅在於她是“通用”的,更在於她是“全面”的。你常常能在某個局部找到她的一點不足。是的,她有一個不足;那么,能否改進呢?回答是:不能!為什麼?回答是:如果改進了這一點,就會出現新的不足,可能是另一點,甚或更多。就象一個已經擠滿了人的車廂,要上去一個,就得再下來一個!是的,C++就是這樣的車廂,她無法讓你享受悠閒的空間,反而給你窒息的感覺;但是,正是這樣的車廂,支撐著主幹交通的正常運行(想想吧,如果一個人口密集的大城市裡全部都是私家車,會是什麼狀況)。車廂可能會越做越大,因為技術正在不斷提高,但是C++這個車廂,永遠都是滿的。一個局部的不足,如果不存在被改進的可能,恰恰暗示了已經達到了全局最佳!C++正是以此為目標的;並且,她做到了!
回到我們最初的比較上。
C++的運行效率不如C嗎?是的,也許吧,以特定的標準。但是,不如在哪些方面呢?
虛函式、
虛基類、
異常處理……這些都是C所不具備的。如果在C++中不使用它們,那么效率就不會比C低(優秀的
編譯器確實可以做到這一點)!C++考慮問題永遠是綜合的,而非單方面的,她的效率,趨近於你在享用各種特性時所能達到的最佳值,你只付出必然的代價。
C++在
套用軟體的開發效率上不如Java和.NET嗎?是的,也許吧,以特定的標準。但是,原因是什麼呢?是C++語言不及Java和.NET嗎?不是的。只是因為後兩者是產品,而C++是語言。這個比較,本身就是不合適的。在.NET中,你同樣可以使用C++,同樣可以達到它的開發效率。另外,C++並不限制其實現產品,所以每個特定套用領域都可以有其特定的
編譯器,它們幫助程式設計師達到各自最佳的開發效率。如果單論語言,那么只有C++的語言複雜度會影響這一話題。也許Java等更容易上手,但是對兩方面的資深人員來說,C++的開發效率毫不遜色。值得一提的是,在比較時應該同時考慮套用的複雜度。另外,需要知道,作為產品的Java和.NET預處理了一些套用複雜度,而這些產品本身很大程度上(如果不說全部的話)是用C++開發的。
C++在GUI開發方面不如VB嗎?是的,也許吧,以特定的標準。但是,為什麼呢?作為語言,C++沒有制訂標準的GUI庫,因為GUI太複雜,要達到通用的最佳,很難。因此,C++放棄了這方面的通用化。但是,每個具體的實現可以使用各自最佳化的GUI庫。VC比VB如何?如果嫌它還不算快速開發,BCB呢?另外,還有QT等通用GUI庫。在語言方面,C++追求通用和全面,而局部的最佳化,交給具體的實現來完成,這是C++成功的秘訣。
綜上所述,我認為C++的優勢就在於她的通用和全面(也有人認為這正是她的劣勢,也許吧,從另一個角度)。她的通用,來源於其始終不變的遠大理想(也可稱之為“野心”);而她的全面,則得益於她的設計者們力爭上遊、精益求精的工作態度!就象我曾經說過的,C++真正的優勢在於C++社群——那些設計她的人,實現她的人,以及使用她的人。那些表面的優勢來源於此,也歸結於此。C++的開局很不錯,現在仍很好;而她的未來,將由我們來決定……