初級編程
初級編程
簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。彙編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。
計算機雖然功能十分強大。可以供你上網、打遊戲、管理公司人事關係等等,但是沒有程序,它就等於是一堆廢鐵,不會理會我們對它下達的“命令”。於是,我們要馴服它,只有通過一種方式——程序,這也是我們和計算機溝通的唯一方式。
程序也就是指令的集合,它告訴計算機如何執行特殊的任務。
寫出程序后,再由特殊的軟體將你的程序解釋或翻譯成計算機能夠識別的“計算機語言”,然後計算機就可以“聽得懂”你的話了,並會按照你的吩咐去做事了。因此,編程實際上也就是“人給計算機出規則”這麼一個過程。
隨計算機語言的種類非常的多,總的來說可以分成機器語言,彙編語言,高級語言三大類。
電腦每做的一次動作,一個步驟,都是按照已經用計算機語言編好的程序來執行,程序是計算機要執行的指令的集合,而程序全部都是用我們所掌握的語言來編寫的。所以人們要控制計算機一定要通過計算機語言向計算機發出命令。
計算機所能識別的語言只有機器語言,即由0和1構成的代碼。但通常人們編程時,不採用機器語言,因為它非常難於記憶和識別。
彙編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此彙編源程序一般比較冗長、複雜、容易出錯,而且使用彙編語言編程需要有更多的計算機專業知識,但彙編語言的優點也是顯而易見的,用彙編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經彙編生成的可執行文件不僅比較小,而且執行速度很快。
高級語言是目前絕大多數編程者的選擇。和彙編語言相比,它不但將許多相關的機器指令合成為單條指令並且去掉了與具體操作有關但與完成工作無關的細節,例如使用堆棧、寄存器等,這樣就大大簡化了程序中的指令。由於省略了很多細節,所以編程者也不需要具備太多的專業知識。
從二十世紀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,學習編程語言不能想象著一步登天,一步一個腳印的學習才是最佳方法。
C語言是國際上廣泛流行的、很有發展前途的計算機高級語言。它適合作為系統描述語言,既可用來編寫系統軟體,也可用來編寫應用軟體。
早期的操作系統等系統軟體主要是用彙編語言編寫的(包括 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 版
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的語法,並且多了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++的開局很不錯,現在仍很好;而她的未來,將由我們來決定……