![]() |
| |
| (這篇文章發(fā)表在IEEE計算機雜志1998年3月刊上) 摘要: 關(guān)鍵字: 1.簡(jiǎn)介 與系統程序設計語(yǔ)言相比,不同的腳本語(yǔ)言為不同的工作而設計,這導致了語(yǔ)言間的根本不同。系統程序設計語(yǔ)言起源于像內存字等最初期的計算機元素,它為建立數據結構和算法而創(chuàng )建。相反的,腳本語(yǔ)言為膠著(zhù)而設計:他們假設已經(jīng)存在一套強大的組件,而它主要是把組件連在一起。系統程序設計語(yǔ)言使用強類(lèi)型定義來(lái)幫助處理復雜事務(wù),而腳本語(yǔ)言使用無(wú)類(lèi)型定義來(lái)簡(jiǎn)化組件間的聯(lián)系,并提供快速應用開(kāi)發(fā). 腳本語(yǔ)言和系統程序設計語(yǔ)言互為補充,并且二十世紀六十年代以來(lái)的大多數主要的計算機平臺都同時(shí)提供這兩種類(lèi)型的語(yǔ)言。這些語(yǔ)言在組件框架中有著(zhù)典型的應用:組件由系統程序設計語(yǔ)言創(chuàng )建,并由腳本語(yǔ)言組合在一起。然而,速度更快的機器,更好的腳本語(yǔ)言,圖形用戶(hù)界面和組件構造重要性的不斷提高,因特網(wǎng)的發(fā)展等發(fā)展趨勢大大提高了腳本語(yǔ)言的應用。在今后的十年中,這種趨勢將繼續,而且越來(lái)越多的完全使用腳本語(yǔ)言和系統程序設計語(yǔ)言書(shū)寫(xiě)的應用程序將主要用來(lái)創(chuàng )建組件。 2.系統程序設計語(yǔ)言 二十世紀五十年代后期像Lisp,Fortran和Algol等高層語(yǔ)言開(kāi)始出現.這些語(yǔ)言里的狀態(tài)和機器指令不再完全一致,編譯程序把過(guò)程程序中的每個(gè)狀態(tài)翻譯成一系列二進(jìn)制指令.經(jīng)過(guò)一段時(shí)間,一系列系統程序設計語(yǔ)言包括PL/1,Pascal,C,C++和Java由Algol發(fā)展而來(lái).系統程序設計語(yǔ)言沒(méi)有匯編語(yǔ)言的效率高,但他們使應用程序更快的發(fā)展起來(lái),因此,系統程序設計語(yǔ)言在大型應用項目的發(fā)展中幾乎完全取代了匯編語(yǔ)言. 系統程序設計語(yǔ)言與匯編語(yǔ)言在兩個(gè)方面有所不同:它是高層語(yǔ)言并且是強類(lèi)型."高層"意味著(zhù)很多細節被自動(dòng)處理以便編程人員可以寫(xiě)更少的代碼而做同樣的工作.例如: ★編譯程序處理寄存器分配,所以編程人員不需要寫(xiě)代碼來(lái)在寄存器和內存間轉移數據 平均每行系統程序設計語(yǔ)言代碼翻譯成大約五條機器指令,與此相比,每行匯編語(yǔ)言代碼翻譯成一條機器指令(由5個(gè)不同的人寫(xiě)的8個(gè)c文件的非正式分析中,我發(fā)現這個(gè)比率為每行3到7條指令;Capers Jones從大量語(yǔ)言的研究中發(fā)現對于一個(gè)給定的工作,匯編語(yǔ)言需要的代碼長(cháng)度大約是系統程序設計語(yǔ)言代碼長(cháng)度的3-6倍)不管是什么語(yǔ)言,編程人員每年可以寫(xiě)大體上相同數量的代碼行,因此,系統程序設計語(yǔ)言允許用比匯編語(yǔ)言快得多的語(yǔ)言寫(xiě)應用程序. 匯編語(yǔ)言和系統程序設計語(yǔ)言的第二個(gè)不同是類(lèi)型設置.我使用"類(lèi)型"來(lái)說(shuō)明信息的意義在它被使用前就被特殊化.在強類(lèi)型語(yǔ)言中編程人員聲明如何使用每條信息,并避免此信息被用于其他方式.在弱類(lèi)型語(yǔ)言中信息應用是沒(méi)有優(yōu)先權限制:信息的意思完全由它的使用方法確定,而不是任何初始約定. 現代計算機基本上是無(wú)類(lèi)型的:內存中的任何字對任何類(lèi)型的值比如整型,浮點(diǎn)數,指針或結構體都是有效的.值的意思由它的使用方法確定:如果指向一個(gè)內存字,那么他就被認為是結構體;如果一個(gè)字涉及一個(gè)整型加結構體,那么他就被認為是整型,如此等等.相同的字在不同的時(shí)間可用于不同的方法. 與此相反,現在的系統程序設計語(yǔ)言是強類(lèi)型定義的.例如: ★系統程序設計語(yǔ)言中的每個(gè)變量都必須被聲明為整型或指針或字符串等特殊類(lèi)型,并且必須用于適合這種類(lèi)型變量的方法 確定類(lèi)型由幾個(gè)好處.第一,聲明變量如何使用使大型程序更易于管理并區分那些必須被分別對待的變量.第二,編譯器可以利用類(lèi)型信息來(lái)偵測某些類(lèi)型的錯誤,比如,試圖把一個(gè)浮點(diǎn)值作為一個(gè)指針.第三,定義類(lèi)型能使編譯器更好的執行特殊代碼.例如,如果編譯器知道一個(gè)變量總是對整型值有效,那么他就可以產(chǎn)生一個(gè)整型指令來(lái)操縱這個(gè)變量;如果編譯器不知道變量的類(lèi)型,那么他就必須產(chǎn)生額外的指令在運行時(shí)檢查變量類(lèi)型. 總之,系統程序設計語(yǔ)言被設計來(lái)處理與匯編語(yǔ)言相同的工作,即隨機地產(chǎn)生請求.系統程序設計語(yǔ)言比匯編語(yǔ)言層次更高,類(lèi)型更強.這就使請求產(chǎn)生更迅速并且處理更容易,除了在運行時(shí)有一點(diǎn)損失,圖示1是匯編語(yǔ)言和其他幾種系統程序設計語(yǔ)言的比較. ![]() 3.腳本語(yǔ)言 腳本語(yǔ)言,像Perl,Python,Rexx,Tcl,Visual Basic和Unix shells代表了與系統程序設計語(yǔ)言完全不同的編程.腳本語(yǔ)言假設已經(jīng)存在了一系列由其他語(yǔ)言寫(xiě)成的有用的組件.腳本語(yǔ)言不希望隨機地產(chǎn)生請求,他希望主要是把組件接在一起.例如,Tcl和Visual Basic可以被用于在屏幕上安排一系列用戶(hù)圖形控制,而Unix shells scripts被用于把過(guò)濾程序集合入管道.腳本語(yǔ)言常用于擴展組件特性,但他們很少用于復雜的算法和數據結構;這些東西常由組件提供.腳本語(yǔ)言有時(shí)涉及膠著(zhù)語(yǔ)言或系統整體語(yǔ)言. 為了簡(jiǎn)化連接組件的工作,腳本語(yǔ)言被設計為無(wú)類(lèi)型的:所有的東西無(wú)論是看起來(lái)還是使用起來(lái)都是完全一樣的,因此他們可以互換.例如,在Tcl或Visual Basic中一個(gè)變量可以一會(huì )兒處理字符串,一會(huì )兒又處理整型.代碼和數據也??苫Q,因此,可以用一個(gè)程序寫(xiě)另一個(gè)程序,然后高速執行,腳本語(yǔ)言一般是面向字符的,因為它為許多不同的事物提供了一致的描述. 無(wú)類(lèi)型語(yǔ)言使組件更容易連在一起.在使用時(shí)沒(méi)有優(yōu)先級限制,并且所有的組件及其值都用統一的方式描述.除此之外,任何組件和值都可以在任何情況下使用;為某一目的而設計的組件可以被用于設計者完全沒(méi)有預見(jiàn)過(guò)的完全不同的目的.例如,在Unix shells中,所有的過(guò)濾程序從輸入讀入字節流,并把字節組成的字符串寫(xiě)入輸出;任何兩個(gè)程序都可以通過(guò)把一個(gè)的輸出連到另一個(gè)的輸入而把兩者聯(lián)系起來(lái). 下面的shell命令把三個(gè)過(guò)濾堆在一起來(lái)計算選中區域中包含單詞"scripting" 的行數: select | grep scripting | wc select程序讀入當前顯示選中的文本并把它輸出;grep程序讀取輸入并把包含"scripting"的行輸出;wc程序對輸入的行數求和.其中的每個(gè) 程序都可以用于許多其他情況來(lái)做不同的工作. 系統程序設計語(yǔ)言的強類(lèi)型本質(zhì)上阻止重用.類(lèi)型鼓勵編程人員創(chuàng )建包含不相容接口的類(lèi)型("接口很好,接口越多越好").每個(gè)接口需要特別類(lèi)型的對象,而編譯器不允許接口使用任何其他類(lèi)型的對象,即使那樣有用.為了使用一個(gè)已經(jīng)存在的接口的新的對象,就必須寫(xiě)轉換代碼以便在對象的類(lèi)型和接口期望的類(lèi)型間進(jìn)行翻譯.這反過(guò)來(lái)又需要重編譯部分或全部分布式二進(jìn)制形式的應用程序,在普通情況下這是不可能的. 為了能看出無(wú)類(lèi)型語(yǔ)言的優(yōu)點(diǎn),考慮下面的Tcl命令: button .b -text Hello! -font {Times 16} -command {puts hello} 這個(gè)命令創(chuàng )建了一個(gè)新的按鈕來(lái)顯示16點(diǎn)Times字體,當用戶(hù)敲擊控制鍵時(shí)顯示一段小的信息.它把六種不同的類(lèi)型混合成一個(gè)單一的狀態(tài):一個(gè)命令名(button),一個(gè)按鈕控制(.b),所有權名字(-text, -font, 和-command),簡(jiǎn)單字符串(Hello! 和hello),包含鉛字名(Times)及字點(diǎn)大小(16)的字體名(Times 16)和Tcl腳本(puts hello).Tcl代表所有這些非正式字符串.在這個(gè)例子中可以在任何一個(gè)命令中為屬性賦值,而未賦值的屬性使用給定的缺省值.在這個(gè)例子中20個(gè)以上的屬性是不特別賦值的. 同樣的例子在Java中用兩種方法執行時(shí)需要7行代碼.使用C++和微軟基本類(lèi)(MFC)需要三個(gè)過(guò)程25行代碼,在微軟基本類(lèi)中僅僅設置字體就需要幾行代碼: CFont *fontPtr = new CFont(); 大部分代碼是由強類(lèi)型造成的.為了設置按鈕字體,必須運用SetFont方法,但這個(gè)方法必須通過(guò)指針傳給CFont對象,這反過(guò)來(lái)需要聲明和初始化一個(gè)新的對象.為了初始化CFont對象必須喚醒它的CreateFont 方法,但CreateFont有一個(gè)需要14個(gè)特殊化引數的固定接口.在Tcl中字體(Times鉛字,16點(diǎn))的基本特征不用聲明或轉換就可以立即使用.另外,Tcl允許在創(chuàng )建按鈕的命令中直接包含按鈕行為,而C++和Java中需要把它放在單獨聲明的方法中. (實(shí)際上可以用隱藏基本語(yǔ)言的復雜性的圖形開(kāi)發(fā)環(huán)境處理一個(gè)像這樣的不重要的例子:用戶(hù)在表中輸入合適的值,而開(kāi)發(fā)環(huán)境輸出代碼.然而,在更多復雜情況像按計劃產(chǎn)生合適值或接口的條件任務(wù)中開(kāi)發(fā)人員必須在基本語(yǔ)言下編寫(xiě)代碼) 腳本語(yǔ)言和系統程序設計語(yǔ)言的另一個(gè)重要不同是腳本語(yǔ)言是被解釋而系統程序設計語(yǔ)言是被編譯.被解釋的語(yǔ)言由于沒(méi)有編譯時(shí)間而提供快速的轉換.通過(guò)允許用戶(hù)運行時(shí)編寫(xiě)應用程序,解釋器使.應用程序更加靈活,例如,許多整體線(xiàn)路的綜合分析工具,包括Tcl解釋器;程序用戶(hù)編寫(xiě)Tcl 腳本來(lái)使他們的設計具體化并控制工具操作.通過(guò)快速設計代碼解釋器可以實(shí)現強大的功能.例如,一個(gè)基于Tcl的網(wǎng)頁(yè)瀏覽器可以通過(guò)把網(wǎng)頁(yè)中的HTML轉換為使用一些常規表達替代物的Tcl腳本,從而從語(yǔ)法上分析網(wǎng)頁(yè)然后執行腳本把頁(yè)面翻譯顯示在屏幕上. 腳本語(yǔ)言不如系統程序設計語(yǔ)言效率高,部分是因為他們使用解釋器而不是編譯器,而且因為他們基本組件的選擇標準是功能強大和易于使用而不是有效地對應基本硬件.例如,腳本語(yǔ)言經(jīng)常使用長(cháng)度可變的字符串,而同樣的情況下系統程序設計語(yǔ)言使用對應一個(gè)機器字的二進(jìn)制值;腳本語(yǔ)言經(jīng)常使用哈希表,而系統程序設計語(yǔ)言使用變址陣列. 幸運的是,腳本語(yǔ)言的性能不經(jīng)常是一個(gè)主要的問(wèn)題.腳本語(yǔ)言應用程序通常比系統程序設計語(yǔ)言的應用程序要小,并且腳本應用程序的執行受組件執行的支配,而這些組件是系統程序設計語(yǔ)言提供的典型工具. 腳本語(yǔ)言比系統程序設計語(yǔ)言更高級,平均一個(gè)指令可以做更多的工作.一個(gè)典型的腳本語(yǔ)言指令執行成百上千條機器指令,而一個(gè)典型的系統程序設計語(yǔ)言指令執行大約五條機器指令(參圖一).部分不同是因為腳本語(yǔ)言使用翻譯器,這不如系統程序設計語(yǔ)言中被編譯的代碼.但是主要的不同是因為腳本語(yǔ)言的初期操作有更強大的功能.例如,Perl中喚醒一個(gè)常規表達替代和喚醒一個(gè)整型加法一樣簡(jiǎn)單.在Tcl中,變量會(huì )有與它相聯(lián)系的圖標,因此,設置變量會(huì )導致側面影響.例如,一個(gè)圖標可能會(huì )被用于保持變量的值在屏幕上持續更新. ![]() 表1.表的每行描述了被執行了兩遍的應用程序,一遍使用系統程序設計語(yǔ)言,像C或Java,一遍使用腳本語(yǔ)言,像Tcl.代碼率列給出了兩個(gè)應用程序的代碼行率(>1意味著(zhù)系統編程語(yǔ)言需要更多的代碼),作用率列給出了開(kāi)發(fā)率.在大多數情況下兩個(gè)版本由不同的開(kāi)發(fā)者執行.表中的信息由comp.lang.tcl新聞組中對文章進(jìn)行答復的不同人提供。. 由于上面描述的特性,腳本語(yǔ)言允許基于膠著(zhù)的應用程序的快速發(fā)展.表1提供了有趣的支持.它描述了幾個(gè)在系統程序設計語(yǔ)言下執行后又在腳本語(yǔ)言中重新執行的應用程序,或反過(guò)來(lái)也是一樣的. 在每種情況下腳本版本都比系統編程版本需要更少的代碼和更短的開(kāi)發(fā)時(shí)間,不同點(diǎn)的變化從2到60.腳本語(yǔ)言第一次執行時(shí)好處不顯著(zhù),這使人聯(lián)想到任何在第一次執行經(jīng)驗上的重執行都會(huì )更好,而腳本和系統編程的真正不同相差5到10倍,而不是表中的極端點(diǎn).腳本的好處同樣依賴(lài)于應用程序.在表中的最后一個(gè)例子中,應用程序的圖形用戶(hù)界面部分是基于膠著(zhù)的,而模擬裝置部分卻不是;這可能解釋為什么腳本應用程序不如其他應用程序獲益多. 總之,腳本語(yǔ)言被設計成膠著(zhù)應用程序,他們提供比匯編或系統程序設計語(yǔ)言更高層的編程,比系統程序設計語(yǔ)言更弱的類(lèi)型,和解譯后的開(kāi)發(fā)環(huán)境.腳本語(yǔ)言犧牲執行速度來(lái)提高開(kāi)發(fā)速度. 4.不同的任務(wù),不同的工具 在決定是否使用腳本語(yǔ)言或系統程序設計語(yǔ)言處理一項特殊任務(wù)時(shí)考慮以下問(wèn)題: ★應用程序的主要工作是否是把已經(jīng)存在的組件聯(lián)系起來(lái) 如果這些問(wèn)題回答"是"就表明這個(gè)應用程序使用腳本語(yǔ)言會(huì )更好.另一方面,如果對下面的問(wèn)題回答"是"就表明系統程序設計語(yǔ)言更適合這個(gè)應用程序: ★應用程序是否執行復雜的算法或數據結構 在過(guò)去的30年中,大多數主要的計算機平臺同時(shí)提供系統編程和腳本語(yǔ)言。例如,第一個(gè)腳本語(yǔ)言雖然粗糙,卻是一個(gè)JCL(作業(yè)控制語(yǔ)言),它被用于在OS/360中把工作等級按順序排好。個(gè)別工作等級由PL1,Fortran或匯編語(yǔ)言書(shū)寫(xiě),那時(shí)是系統程序設計語(yǔ)言。在二十世紀八十年代時(shí)Unix機器上,c被用于系統編程而sh,csh等殼編程被用于腳本。在二十世紀九十年代的PC時(shí)代里,c和c++被用于系統編程e而Visual Basic用于腳本。在現在已基本成形的網(wǎng)絡(luò )時(shí)代中,Java被用于系統編程而像JavaScript , Perl和Tcl等語(yǔ)言被用于腳本。 腳本和系統編程是共生的,共同使用,他們能產(chǎn)生格外強大的編程環(huán)境:系統程序設計語(yǔ)言用于產(chǎn)生令人興奮的組件,然后用腳本語(yǔ)言把他們組裝起來(lái)。例如,Visual Basic的主要吸引力是系統編程者可以用c編寫(xiě)ActiveX組件,而不太老練的編程者可以在Visual Basic應用中使用這些組件。在Unix下編寫(xiě)用于喚醒用c編寫(xiě)的應用程序的殼腳本很容易。Tcl普及的一個(gè)原因是可以編寫(xiě)執行新命令的c代碼來(lái)擴展該語(yǔ)言的能力。 5.腳本呈上升趨勢 圖形用戶(hù)界面出現于二十世紀八十年代早期,并在二十世紀八十年代晚期得以普及。在許多編程項目中圖形用戶(hù)界面占了一半甚至更多的比重。圖形用戶(hù)界面基于膠著(zhù)應用:他的目標不是創(chuàng )建新的功能,而是把圖形控制集合和應用程序內部函數聯(lián)系起來(lái)。我不擔心任何快速發(fā)展的環(huán)境因為圖形用戶(hù)界面基于系統程序設計語(yǔ)言,不論是Windows環(huán)境,Macintosh Toolbox或Unix Mctif,圖形用戶(hù)界面基于c或c++等已被證明難以掌握,使用不靈活,生成結果不靈活的語(yǔ)言。一些這樣的系統有很好的圖形工具來(lái)設計屏幕輸出并隱藏基本語(yǔ)言,而一旦設計者不得不編寫(xiě)代碼時(shí)一切變得困難起來(lái),像為接口元素提供行為。所有好的快速開(kāi)發(fā)圖形用戶(hù)界面環(huán)境都基于腳本語(yǔ)言:Visual Basic,Hyperlard和Tcl/tk,隨著(zhù)圖形用戶(hù)界面的普及,腳本語(yǔ)言也越來(lái)越流行。 因特網(wǎng)的增長(cháng)也使腳本語(yǔ)言變得大眾化。因特網(wǎng)只是一種膠著(zhù)工具,它不創(chuàng )建任何新的計算結果或數據;它只是簡(jiǎn)單的把大量已經(jīng)存在的事物聯(lián)系起來(lái)。因特網(wǎng)編程工作的完美工作之一是讓所有連接的組件在一起工作,像腳本語(yǔ)言。例如:Perl 因編寫(xiě)CGI腳本而流行,JavaScript因編寫(xiě)網(wǎng)頁(yè)而流行。 基于腳本的第三個(gè)例子是組件框架,像ActiveX,OpenDoc和JavaBeans。雖然系統程序設計語(yǔ)言可以很好的創(chuàng )建組件,但腳本更適合組裝組件到應用程序中。沒(méi)有一個(gè)好的腳本語(yǔ)言來(lái)操縱組件,組件框架的大部分功能就都沒(méi)有了。這可以部分解釋為什么組件框架在個(gè)人電腦上(Visual Basic提供了方便的腳本工具)比在像Unix/CORBA等組件框架中不包含腳本的平臺上更成功. 腳本語(yǔ)言繼續普及的另一個(gè)原因是腳本技術(shù)的提高?,F代腳本語(yǔ)言像Tcl和Perl離早期腳本語(yǔ)言像JCL的公開(kāi)宣布已經(jīng)很遠。例如,JCL不提供基本反復而早期Unix外殼不提供過(guò)程,即使在今天,腳本技術(shù)仍然相對不成熟。例如,Visual Basic不是真正的腳本語(yǔ)言:它最初執行像一個(gè)簡(jiǎn)單的系統程序設計語(yǔ)言,然后修改使之更適合腳本。以后的腳本語(yǔ)言將比現在使用的更好。 腳本技術(shù)得益于計算機硬件的加速發(fā)展。過(guò)去常常用系統程序設計語(yǔ)言在復雜的應用程序中獲得可接受的執行。某些情況下甚至系統程序設計語(yǔ)言也不夠有效,因此不得不用匯編編寫(xiě)應用程序。然而,今天的機器比1980年的快100-500倍,并且仍在繼續以每18個(gè)月翻一番的速度增長(cháng)。今天,許多應用程序可以用解釋后的程序執行,并且仍然有出色的執行。例如,Tcl腳本可以操縱幾千個(gè)對象同時(shí)提供好的相互響應。由于計算機速度的不斷提高,腳本將對越來(lái)越大的應用程序產(chǎn)生吸引力。 腳本語(yǔ)言應用的不斷增長(cháng)最終導致編程群體的改變.二十年前大多數編程者是大型項目的熟練的編程人員.那個(gè)時(shí)代的編程人員需要花幾個(gè)月的時(shí)間掌握一門(mén)語(yǔ)言和它的編程環(huán)境,系統程序設計語(yǔ)言就是為這些人設計的.然而,自從個(gè)人電腦出現以后,越來(lái)越多的非專(zhuān)業(yè)編程者加入到編程者的行列.對這些人來(lái)說(shuō),編程不是他們的主要工作,而只是他們偶爾用來(lái)幫助他們工作的工具.偶然編程的例子是簡(jiǎn)單的數據庫查詢(xún)或者是巨大的擴展片.偶然編程者不希望花幾個(gè)月的時(shí)間學(xué)習系統程序設計語(yǔ)言但他們可以花幾個(gè)小時(shí)的時(shí)間學(xué)到足夠的腳本語(yǔ)言知識來(lái)寫(xiě)出有用的代碼.由于腳本語(yǔ)言由簡(jiǎn)單的句法并且省略了對象線(xiàn)程等復雜的特性,因而它比系統程序設計語(yǔ)言要容易學(xué).例如,比較Visual Basic和Visual C++,很少有偶爾編程者會(huì )選擇Visual C++,而大部分會(huì )用Visual Basic建立有用的應用程序. 即使在今天,用腳本語(yǔ)言編寫(xiě)的應用程序的數目也遠多于用系統程序設計語(yǔ)言編寫(xiě)的應用程序的數目.在Unix系統中有比C程序更多的外部腳本,而在Windows下Visual Basic的編程者和應用程序都比C或C++的要多.當然,多數大型和廣泛使用的應用程序都是用系統程序設計語(yǔ)言寫(xiě)成的,所以,如果比較代碼總行數或是建立的副本數,則系統程序設計語(yǔ)言略勝一籌.不管怎么樣,腳本語(yǔ)言已經(jīng)是應用程序開(kāi)發(fā)的主動(dòng)力,并且今后它的市場(chǎng)份額會(huì )繼續提高. 6.對象的作用 面向對象編程實(shí)際能提供多少好處?不幸的是,我還沒(méi)有看到足夠的數據可以確切地回答這個(gè)問(wèn)題.在我看來(lái),對象只能提供一定的好處:或許能提高20-30%的創(chuàng )作力,但決不會(huì )有兩倍,更不用說(shuō)是十倍.現在抱怨C++的和喜歡它的一樣多,并且一些語(yǔ)言專(zhuān)家開(kāi)始公開(kāi)反對面向對象編程.這一段剩下的部分用于解釋為什么對象不能像腳本一樣顯著(zhù)地提高創(chuàng )作力,并討論腳本語(yǔ)言中可以獲得的面向對象編程的好處. 面向對象編程不能顯著(zhù)提高創(chuàng )作力的原因是他沒(méi)有提高編程層次或鼓勵重用.像C++等面向對象語(yǔ)言中編程者仍然使用需要用大量細節來(lái)描述和操縱的基本的小單元工作.理論上可以開(kāi)發(fā)強大的函數庫包,并且如果這些函數庫被廣泛使用就將提高編程層次.然而,這樣的函數庫卻很少.大多數面向對象語(yǔ)言的強類(lèi)型使包的定義受限制從而難以重用.每個(gè)包都需要特殊類(lèi)型的對象,如果兩個(gè)包在一起工作,就必須寫(xiě)轉換代碼在兩個(gè)包需要的類(lèi)型間進(jìn)行翻譯.面向對象語(yǔ)言的另一個(gè)問(wèn)題是他們強調繼承.當一個(gè)類(lèi)借用為另一個(gè)類(lèi)寫(xiě)的代碼時(shí)執行繼承并不是一個(gè)好主意,它使軟件難以管理和重用.它把類(lèi)的執行綁在一起,因而沒(méi)有另外一個(gè)類(lèi)任何一個(gè)其它類(lèi)都不可理解:不知道其繼承的方法在父類(lèi)中如何執行,則無(wú)法理解子類(lèi);而不知道其方法如何被子類(lèi)繼承,則無(wú)法理解父類(lèi).在一個(gè)復雜的類(lèi)繼承中,不理解它所繼承的所有其他的類(lèi)就無(wú)法理解任何一個(gè)類(lèi).更糟的是,一個(gè)類(lèi)無(wú)法從它繼承的類(lèi)中被分離以用于重用.多重繼承使這個(gè)問(wèn)題變得更麻煩.執行繼承導致和goto語(yǔ)句被重復執行時(shí)所看到的一樣的交錯和不可靠.因此,面向對象系統經(jīng)常不能處理復雜問(wèn)題并缺少重用. 另一方面,腳本語(yǔ)言實(shí)際引起了有效的軟件重用.在有趣的組件由系統程序設計語(yǔ)言建立使他們使用了模塊,隨后用腳本語(yǔ)言把他們膠著(zhù)在應用程序中.這種勞動(dòng)的分割提供了為重用的自然的框架結構.組件被設計為可重用的組件和腳本間有定義好的接口以利于組件的使用.例如,在Tcl中組件是C中執行的常規命令.他們看起來(lái)更象是內在的命令,因而更容易在Tcl腳本中使用.在Visual Basic中組件是ActiveX的擴展,可用于從工具面板直接拖到窗體中. 幸運的是,對象的這些好處在腳本語(yǔ)言中可以像在系統程序設計語(yǔ)言中一樣實(shí)現,并且所有的腳本語(yǔ)言都提供面向對象編程.例如,Python是面向對象腳本語(yǔ)言,Python第五版包括提供對象,Object Rexx是Rexx的面向對象版本,而Incr Tcl是Tcl的面向對象版本.有一點(diǎn)不同是,腳本語(yǔ)言中的對象事物類(lèi)型的,而系統程序設計語(yǔ)言中的對象是強類(lèi)型的. 7.其他語(yǔ)言 8.結論 我希望這篇文章可以在三個(gè)方面影響編程群體; 9.答謝 10.參考資料(譯者注:略。請參看原文)
![]() ![]() | |
原文作者:John K. Ousterhout 譯文作者: @vicky@ | |
©Tcl/Tk中文網(wǎng) 2003-2008 |
聯(lián)系客服