1.2 Delphi 是什么 我們經(jīng)常會(huì)問(wèn)這樣的問(wèn)題:“到底什么使得D e l p h i 如此優(yōu)秀?”和“為什么和別的編程工具相比,我更愿意選擇D e l p h i ?”等等。這些年來(lái),我們對(duì)這類問(wèn)題已經(jīng)得出了兩種答案,一長(zhǎng)一短。短的就是:高效性。要?jiǎng)?chuàng)建Wi n d o w s 應(yīng)用程序,使用D e l p h i 是我們能夠找到的最為簡(jiǎn)捷的途徑。當(dāng)然,有些人(老板們和未來(lái)的客戶們)并不滿足于這個(gè)答案。因此,我們必須推出我們的詳細(xì)解答,它闡述了使得D e l p h i 如此高效的綜合因素。我們把決定一個(gè)軟件開發(fā)工具效率的因素歸結(jié)為以下五點(diǎn): • 可視化開發(fā)環(huán)境的性能。 • 編譯器的速度和已編譯代碼的效率。 • 編程語(yǔ)言的功能及其復(fù)雜性。 • 數(shù)據(jù)庫(kù)結(jié)構(gòu)的靈活性和可擴(kuò)展性。 • 框架對(duì)設(shè)計(jì)和使用模式的擴(kuò)充。 雖然還有許多其他因素應(yīng)該包括進(jìn)去,如配置、文檔、第三方的支持等,但我們已發(fā)現(xiàn)這是向人們解釋我們?yōu)槭裁催x擇D e l p h i 的最確切、最簡(jiǎn)單的方式。當(dāng)然,上述五點(diǎn)也可能包含了一些主觀因素,但關(guān)鍵在于:你使用一種特定工具進(jìn)行開發(fā)時(shí),到底能有多大的效率?如圖1 - 1 所示,對(duì)一種工具的各方面性能進(jìn)行評(píng)估量化( 1 到5 之間),并分別標(biāo)在圖1 - 1的各條軸線上,最后就能得到一個(gè)五邊形。五邊形的面積越大,則這種工具的效率越高。
毋需告訴你我們使用這種方法得到了什么答案―你自己一試便知!下面讓我們來(lái)仔細(xì)地看一下D e l p h i 在這幾方面的性能如何,并把它們和其他Wi n d o w s 開發(fā)工具做一比較。
1.2.1 可視化開發(fā)環(huán)境 可視化開發(fā)環(huán)境通常分為三個(gè)組成部分:編輯器、調(diào)試器和窗體設(shè)計(jì)器。和大多數(shù)現(xiàn)代R A D (快速應(yīng)用開發(fā))工具一樣,這三部分是協(xié)同工作的。當(dāng)你在窗體設(shè)計(jì)器中工作時(shí),D e l p h i 在后臺(tái)自動(dòng)為你正在窗體中操縱的控件生成代碼。你還可以自己在編輯器中加入代碼來(lái)定義應(yīng)用程序的行為,同時(shí)還可以在同一個(gè)編輯器中通過(guò)設(shè)置斷點(diǎn)和監(jiān)控點(diǎn)等來(lái)調(diào)試程序。
總的來(lái)說(shuō)D e l p h i 的編輯器和其他工具的編輯器類似,但它的C o d e I n s i g h t 技術(shù)卻省去了許多輸入工作的麻煩。這一技術(shù)是建立在編譯器信息之上的,而不是基于像Visual Basic 等使用的類型庫(kù),因此應(yīng)用范圍更廣泛。雖然D e l p h i 的編輯器也設(shè)置了許多不錯(cuò)的配置選項(xiàng),但我覺(jué)得Visual Studio 的編輯器配置余地更大。在版本5 里,D e l p h i 的調(diào)試器功能終于趕上了Visual Studio 的調(diào)試器,具備了許多先進(jìn)的功能,如遠(yuǎn)程調(diào)試、過(guò)程關(guān)聯(lián)、D L L 和包調(diào)試、自動(dòng)本地監(jiān)控以及C P U 窗口等。D e l p h i 還支持在調(diào)試時(shí)隨意放置和停靠窗口并把這一狀態(tài)保存為命令的桌面設(shè)置。由此,D e l p h i 的I D E 實(shí)現(xiàn)了對(duì)調(diào)試功能的良好支持。
正如經(jīng)常在一些集成環(huán)境(如V B 和某些J a v a 工具)中見(jiàn)到的那樣,一個(gè)性能非常完善的調(diào)試器的長(zhǎng)處就在于:應(yīng)用程序被調(diào)試時(shí)能修改它的代碼,從而改變它的行為。遺憾的是,由于這種功能在編譯成本地代碼時(shí)過(guò)于復(fù)雜而無(wú)法實(shí)現(xiàn),故不能為D e l p h i 所支持。 對(duì)R A D 工具(如D e l p h i 、Visual Basic 、C + + B u i l d e r 和P o w e r B i l d e r 等)來(lái)說(shuō),窗體設(shè)計(jì)器是一項(xiàng)獨(dú)特的功能。一些更為經(jīng)典的開發(fā)環(huán)境,如V C + +和B C + +,都提供了對(duì)話編輯器,但卻沒(méi)有將窗體設(shè)計(jì)器集成到開發(fā)流程中。由圖1 - 1 的效率圖可以看出,沒(méi)有窗體設(shè)計(jì)器將會(huì)降低開發(fā)工具的整體效率。幾年可視的來(lái),D e l p h i 和Visual Basic 在完善窗體設(shè)計(jì)器的功能方面展開了激烈的競(jìng)爭(zhēng)。它們的新版本功能一個(gè)比一個(gè)強(qiáng)。D e l p h i 的窗體設(shè)計(jì)器的與眾不同之處在于,D e l p h i 是建立在一個(gè)真正面向?qū)ο蟮目蚣芙Y(jié)構(gòu)基礎(chǔ)之上的。這樣,你對(duì)基類所做的改變都將會(huì)傳遞給所有的派生類。這里涉及的一項(xiàng)關(guān)鍵技術(shù)就是VFI(visual form inheritance),即可視化窗體繼承。V F I 技術(shù)使你能夠動(dòng)態(tài)地繼承當(dāng)前項(xiàng)目或?qū)ο髱?kù)中的任何其他窗體。一旦基窗體發(fā)生改變,派生的窗體會(huì)立即予以更新。在第4 章“應(yīng)用程序框架和設(shè)計(jì)”中有對(duì)這一重要功能的詳細(xì)解釋。
也許P a s c a l 編譯器最著名的特點(diǎn)就是速度快,而D e l p h i 正是建立在這種編譯器的基礎(chǔ)之上的。事實(shí)上,它可能是針對(duì)Wi n d o w s 的最快的高級(jí)語(yǔ)言本地代碼編譯器。以往速度很慢的C + +編譯器在近年來(lái)取得了很大的進(jìn)步,增加了鏈接和各種緩存策略,尤其是在Visual C++和C + + B u i l d e r 中。但即便如此,C + +的編譯器還是比D e l p h i 的慢了幾倍。
編譯速度一定能與運(yùn)行效率成正比嗎?當(dāng)然不是。D e l p h i 和C + + B u i l d e r 共享同一種編譯器后端,因此生成的代碼等效于由一個(gè)優(yōu)秀的C + +編譯器生成的代碼。根據(jù)最新的可靠評(píng)估標(biāo)準(zhǔn),Visual C++在許多場(chǎng)合都被認(rèn)為在編譯速度和生成代碼長(zhǎng)度方面是最有效的,這得益于一些極為有力的優(yōu)化措施。雖然對(duì)通常的應(yīng)用程序開發(fā)來(lái)說(shuō),這些細(xì)小的優(yōu)越性難以被注意到,但如果你正在編寫復(fù)雜的計(jì)算代碼,那么它們就會(huì)發(fā)揮作用。
Visual Basic 的編譯技術(shù)有點(diǎn)特別。在開發(fā)過(guò)程中,V B 以一種集成的方式運(yùn)作,而且反應(yīng)相當(dāng)敏銳。這種編譯器速度比較慢,生成的可執(zhí)行代碼的效率也遠(yuǎn)遠(yuǎn)不及D e l p h i 和C + +工具。
J a v a 是另一種有趣的語(yǔ)言。最新的基于J a v a 的工具語(yǔ)言J B u i l d e r 和Visual J++自稱其編譯速度能趕 得上D e l p h i ,但是生成代碼的執(zhí)行效率卻不盡人意,因?yàn)镴 a v a 是一種集成語(yǔ)言。雖然J a v e 在穩(wěn)步地前進(jìn),但在大多數(shù)場(chǎng)合,其運(yùn)行速度卻仍與D e l p h i 和C + +相距甚遠(yuǎn)。
C + +是另一種極為有力的語(yǔ)言。在它的潛在功能(如預(yù)處理器宏、模板、操作符加載等等)的幫助下,你幾乎可以使用C + +設(shè)計(jì)你自己的語(yǔ)言。只要合理地使用其豐富的功能選項(xiàng),就可以開發(fā)出簡(jiǎn)潔直觀、易于維護(hù)的代碼。然而,問(wèn)題是,許多的開發(fā)者總濫用這些功能,這就很容易導(dǎo)致發(fā)生重大錯(cuò)誤。事實(shí)上,寫出糟糕的C + +代碼反倒比寫出好的C + +代碼更容易。因?yàn)檫@種語(yǔ)言自己不會(huì)朝著好的設(shè)計(jì)方向前進(jìn)―這由開發(fā)者決定。
Object Pascal 和J a v a 給我們的感覺(jué)很相似,因?yàn)樗鼈兒芎玫匕盐兆×藦?fù)雜性和功能性的平衡。它們都采取了這樣一種途徑,即限制其可用功能以加強(qiáng)開發(fā)者的邏輯設(shè)計(jì)。例如,兩者都避免了完全面向?qū)ο蟮珔s容易被濫用的多重繼承的觀念,而是實(shí)現(xiàn)了一個(gè)執(zhí)行多重接口功能的類。兩者都不支持美觀卻危險(xiǎn)的操作符加載。兩者都有一些強(qiáng)大的功能,諸如異常處理、運(yùn)行期類型信息( RT T I )和生存期內(nèi)存自管理字符串。同時(shí),兩種語(yǔ)言都不是由專門的編委會(huì)寫出來(lái)的,而是來(lái)自于單個(gè)組織中對(duì)這種語(yǔ)言有著共同理解的的個(gè)人或小組。
Visual Basic 最初是為了使編程初學(xué)者入門更容易、進(jìn)步更快而設(shè)計(jì)的(名字也由此而來(lái))。但是作為一種語(yǔ)言,V B 也要不斷地取長(zhǎng)補(bǔ)短,這使得它近年來(lái)也變得越來(lái)越復(fù)雜了。為了對(duì)開發(fā)者隱藏這些細(xì)節(jié),V B 仍然保留了一些向?qū)б詣?chuàng)建復(fù)雜的項(xiàng)目。
1.2.4 數(shù)據(jù)庫(kù)結(jié)構(gòu)的靈活性和可擴(kuò)展性 由于B o r l a n d 缺少一種數(shù)據(jù)庫(kù)計(jì)劃,因此D e l p h i 保留了我們認(rèn)為是所有工具中最靈活的數(shù)據(jù)庫(kù)結(jié)構(gòu)。對(duì)大多數(shù)基于本地、客戶/服務(wù)器和O D B C 數(shù)據(jù)庫(kù)平臺(tái)的應(yīng)用程序來(lái)說(shuō),B D E 的功能都非常強(qiáng)大。如果你對(duì)此不滿意,可以避開使用B D E 以支持新的本地A D O 組件。如果你沒(méi)有裝A D O ,可以自己創(chuàng)建數(shù)據(jù)訪問(wèn)類或者購(gòu)買第三方數(shù)據(jù)訪問(wèn)解決方案。此外,M I D A S 使對(duì)數(shù)據(jù)源的多層訪問(wèn)更易于實(shí)現(xiàn)。M i c r o s o f t 的工具( O D B C 、OLE DB 或者其他)從邏輯上來(lái)說(shuō)趨向于支持M i c r o s o f t 自己的數(shù)據(jù)庫(kù)和數(shù)據(jù)訪問(wèn)解決方案。
1.2.5 框架對(duì)設(shè)計(jì)和使用模式的擴(kuò)充 這是一項(xiàng)經(jīng)常被其他軟件設(shè)計(jì)工具忽略了的重要功能。V C L 是D e l p h i 最重要的組成部分。在設(shè)計(jì)時(shí)操縱組件、創(chuàng)建組件、使用O O (面向?qū)ο?技術(shù)繼承其他組件的行為,這些能力都是決定D e l p h i 效率的關(guān)鍵因素。在許多場(chǎng)合,編寫V C L 組件都采用固定的O O 設(shè)計(jì)方法。相比之下,其他基于組件的框架經(jīng)常過(guò)于死板或過(guò)于復(fù)雜。比如A c t i v e X 控件具有和V C L 控件相同的設(shè)計(jì)期性能,但卻不能被繼承以創(chuàng)建一個(gè)具有其他不同行為的新類。傳統(tǒng)的類框架,如O W L 和M F C ,需要你有大量的內(nèi)部結(jié)構(gòu)知識(shí),而且如果沒(méi)有R A D 工具的設(shè)計(jì)期支持,其功能將會(huì)受到抑制。將來(lái)能夠與V C L 的功能相媲美的一個(gè)工具是Visual J++的W F C ( Windows Foundation Classes),即Wi n d o w s 基礎(chǔ)類。但是由于Sun Microsystems 對(duì)J a v a 問(wèn)題的訴訟仍懸而未決,Visual J++的前景還不明確。