|
總體上說(shuō),是c++ builder勝于VC++,DELPHI是最好,看看下面就知道了.
delphi vs vc++ (轉(zhuǎn)載) 哎,大家看著篇貼子吧! 偶然來(lái)找一個(gè)文件,卻發(fā)現(xiàn)這里關(guān)于vc++和delphi的討論很是激烈??戳舜蠹覍?xiě)的一些文章,覺(jué)得有些看法正確,有些就很偏頗甚至錯(cuò)誤(也許無(wú)知?很抱歉我這樣說(shuō):-)。我無(wú)意與任何人爭(zhēng),更愿意把這看成是技術(shù)上的討論。應(yīng)該本著公正,不帶偏見(jiàn)的態(tài)度(這并不意味著非要平分秋色,一切應(yīng)以事實(shí)為準(zhǔn))。我用過(guò)除tp1以外的所有版本的turbo pascal,所有版本的turbo c/borland c++,所有版本的delphi和c++ builder;以及msc 5.0/6.0,msc/c++ 7.0和visual c++.2/5.0。不敢說(shuō)有多高的水平,至少也算有一點(diǎn)經(jīng)驗(yàn)吧。下面就談一下我的看法。 1. 編譯器 應(yīng)該說(shuō)borland的編譯器是最好的。因?yàn)閎orland有全世界最好的編譯器開(kāi)發(fā)組(雖然anders hejlsberg離開(kāi)了)。從技術(shù)上來(lái)講,borland領(lǐng)先任何競(jìng)爭(zhēng)對(duì)手至少2~3年。 一 。 一般來(lái)說(shuō),borland的編譯器總是能生成更小的代碼并且通常(并不是在任何情況下)更快的代碼。紫云英、曾登高在文章中說(shuō)vc++編譯的程序小,這其實(shí)是使用了動(dòng)態(tài)連接的結(jié)果。m$把vc++的運(yùn)行庫(kù)(msvcrt*.dll, msvcp*.dll, mfc*.dll, 你看看這些文件加在一起有多大)在安裝windows時(shí)就放在了system/system32目錄中了。兩位說(shuō)“協(xié)商接口”的問(wèn)題,恐怕是對(duì)某些英文文章的理解錯(cuò)誤。m$就是不愿意在windows中帶上其他公司的運(yùn)行文件,沒(méi)有技術(shù)上的原因。其實(shí)delphi/c++ builder不論在動(dòng)態(tài)連接或靜態(tài)連接的情況下,生成的程序都要比vc++的小。比如mdi的例子程序:在delphi/c++ builder中選new ... | projects |mdi application,在vc++中用mdi app wizard;生成的程序功能是非常類似的。 下面是比較結(jié)果: (delphi打開(kāi)優(yōu)化,c++ builder使用最大速度優(yōu)化,vc++ 5使用最小代碼優(yōu)化) delphi 3 delphi 5 c++ builder 5 vc++ 5 dynamic link 21k 35k 44k 70k static link 253k 398k 467k 490k 凡是使用了應(yīng)用類庫(kù)的程序(不管是mfc,owl,vcl以及新的clx框架)都要比不使用的大不少。這是因?yàn)槟壳暗闹悄苓B接(smart link)技術(shù)還只能針對(duì)全局變量/過(guò)程,而不能用于對(duì)象結(jié)構(gòu)。哪怕你只使用了某個(gè)類(或被這個(gè)類間接引用)的一個(gè)屬性或方法,這個(gè)類以及它所引用的所有類都全部被連接到exe中。目前所有的編譯器都沒(méi)有解決這個(gè)問(wèn)題。 (ps: 其實(shí)能生成最小代碼(真編譯)的高級(jí)語(yǔ)言編譯器是turbo pascal,不信你寫(xiě)程序比較一下: program test; begin writeln('hello, world.'); end. end. 生成的exe不到1.5k。而同樣的c程序: #include main() { printf("hello, world."); } 最精悍的c/c++編譯器生成的代碼也有6k。 ) 那么幾個(gè)編譯器生成的代碼質(zhì)量又如何呢? 舉一個(gè)例子,比如我們?cè)诰幊虝r(shí)經(jīng)常用到的for循環(huán)語(yǔ)句: (1) object pascal: procedure foo; var i, j: integer; begin for i := 0 to 15 do j := j + i; end; (2) c++ void foo(void) { int i, j; int i, j; for (i = 0; i < 16; i++) j = j + i; } delphi 3生成的代碼(打開(kāi)優(yōu)化): 字節(jié)數(shù) 時(shí)鐘周期 00424aa9 33c0 xor eax,eax 1 00424aab 40 inc eax 1 00424aac 83f810 cmp eax,0x10 1 00424aaf 75fa jnz -0x06 0 (可并行) ----------------- 8 3 c++ builder 5生成的代碼(最大速度優(yōu)化): 00401535 33c0 xor eax,eax 1 00401537 40 inc eax 1 00401538 83f810 cmp eax,0x10 1 0040153b 7cfa jl -0x06 0 (可并行) ----------------- 8 3 visual c++ 5生成的代碼(最大速度優(yōu)化): 27: for (i = 0; i < 16; i ++) 00401205 mov ecx,dowrd ptr [j] 1 00401208 xor eax,eax 0 (可并行) 28: { 29: j = j + i; 0040120a add ecx,eax 1 0040120c inc eax 1 0040120d cmp eax,10h 1 00401210 jl foo(0x0040120a)+0ah 0 (可并行) 00401212 mov dword ptr [j],ecx 0/1 (取決于上一條指令的 分支預(yù)測(cè)情況) 30: }; ----------------- 16 4.2 (假定分支預(yù)測(cè)準(zhǔn)確度 80%) vc++ 5的最小代碼優(yōu)化生成也有11個(gè)字節(jié): 27: for (i = 0; i < 16; i ++) 00401205 xor eax,eax 1 28: { 29: j = j + i; 00401207 add dword ptr [j],eax 1 0040120a inc eax 1 0040120b cmp eax,10h 1 0040121e jl foo(0x00401207)+7 0 (可并行) 30: }; ----------------- 11 4 注: (1) delphi/c++ builder的結(jié)果是用turbo debugger直接反匯編的,vc++ 5的結(jié)果是從集成環(huán)境的源級(jí)調(diào)試得到的。 (2) 時(shí)鐘周期數(shù)以pentium處理器為例,實(shí)際上,對(duì)于沒(méi)有并行執(zhí)行單元的cpu(比如386/486和nx586等)vc++ 5生成的代碼速度還要更慢一些。 (3) 分支預(yù)測(cè)準(zhǔn)確度源自intel的"pentium optimization reference"。不過(guò)與具體程序密切相關(guān),一般來(lái)說(shuō)程序中的條件轉(zhuǎn)移指令越密集則分支預(yù)測(cè)準(zhǔn)確度越低。 可以看出,delphi/c++ builder的這段程序有1~1.2個(gè)時(shí)鐘周期的優(yōu)勢(shì)。這主要是因?yàn)閐elphi/c++ builder的編譯器比較智能,根本不編譯無(wú)用的廢語(yǔ)句。 (有趣的是,對(duì)于這段程序而言,vc++ 5的最大速度優(yōu)化反而不如最小代碼優(yōu)化生成的代碼運(yùn)行速度快。)不要以為1~1.2個(gè)時(shí)鐘周期不算什么,整個(gè)程序的快與慢就是這樣一個(gè)個(gè)時(shí)鐘周期積累出來(lái)的。而且就這幾條指令而言相當(dāng)于快25%~28.6%,是非??捎^的數(shù)字。我沒(méi)有用vc++ 6測(cè)試(我從vc++ 5以后不再使用vc了,因?yàn)閏++ builder 5能完全兼容vc --- 這種兼容性從c++builder 3開(kāi)始就有了,不過(guò)一開(kāi)始并不完善),不知道是否有改進(jìn)。有人有興趣的話請(qǐng)測(cè)試一下。有興趣的話,可以去jake's code efficiency challengehttp://www./~johnjac)看一看。那有代碼運(yùn)行性能挑戰(zhàn)。目前delphi/c++ builder在6項(xiàng)測(cè)試中保持5項(xiàng)領(lǐng)先。 (ps:delphi 2就曾在1996年的pc week的性能測(cè)試中擊敗過(guò)vc++ 4.2) 2. 語(yǔ)言特性 首先我不想評(píng)價(jià)所謂“pascal是玩具語(yǔ)言”這種無(wú)知的說(shuō)法。某些連basic都用不好的人是不可能正確評(píng)價(jià)其它語(yǔ)言的優(yōu)劣的。至于“只配高中生使用”就更加可笑了: peter norton沒(méi)上過(guò)大學(xué),id software的john carmack沒(méi)上過(guò)大學(xué),你不服氣?! 請(qǐng)不要嘲笑高中生,大多數(shù)程序員可能永遠(yuǎn)也達(dá)不到這些“高中生”的水平。創(chuàng)造性工作需要的是天才,你認(rèn)為天才相當(dāng)于什么學(xué)位?:-) (1) 預(yù)處理,宏以及.h文件 object pascal不支持預(yù)處理,其實(shí)是不需要。無(wú)法直接編譯源代碼的編譯器才需要預(yù)處理器的支持(用于翻譯/規(guī)范源程序(也包括.h之類)以利于編譯)。預(yù)處理器的出現(xiàn)是因?yàn)楫?dāng)初kenthompson和dennis ritchie要在只有256k內(nèi)存的pdp-11上實(shí)現(xiàn)c編譯器難度很大,才采取的折衷辦法。現(xiàn)代大多數(shù)c/c++產(chǎn)品已經(jīng)把預(yù)處理器包含在編譯器中了。 (ps:c中采用盡可能短的關(guān)鍵字/運(yùn)算符也是由于這個(gè)歷史原因) 至于macro和.h則應(yīng)該說(shuō)是垃圾特性,只是由于兼容性的考慮才保留下來(lái)的。ansi/iso c/c++規(guī)范中明確建議:“不要使用macro和.h,應(yīng)該使用程序中的常量定義和函數(shù)替代”。因?yàn)閙acro和.h不是c/c++的語(yǔ)言特性(這是真的!),沒(méi)有明確統(tǒng)一的語(yǔ)法定義。還會(huì)導(dǎo)致編譯速度降低,另外由于macro在每個(gè)使用的地方被展開(kāi)(不是調(diào)用),大量使用macro會(huì)使生成的代碼臃腫。 (2) 集合,子界類型 c++不支持這些object pascal的原生類型(編譯器能直接識(shí)別的)。但可以用類來(lái)模擬,畢竟c++的對(duì)象結(jié)構(gòu)是最復(fù)雜靈活的(ada除外)。不過(guò)性能有損失。 (3) 枚舉類型 object pascal不支持為每個(gè)枚舉元素指定值。 例如c/c++中可以定義:enum aweek {sun = 1, mon, tue ...}; object pascal中只能定義:aweek = (sun, mon, tue ...); (4) 數(shù)組 c/c++不支持object pascal中指定下標(biāo)的數(shù)組,下標(biāo)只能從0開(kāi)始。 (5) 結(jié)構(gòu) object pascal不支持struct(在pascal中稱為record)中的位域(bitfield)。bitfield可以bit為單位(不需要整字節(jié))來(lái)存儲(chǔ)結(jié)構(gòu)成員,可以減小結(jié)構(gòu)的存儲(chǔ)空間。不過(guò)存取效率會(huì)有所降低。 (6) 字符串 (6) 字符串 字符串處理是object pascal的強(qiáng)項(xiàng)之一。能夠支持靈活高效的串處理。嚴(yán)格意義上講,c/c++不能算支持原生的字符串類型。char *和char[]更近似于用戶自定義類型,因?yàn)榫幾g器不支持字符串的內(nèi)存自動(dòng)分配和回收,需要用戶自己調(diào)用malloc()和free()。object pascal也支持c/c++風(fēng)格的字符串(稱為pchar)。不過(guò)string類型更加強(qiáng)大。從實(shí)現(xiàn)上來(lái)看,object pascal的string類型使用前綴表示串長(zhǎng)度(1字節(jié)前綴的shortstring和4字節(jié)前綴的long string,兩種string自動(dòng)兼容,并且long string也兼容pchar),c/c++中的char *和char[]使用后綴chr(0)表示串結(jié)束。不同的表示方法對(duì)串處理性能有很大的影響:對(duì)于大量,復(fù)雜的字符串操作,用object pascal可以寫(xiě)出比c/c++快幾十倍的程序(許多用pascal寫(xiě)的pascal編譯器,比如free pascal,pascal pro等,雖然技術(shù)水平一般,但編譯速度也很快,在某種程度上也得益于pascal 的字符串處理效率)。比如取串長(zhǎng)度函數(shù)length/strlen(),object pascal的實(shí)現(xiàn)只需 要一條mov指令,而c/c++的實(shí)現(xiàn)則需要進(jìn)行重復(fù)串掃描直到找到結(jié)尾0為止。object pascal的string類型在支持unicode字符方面也有優(yōu)勢(shì)。要知道c/c++的字符串給現(xiàn)代操作系統(tǒng)支持unicode字符帶來(lái)了很大的困擾,比如串'abc'的unicode表示為: 41 00 42 00 43 00,這使c/c++程序根本無(wú)法處理這種字符串。雖然修改編譯器可以很容易解決這個(gè)問(wèn)題,但光修改編譯器是不夠的,還要修改操作系統(tǒng),否則以前的大量c/c++程序根本無(wú)法在新操作系統(tǒng)上使用(這簡(jiǎn)直是災(zāi)難 --- 你連notepad都沒(méi)了,怎么辦?:-)。windows采用凡是涉及字符串處理的api都提供兩套的解決方案。比如textout,有用于處理ascii字符的textouta和用于處理unicode字符的textoutw。而unix/linux采用另一種辦法:凡是涉及字符串處理的api都使用utf8壓縮編碼(一種類似于rtf的編碼方法:凡是ascii字符都直接存儲(chǔ),多字節(jié)字符則用\u36827進(jìn)行轉(zhuǎn)義),雖然(勉強(qiáng))保證了兼容性卻也代價(jià)不小。 (ps:c++中的string/ansistring是用類模擬的,所以性能...) (7) 多重繼承 (7) 多重繼承 毫無(wú)疑問(wèn),object pascal不支持多重繼承;并且也看不出borland有增加這一特性的意向(其實(shí)增加是輕而易舉的)。object pascal通過(guò)接口(interface)實(shí)現(xiàn)多重繼承。interface不僅可以引入用object pascal實(shí)現(xiàn)的對(duì)象,也可以引入其他語(yǔ)言實(shí)現(xiàn)的com/dcom/corba對(duì)象。你真的需要多重繼承嗎?我想大多數(shù)程序員和我一樣都從來(lái)沒(méi)有使用過(guò)多重繼承(連vcl這么強(qiáng)大靈活的體系結(jié)構(gòu)都根本沒(méi)有用到多重繼承)。 (ps:java和delphi一樣不支持多重繼承,也使用interface來(lái)實(shí)現(xiàn)多重繼承。其實(shí)這并不奇怪:jdk 1.2和java 2主要是由borland開(kāi)發(fā)的,sun只掛名而已。不信你看java類庫(kù)是不是和vcl很象。:-) (8) 對(duì)象模板 object pascal不支持對(duì)象模板。因?yàn)閷?duì)象模板不過(guò)是宏的語(yǔ)言實(shí)現(xiàn)而已(宏本身不是c/c++的語(yǔ)言特性)。 (9) 重載 object pascal支持函數(shù)/過(guò)程的重載,不支持運(yùn)算符重載。c++全部支持。 (ps:我個(gè)人傾向于object pascal應(yīng)該增加對(duì)運(yùn)算符重載的支持) (10) 位及邏輯操作 object pascal和c/c++在這方面沒(méi)什么差別。c/c++的&,|,~,^,>>,<<,&&,||,!等效于object pascal的and,or,not,xor,shr,shl(and,or,not,xor既用于位操作也用于邏輯操作)。不過(guò)c/c++不支持邏輯xor(a xor b = a and not b or not a and b,還是可以實(shí)現(xiàn)的)。 (11) 風(fēng)格 其實(shí)這是我更傾向于使用delphi的一個(gè)重要原因(由于工作的原因,我也經(jīng)常使用c++和匯編)。就象有些文章所說(shuō)的:“object pascal和c++是同一重量級(jí)的語(yǔ)言”,確實(shí)難分軒輊,差別反而主要是在風(fēng)格上。c++強(qiáng)調(diào)靈活,而object pascal更注重整潔和優(yōu)美?!冻绦蛟O(shè)計(jì)語(yǔ)言:設(shè)計(jì)與實(shí)現(xiàn)》一書(shū)的作者也稱贊pascal是“一種極優(yōu)美的語(yǔ)言”。有人因此認(rèn)為pascal“笨拙”。其實(shí)應(yīng)該是“大道至簡(jiǎn)”。我認(rèn)為即使用c++寫(xiě)程序也還是工工整整的好,不要賣弄技巧。只有水平不高不低的程序員才喜歡賣弄技巧(水平太低的賣弄不了,太高的又不愿賣弄了)。就象有人評(píng)李昌鎬的棋“平淡”,但馬曉春再怎么“鬼才”也只能甘拜下風(fēng)。 上面說(shuō)的其實(shí)都是c++ vs object pascal。不過(guò)也適用于vc++ vs delphi。(ps:vc++其實(shí)并未實(shí)現(xiàn)全部ansi/iso c++ 95規(guī)范(目前的最新標(biāo)準(zhǔn))的特性(所以有人戲稱之為c+)。而c++ builder則完全兼容ansi/iso c++ 95規(guī)范,并支持at&t(c的誕生地)和unix v的全部c++擴(kuò)展特性。有人稱“m$堅(jiān)持工業(yè)標(biāo)準(zhǔn),borland隨意修改” ,這是不對(duì)的。delphi也全兼容ansi/iso pascal 1983/92規(guī)范,以及apple object pascal (用過(guò)code warrior professional的應(yīng)該知道apple的object pascal)。) 3. 功能及其他 (1) 易用性 毫無(wú)疑問(wèn)delphi有巨大優(yōu)勢(shì),這不用多說(shuō)了吧。 (ps:delphi的真正偉大之處在于并不因?yàn)橐子枚档图夹g(shù)水準(zhǔn)。你需要復(fù)雜性就有復(fù)有復(fù)雜性,你需要靈活性就有靈活性;不用可視化也一樣寫(xiě)程序(可視化只是object pascal 對(duì)象結(jié)構(gòu)的另一面),不用vcl也一樣寫(xiě)程序) (2) 適用范圍 vc++幾乎能做任何硬件允許的工作。delphi也能。 (“不!?。?#8221;,我知道你會(huì)這樣說(shuō),你會(huì)舉出vxd。:-) delphi不能寫(xiě)vxd(其實(shí)如果你用delphi生成obj,再用m$的link連接,是可以的) 是有原因的(你見(jiàn)過(guò)非m$的工具能生成vxd的嗎?watcom?symantec?gnu?...),但不是技術(shù)上的原因。vxd的le(linear executable)文件格式最早出現(xiàn)在windows 3.0中,格式很簡(jiǎn)單(比ne和pe格式都要簡(jiǎn)單),基本上是內(nèi)存映象文件。但m$不知道出于什么動(dòng)機(jī)就是不允許其他公司的軟件生成它的這種(專利)格式。delphi是可以寫(xiě)windows nt的sys和新的wdm(windows driver model)驅(qū)動(dòng)程序的,這些使用普通的dll格式。(ps:從法律角度講,你自己寫(xiě)一個(gè)程序,未經(jīng)m$允許生成ms word文件也是不行的) (ps:玩過(guò)“奇跡時(shí)代”(age of wondershttp://www.)嗎?是用delphi 3寫(xiě)的。畫(huà)面和速度都優(yōu)于m$的“帝國(guó)時(shí)代”。不過(guò)我不喜歡玩策略類游戲,我喜歡的是duke3d和quake系列,還有tomb raider系列。:-) (3) 集成開(kāi)發(fā)環(huán)境 delphi的ide更簡(jiǎn)潔/好用一些。 (4) 數(shù)據(jù)庫(kù)支持 在這方面除了delphi的兄弟c++ builder/jbuilder恐怕只有power builder能(勉強(qiáng))與delphi相比。不過(guò)pb的性能和使用范圍就差得太遠(yuǎn)了(要不怎么叫poor builder呢?:-)。 (ps:我的印象是現(xiàn)在大多數(shù)基于網(wǎng)絡(luò)/大型數(shù)據(jù)庫(kù)的c/s和多層結(jié)構(gòu)的應(yīng)用都是用delphi/jbuilder開(kāi)發(fā)的) (5) 網(wǎng)絡(luò)功能 delphi也有一定的優(yōu)勢(shì)。尤其是在internet開(kāi)發(fā)方面。 (6) 組件支持 delphi除了基于object pascal的vcl/clx外,也支持基于com/dcom的組件(比如activex),另加corba支持。vc++只支持支持基于com/dcom的組件。 (7) 應(yīng)用框架/設(shè)計(jì)思想 vcl比mfc至少領(lǐng)先一代,這也毋須多言。mfc充其量不過(guò)是對(duì)owl的(一種不太成功的)模仿而已,從設(shè)計(jì)思想上看甚至還不如owl。作為一種語(yǔ)言的基本類庫(kù)(不論可視與否), 應(yīng)該從大處著眼,力求簡(jiǎn)潔有效,保持一定的彈性和抽象度(抽象意味著從功能出發(fā),比如vcl中的tcanvas就是對(duì)windows中dc(device context)的一種極好的抽象,比起mfc中的設(shè)計(jì)高明了何止一點(diǎn)半點(diǎn))。而不是面面俱到,一一照搬apis(不幸的是,m$的程序員多年以來(lái)一直在不辭勞苦地做這項(xiàng)工作)。看看mfc的某些類,簡(jiǎn)直慘不忍睹:通常除了省了hwnd和dc之類的參數(shù)(已經(jīng)作為類的私有數(shù)據(jù)保存了),其方法(method)簡(jiǎn)直就是windows api的翻版。這樣做有什么意義呢?windows api不就擺在那里嗎?比如說(shuō),使用mfc中的線程類還不如直接調(diào)用createthread/exitthread/resumethread/setthreadpriority之類的api更方便快速呢。 (ps:用過(guò)delphixhttp://www.yks./~hori/)嗎?directx這么繁雜的結(jié)構(gòu)可以用object pascal封裝得如此之好再次證明了vcl體系結(jié)構(gòu)的強(qiáng)大) (8) 調(diào)試 兩者相差無(wú)幾。vc++的源級(jí)調(diào)試更用戶友好一些,而delphi/c++ builder對(duì)多線程程序的調(diào)試支持更好。 (ps:要比單獨(dú)的調(diào)試工具,borland的turbo debugger可就要比m$的codeview強(qiáng) 多了) (9) 運(yùn)行環(huán)境/系統(tǒng)需求 應(yīng)該說(shuō)差不多。vc++的啟動(dòng)速度確實(shí)要快于delphi(這主要是相對(duì)于delphi 4+而言,delphi 3的啟動(dòng)還是很快的)。這很大程度上是由于一個(gè)事實(shí):vc++主要是一個(gè)基于文本編輯器的傳統(tǒng)開(kāi)發(fā)環(huán)境。code warrior professional不是啟動(dòng)更快嗎? 至于“一個(gè)數(shù)據(jù)庫(kù)程序要帶上3~5mb的bde運(yùn)行文件”的說(shuō)法,這可能是由于在安裝制作工具(installsheild,wise之類)中使用了“全部bde安裝”(默認(rèn))而不是“部分bde安裝”。如果你只使用access,dbase,foxpro,paradox之類的桌面數(shù)據(jù)庫(kù),只需要幾百k的運(yùn)行文件就可以了。用m$的工具開(kāi)發(fā)的數(shù)據(jù)庫(kù)程序也要帶上一大堆odbc,dao,jet,ado,msde之類的運(yùn)行文件。在delphi 5中,如果使用adoexpress,interbase express 訪問(wèn)數(shù)據(jù)庫(kù)的話,可以不帶bde。 (ps:不管怎么說(shuō),borland在delphi/c++ builder的啟動(dòng)速度方面還是要努力改 進(jìn)!) (10) 產(chǎn)品質(zhì)量/穩(wěn)定性 有文章稱“vc++的質(zhì)量好,穩(wěn)定性高”。真的是這樣嗎?visual studio的service pack 不是都出到4了嗎?什么是service pack?主要不就是bug fix + patch嗎?!borland的工具也并不完美,delphi 3的vcl中確實(shí)存在“內(nèi)存漏洞”,會(huì)導(dǎo)致用d3開(kāi)發(fā)的程序有時(shí)(并不總是)退出后不能釋放分配的內(nèi)存。vc++的問(wèn)題也不少:ie是用vc++寫(xiě)的吧,上網(wǎng)時(shí)多啟動(dòng)幾個(gè),開(kāi)開(kāi)關(guān)關(guān),最后全關(guān)閉,看看你的系統(tǒng)資源剩下多少了?還經(jīng)常導(dǎo)致“general protection error”。ultra edit是用vc++寫(xiě)的吧,也有同樣的問(wèn)題。其題。其實(shí)說(shuō)到底,程序質(zhì)量好不好,運(yùn)行穩(wěn)定不穩(wěn)定,主要取決于開(kāi)發(fā)者的水平/責(zé)任心。比如說(shuō)tomb raider系列和quake系列游戲同是用c++開(kāi)發(fā)的,但畫(huà)面質(zhì)量和運(yùn)行速度顯然quake系列更勝一籌。象美國(guó)航空航天局(nasa),俄羅斯宇航局(rsa),美洲銀行(bank of america,資產(chǎn)超過(guò)5000億美元的大銀行),其他諸如american airlines,at&t, bmw,compaq,bbc television,british telecom等大型機(jī)構(gòu)/公司都在用delphi開(kāi)發(fā)復(fù)雜的,企業(yè)級(jí)(可笑的是,有人居然稱“用vc開(kāi)發(fā)企業(yè)級(jí)的桌面應(yīng)用”,殊不知企業(yè) 級(jí)應(yīng)用和桌面應(yīng)用是相對(duì)而言的)的應(yīng)用系統(tǒng)(http://community.(borland社團(tuán)站點(diǎn))上有關(guān)于用delphi和c++ builder開(kāi)發(fā)的產(chǎn)品介紹),如果有人還要說(shuō)“...穩(wěn)定和可靠是硬道理,只好忍痛割愛(ài)了”,那他恐怕只好自制開(kāi)發(fā)工具 (10) 產(chǎn)品質(zhì)量/穩(wěn)定性 有文章稱“vc++的質(zhì)量好,穩(wěn)定性高”。真的是這樣嗎?visual studio的service pack不是都出到4了嗎?什么是service pack?主要不就是bug fix + patch嗎?!borland的工具也并不完美,delphi 3的vcl中確實(shí)存在“內(nèi)存漏洞”,會(huì)導(dǎo)致用d3開(kāi)發(fā)的程序有時(shí)(并不總是)退出后不能釋放分配的內(nèi)存。vc++的問(wèn)題也不少:ie是用vc++寫(xiě)的吧,上網(wǎng)時(shí)多啟動(dòng)幾個(gè),開(kāi)開(kāi)關(guān)關(guān),最后全關(guān)閉,看看你的系統(tǒng)資源剩下多少了?還經(jīng)常導(dǎo)致“general protection error”。ultra edit是用vc++寫(xiě)的吧,也有同樣的問(wèn)題。其實(shí)說(shuō)到底,程序質(zhì)量好不好,運(yùn)行穩(wěn)定不穩(wěn)定,主要取決于開(kāi)發(fā)者的水平/責(zé)任心。比如說(shuō)tomb raider系列和quake系列游戲同是用vc++開(kāi)發(fā)的,但畫(huà)面質(zhì)量和運(yùn)行速度顯然quake系列更勝一籌。象美國(guó)航空航天局(nasa),俄羅斯宇航局(rsa),美洲銀行bank of america,資產(chǎn)超過(guò)5000億美元的大銀行),其他諸如american airlines,at&t, bmw,compaq,bbc television,british telecom等大型機(jī)構(gòu)/公司都在用delphi開(kāi)發(fā)復(fù)雜的,企業(yè)級(jí)(可笑的是,有人居然稱“用vc開(kāi)發(fā)企業(yè)級(jí)的桌面應(yīng)用”,殊不知企業(yè)級(jí)應(yīng)用和桌面應(yīng)用是相對(duì)而言的)的應(yīng)用系統(tǒng)(http://community. ;(borland社團(tuán)站點(diǎn))上有關(guān)于用delphi和c++ builder開(kāi)發(fā)的產(chǎn)品介紹),如果有人還要說(shuō)“...穩(wěn)定和可靠是硬道理,只好忍痛割愛(ài)了”,那他恐怕只好自制開(kāi)發(fā)工具(外帶操作系統(tǒng))了。:-) (ps:關(guān)于delphi與某些顯卡驅(qū)動(dòng)沖突的問(wèn)題,是由于某些顯卡(如s3 virge gx) 的老版本驅(qū)動(dòng)程序不能正確處理windows公用控制中的imagelist的繪制方法造成的,在這種情況下所有在imagelist中使用多個(gè)圖象的程序都會(huì)有問(wèn)題)(ps:至于“一看到很多優(yōu)秀的共享軟件冒出具有delphi特色的錯(cuò)誤異常就感到悲 哀”,建議此人先搞清楚你看到的“錯(cuò)誤異常”消息是這些軟件本身出錯(cuò)呢,還是運(yùn)行時(shí)的異常處理消息(比如“沒(méi)有找到指定文件”或“索引超出范圍”之類)再說(shuō)。delphi中有完善的異常處理,所以很多程序員不再寫(xiě)錯(cuò)誤處理,而放手讓編譯器去處理。我認(rèn)為這不是一個(gè)好習(xí)慣,至少?gòu)棾龅南?duì)話框可能與你的程序所用的語(yǔ)言/風(fēng)格不一致。 讓人 家誤會(huì)了不是?:-) (11) 幫助/文檔 vc++的幫助和文檔確實(shí)要比delphi/c++ builder的豐富一些。不過(guò)這不應(yīng)當(dāng)包括msdn,因?yàn)閙sdn是一套獨(dú)立的產(chǎn)品,并不是專門(mén)給vc++準(zhǔn)備的,況且其中包括了相當(dāng)多的windows技術(shù)資料。作為一名程序員,不管用什么開(kāi)發(fā)工具,可以(也應(yīng)當(dāng))有一套msdn。 windows數(shù)據(jù)結(jié)構(gòu)/apis是用c風(fēng)格描述的這一點(diǎn)可能對(duì)delphi程序員來(lái)說(shuō)略有不便,不過(guò)delphi中已經(jīng)包括了大多數(shù)轉(zhuǎn)換;另外,如果一個(gè)程序員連轉(zhuǎn)換.h文件這么簡(jiǎn)單的工作都做不了的話,他(她)可能也做不了什么象樣的開(kāi)發(fā)。internet上的一個(gè)志愿者組織(www.delphi-jedi.org/)在這方面也做了大量工作,在他們的站點(diǎn)上有幾乎全部有用的c/c++庫(kù).h的object pascal翻譯。 (ps:delphi/c++ builder程序員為什么不可以買(mǎi)一套msdn呢?畢竟我們還在用m$的操作系統(tǒng),總不至于連windows技術(shù)資料都不要了吧) (ps:從msdn看m$ msdn中的技術(shù)資料主要是以compiled html(.chm)格式存放的,但m$把全部.chm放在disc #1,而把索引文件(.chi)單獨(dú)放在disc #2。這樣一來(lái)就無(wú)法從光盤(pán)上直接看這些文件。要么安裝,要么手工把相應(yīng)的.chm和.chi拷貝到一起。我看不有什么技術(shù)上的理由(誰(shuí)知道請(qǐng)告訴我)不把一半.chm和.chi放在一張盤(pán),而另一半放在第二張盤(pán)。 這至少反映出m$內(nèi)部某些人的陰暗心理) (12) 國(guó)際化支持 vc++中已經(jīng)包括了十多種語(yǔ)言的rtl資源,delphi中需要自己做資源本地化。雖然franch,german之類的版本中也包括english資源。:-< (13) 應(yīng)用領(lǐng)域 vc++在windows設(shè)備驅(qū)動(dòng)開(kāi)發(fā)(畢竟是m$ windows)和某些桌面應(yīng)用(比如游戲)開(kāi)發(fā)中用得較多。delphi更多應(yīng)用在數(shù)據(jù)庫(kù)/多層結(jié)構(gòu),多媒體和internet開(kāi)發(fā)等方面。(ps:vc++在游戲開(kāi)發(fā)中用得較多我看主要是價(jià)格因素,游戲使用專用界面,通常不涉及數(shù)據(jù)庫(kù)和internet(即使internet play也不過(guò)是簡(jiǎn)單的tcp連接,并且directplay中已包括此項(xiàng)功能),昂貴的delphi和c++ builder顯示不出優(yōu)勢(shì)。只需要$79的vc++標(biāo)準(zhǔn)版,directx sdk(可免費(fèi)下栽),opengl文檔(也是免費(fèi)的),至多再加一套msdn即可。比如quake,全是手寫(xiě)的c代碼,連c++特性都很少用到。borland也認(rèn)識(shí)到了這一問(wèn)題,所以發(fā)布了免費(fèi)的c++編譯器) (14) 價(jià)格 m$的開(kāi)發(fā)工具確實(shí)便宜(相對(duì)而言),不過(guò)是否物有所值,只能看你干什么用了。 (ps:別指望你買(mǎi)的toyota能有ferrari的性能。:-) (15) 前景 有人認(rèn)為m$財(cái)大氣粗,borland難以對(duì)抗。我看不能這么簡(jiǎn)單下結(jié)論。m$有它自己的問(wèn)題:法律訴訟,人才流失,資源分散,四面出擊(m$現(xiàn)在連鼠標(biāo),鍵盤(pán),游戲桿,玩具都生產(chǎn))。而brland/inprise集中精力在開(kāi)發(fā)工具,中件產(chǎn)品(如midas,visibroker和application server)和企業(yè)應(yīng)用/管理環(huán)境(如appcenter和security service)上,應(yīng)該還是大有可為的。 況且borland和m$之間并非純粹的競(jìng)爭(zhēng)關(guān)系,borland開(kāi)發(fā)工具給m$ windows帶來(lái)的收益要遠(yuǎn)大于和m$開(kāi)發(fā)工具競(jìng)爭(zhēng)帶來(lái)的損失。畢竟對(duì)m$來(lái)說(shuō),開(kāi)發(fā)工具只占其收入的很少一部分,即使不搞開(kāi)發(fā)工具也只不過(guò)是個(gè)面子問(wèn)題,于m$無(wú)損。m$在它面臨壟斷/不正當(dāng)競(jìng)爭(zhēng)指控的時(shí)候,因?yàn)殚L(zhǎng)期侵犯知識(shí)產(chǎn)權(quán)而賠償給borland一億美元(稱為“授權(quán)費(fèi)”), 這多少也可以看作是一種和解的舉動(dòng)吧。 另一種經(jīng)常聽(tīng)到的論調(diào)是“m$的產(chǎn)品市場(chǎng)份額大,borland能撐得住嗎?”,這其實(shí)也有很多問(wèn)題。鑒于m$出于競(jìng)爭(zhēng)的目的,經(jīng)常虛報(bào)數(shù)字,影響市場(chǎng)(m$的律師在法庭上承認(rèn)m$曾夸大過(guò)其ie和office的市場(chǎng)占有率);m$自己宣傳的其開(kāi)發(fā)工具的市場(chǎng)占有率也很值得懷疑。m$還有重復(fù)計(jì)算的問(wèn)題,比如賣掉一套visual studio,在計(jì)算vb,vc,vj等的銷售量時(shí)都計(jì)算在內(nèi)。其實(shí)很多人/公司買(mǎi)visual studio只用其中的一兩種。其實(shí)borland產(chǎn)品的銷售量還是很大的,尤其是在歐洲,北美和澳大利亞,在亞洲...(是因?yàn)閐版太多了)。另外,每個(gè)公司都有自己的產(chǎn)品/市場(chǎng)定位,你能因?yàn)閠oyota,ford,volkswagen賣的多就說(shuō)ferrari,maclaren,benz不行了嗎? 4. 結(jié)論 delphi(其實(shí)應(yīng)該說(shuō)borland產(chǎn)品)在技術(shù)上有優(yōu)勢(shì),vc++(其實(shí)應(yīng)該說(shuō)m$產(chǎn)品)也占有相當(dāng)?shù)氖袌?chǎng)份額。 (ps:說(shuō)了半天等于沒(méi)說(shuō)。:-) (ps:m$的c#(讀c sharp)能取得突破嗎?我看不會(huì)。因?yàn)閙$產(chǎn)品通常達(dá)不到所宣傳的性能;而且一種不符合標(biāo)準(zhǔn)(c#不兼容任何一種語(yǔ)言標(biāo)準(zhǔn),雖然據(jù)稱更接近c(diǎn))的產(chǎn)品也很難取得成功。j++就是一例) 5. 附:我所知道的borland和m$的故事 (1) bill gates是如何拿到ibm訂單的 1979年,tim paterson寫(xiě)了最初的dos并以$1000的價(jià)格賣給了digital reserch。 當(dāng)時(shí)apple的apple i和apple ii銷勢(shì)很好,所以ibm在1980年也決定搞pc。bill gates知道后,認(rèn)為是個(gè)機(jī)會(huì),就以$5000從digital reserch買(mǎi)下了dos,并逼著手下人在一間沒(méi)有空調(diào)的小黑屋里日夜不停加以修改。m$當(dāng)時(shí)是個(gè)小公司,只有十幾個(gè)人,名叫micro-soft。所以盡管dos的開(kāi)價(jià)$20000加每拷貝$30授權(quán)費(fèi))比cp/m-86(指用于intel 8086/8088的版本,不是指年代)的開(kāi)價(jià)($100000加每拷貝$70授權(quán)費(fèi))便宜不少,ibm的人還是傾向于使用cp/m-86。據(jù)“比爾.蓋茨的秘密”(bill gates' secrets)一書(shū)的作者說(shuō),bill急得團(tuán)團(tuán)轉(zhuǎn),只好求助于他媽媽。bill的母親時(shí)任華盛頓大學(xué)校長(zhǎng),與當(dāng)時(shí)的ibm董事長(zhǎng)john opal是大學(xué)同學(xué)(據(jù)說(shuō)...)。bill這一招果然有效,沒(méi)多久就拿到了ibm的訂單,從此dos成了ibm pc上的首選操作系統(tǒng)。 (2) borland的名字和歷史 borland聽(tīng)起來(lái)不象一個(gè)公司的名字,倒象一個(gè)國(guó)家的名字。 1982年,philippe kahn帶著3000美元從巴黎到了美國(guó),除去機(jī)票錢(qián)已所剩無(wú)幾, 只好租人家的車庫(kù)小閣間住。kahn在硅谷干了一段時(shí)間,并以mit(market in time,恰好與恰好與麻省理工學(xué)院的縮寫(xiě)相同)為名開(kāi)了一家公司。1983年,kahn和anders hejlsberg(丹麥人,turbo pascal編譯器的主要作者)合作開(kāi)發(fā)了turbo pascal,并賒帳在《新聞周刊》上登了一份彩頁(yè)廣告。turbo pascal在pc開(kāi)發(fā)工具中是一個(gè)里程碑式的產(chǎn)品,它第一次把編譯時(shí)間由分縮短到秒,并且其$49的價(jià)格在當(dāng)時(shí)也是創(chuàng)紀(jì)錄的(當(dāng)時(shí)的一份編譯器動(dòng)輒數(shù)千美元,便宜的也要幾百美元,還不好用)。turbo pascal在不到兩年的時(shí)間里銷售了超過(guò)130萬(wàn)套(考慮到當(dāng)時(shí)的pc數(shù)量,這是一個(gè)非常驚人的數(shù)字),borland從此創(chuàng)立。 kahn在解釋為什么以borland命名時(shí)說(shuō)“我們要起一個(gè)與眾不同的名字,其他公司都是叫這個(gè)micro,那個(gè)soft什么的”。不過(guò)據(jù)認(rèn)為這個(gè)名稱與德國(guó)或北歐的某些地名有關(guān)(kahn的父親是德國(guó)人,而且borland的很多開(kāi)發(fā)人員是北歐人)。 (3) anders hejlsberg為什么去了m$ 1996年,anders hejlsberg離開(kāi)borland去了m$。在此之前,m$曾多次企圖挖走anders,但都沒(méi)有成功。據(jù)信anders去m$(主要)不是錢(qián)的問(wèn)題,雖然m$的開(kāi)價(jià)也相當(dāng)有吸引力: 130萬(wàn)美元年薪外加股票期權(quán)和分紅,總計(jì)超過(guò)300萬(wàn)美元。主要原因是anders和delphi開(kāi)發(fā)組的其他成員在修改編譯器的問(wèn)題上發(fā)生了爭(zhēng)執(zhí);還有,據(jù)borland內(nèi)部人講 ,anders認(rèn)為自己不再是“不可缺少的人”。 雖然anders hejlsberg去了m$,我仍然尊敬他是一個(gè)天才,turbo pascal的主要作者,delphi的奠基者。 (ps:anders從1999年初就不在j++組了,而去做com+的開(kāi)發(fā)。m$的人講的) (4) m$產(chǎn)品的秘密 <1> msc最初是從at&t買(mǎi)的授權(quán); <2> vb的1,2,3版實(shí)際上不是m$開(kāi)發(fā)的,而是cooper software開(kāi)發(fā)的。john cooper在m$時(shí)未受重用,離開(kāi)后m$倒要花錢(qián)請(qǐng)他開(kāi)發(fā)產(chǎn)品,真有點(diǎn)黑色幽默的味道; <3> ms sql server最初是買(mǎi)sybase的產(chǎn)品,6.5以前的ms sql server和sybase根本就 是一回事; <4> windows 95的主要技術(shù)負(fù)責(zé)人(名字我不記得了,不過(guò)在dejanews(www.deja.com) 上可能還能找到有關(guān)文章)是1990年從borland跳到m$的,不過(guò)他在1998年已經(jīng)離開(kāi)m$,開(kāi)了自己的; <5> windows nt的開(kāi)發(fā)組整個(gè)是從dec挖來(lái)的,是以前做dec vms的那些人。所以在win32平臺(tái)上有很多vms的痕跡,比如說(shuō)coff目標(biāo)文件格式。 (5) .net到底是什么,bill gates也不知道 請(qǐng)看對(duì)bill gates的采訪: 記者:現(xiàn)在,市場(chǎng)仍然對(duì).net感到困惑。... .net的實(shí)質(zhì)到底是什么? 蓋茨:.net是我們對(duì)下一代internet的設(shè)想。... 舉個(gè)簡(jiǎn)單的例子,.net不僅允許你查看自己喜愛(ài)的棒球隊(duì)的時(shí)間安排,并且還能夠?qū)@個(gè)時(shí)間安排進(jìn)一步加以利用。 (???究竟怎樣“進(jìn)一步加以利用”?為什么不說(shuō)?難道現(xiàn)在的軟件不能“進(jìn)一步加以利”?) 6. 注: 本文系完全由作者本人所寫(xiě),文中提到的所有技術(shù)數(shù)據(jù)均由本人驗(yàn)證或標(biāo)明出處,轉(zhuǎn)載時(shí)請(qǐng)保持完整。 best regards herman wolfenswicz |
|
|
來(lái)自: 步夢(mèng)九淵 > 《縱橫奇談》