国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
腳本語言:21世紀(jì)的高級編程語言



腳本語言:21世紀(jì)的高級編程語言
 

(這篇文章發(fā)表在IEEE計(jì)算機(jī)雜志1998年3月刊上)

摘要
    Perl和Tcl等腳本語言代表一種與c或JavaTM為代表的系統(tǒng)程序設(shè)計(jì)語言完全不同的編程形式。腳本語言為"膠著"應(yīng)用程序而設(shè)計(jì),它使用無類型方法來實(shí)現(xiàn)高級編程和比系統(tǒng)程序設(shè)計(jì)語言更快的發(fā)展應(yīng)用。計(jì)算機(jī)速度的增長和混合應(yīng)用的改變使腳本語言在今后的應(yīng)用中越來越重要。

關(guān)鍵字
組件框架,面向?qū)ο缶幊?,腳本,強(qiáng)類型,系統(tǒng)編程

1.簡介
    在過去的十五年里,人們編寫計(jì)算機(jī)程序的方法發(fā)生了根本的轉(zhuǎn)變。這種轉(zhuǎn)變是從c或c++等系統(tǒng)程序設(shè)計(jì)語言到Perl或Tcl等腳本語言的過渡。雖然很多人參與了轉(zhuǎn)變,卻很少有人意識(shí)到它的發(fā)生,更不用說知道為什么會(huì)發(fā)生。這篇文章是我關(guān)于為什么在下個(gè)世紀(jì)腳本語言可以比系統(tǒng)程序設(shè)計(jì)語言更好的處理許多編程工作的一點(diǎn)看法。

   與系統(tǒng)程序設(shè)計(jì)語言相比,不同的腳本語言為不同的工作而設(shè)計(jì),這導(dǎo)致了語言間的根本不同。系統(tǒng)程序設(shè)計(jì)語言起源于像內(nèi)存字等最初期的計(jì)算機(jī)元素,它為建立數(shù)據(jù)結(jié)構(gòu)和算法而創(chuàng)建。相反的,腳本語言為膠著而設(shè)計(jì):他們假設(shè)已經(jīng)存在一套強(qiáng)大的組件,而它主要是把組件連在一起。系統(tǒng)程序設(shè)計(jì)語言使用強(qiáng)類型定義來幫助處理復(fù)雜事務(wù),而腳本語言使用無類型定義來簡化組件間的聯(lián)系,并提供快速應(yīng)用開發(fā).

    腳本語言和系統(tǒng)程序設(shè)計(jì)語言互為補(bǔ)充,并且二十世紀(jì)六十年代以來的大多數(shù)主要的計(jì)算機(jī)平臺(tái)都同時(shí)提供這兩種類型的語言。這些語言在組件框架中有著典型的應(yīng)用:組件由系統(tǒng)程序設(shè)計(jì)語言創(chuàng)建,并由腳本語言組合在一起。然而,速度更快的機(jī)器,更好的腳本語言,圖形用戶界面和組件構(gòu)造重要性的不斷提高,因特網(wǎng)的發(fā)展等發(fā)展趨勢大大提高了腳本語言的應(yīng)用。在今后的十年中,這種趨勢將繼續(xù),而且越來越多的完全使用腳本語言和系統(tǒng)程序設(shè)計(jì)語言書寫的應(yīng)用程序?qū)⒅饕脕韯?chuàng)建組件。

2.系統(tǒng)程序設(shè)計(jì)語言
    為了理解腳本語言和系統(tǒng)程序設(shè)計(jì)語言的不同,最好先了解一下系統(tǒng)程序設(shè)計(jì)語言是如何發(fā)展的.系統(tǒng)程序設(shè)計(jì)語言是作為除匯編語言外的另一種選擇而引入的.在匯編語言里,實(shí)際上機(jī)器的每一個(gè)細(xì)節(jié)都被反映在程序里.每個(gè)狀態(tài)代表一個(gè)簡單的機(jī)器指令,而程序員必須處理像寄存器分配和程序調(diào)用順序等低層細(xì)節(jié).因此,用匯編語言編寫和維持大型程序是很困難的.

   二十世紀(jì)五十年代后期像Lisp,Fortran和Algol等高層語言開始出現(xiàn).這些語言里的狀態(tài)和機(jī)器指令不再完全一致,編譯程序把過程程序中的每個(gè)狀態(tài)翻譯成一系列二進(jìn)制指令.經(jīng)過一段時(shí)間,一系列系統(tǒng)程序設(shè)計(jì)語言包括PL/1,Pascal,C,C++和Java由Algol發(fā)展而來.系統(tǒng)程序設(shè)計(jì)語言沒有匯編語言的效率高,但他們使應(yīng)用程序更快的發(fā)展起來,因此,系統(tǒng)程序設(shè)計(jì)語言在大型應(yīng)用項(xiàng)目的發(fā)展中幾乎完全取代了匯編語言.

    系統(tǒng)程序設(shè)計(jì)語言與匯編語言在兩個(gè)方面有所不同:它是高層語言并且是強(qiáng)類型."高層"意味著很多細(xì)節(jié)被自動(dòng)處理以便編程人員可以寫更少的代碼而做同樣的工作.例如:

★編譯程序處理寄存器分配,所以編程人員不需要寫代碼來在寄存器和內(nèi)存間轉(zhuǎn)移數(shù)據(jù)
★自動(dòng)設(shè)計(jì)程序調(diào)用順序:編程人員不需要擔(dān)心調(diào)用棧之間的參數(shù)轉(zhuǎn)移
★編程人員可以使用像while和if等簡單的關(guān)鍵字來控制結(jié)構(gòu),編譯器執(zhí)行所有的指令細(xì)節(jié)來完成控制結(jié)構(gòu)

    平均每行系統(tǒng)程序設(shè)計(jì)語言代碼翻譯成大約五條機(jī)器指令,與此相比,每行匯編語言代碼翻譯成一條機(jī)器指令(由5個(gè)不同的人寫的8個(gè)c文件的非正式分析中,我發(fā)現(xiàn)這個(gè)比率為每行3到7條指令;Capers Jones從大量語言的研究中發(fā)現(xiàn)對于一個(gè)給定的工作,匯編語言需要的代碼長度大約是系統(tǒng)程序設(shè)計(jì)語言代碼長度的3-6倍)不管是什么語言,編程人員每年可以寫大體上相同數(shù)量的代碼行,因此,系統(tǒng)程序設(shè)計(jì)語言允許用比匯編語言快得多的語言寫應(yīng)用程序.

   匯編語言和系統(tǒng)程序設(shè)計(jì)語言的第二個(gè)不同是類型設(shè)置.我使用"類型"來說明信息的意義在它被使用前就被特殊化.在強(qiáng)類型語言中編程人員聲明如何使用每條信息,并避免此信息被用于其他方式.在弱類型語言中信息應(yīng)用是沒有優(yōu)先權(quán)限制:信息的意思完全由它的使用方法確定,而不是任何初始約定.

   現(xiàn)代計(jì)算機(jī)基本上是無類型的:內(nèi)存中的任何字對任何類型的值比如整型,浮點(diǎn)數(shù),指針或結(jié)構(gòu)體都是有效的.值的意思由它的使用方法確定:如果指向一個(gè)內(nèi)存字,那么他就被認(rèn)為是結(jié)構(gòu)體;如果一個(gè)字涉及一個(gè)整型加結(jié)構(gòu)體,那么他就被認(rèn)為是整型,如此等等.相同的字在不同的時(shí)間可用于不同的方法.

  與此相反,現(xiàn)在的系統(tǒng)程序設(shè)計(jì)語言是強(qiáng)類型定義的.例如:

★系統(tǒng)程序設(shè)計(jì)語言中的每個(gè)變量都必須被聲明為整型或指針或字符串等特殊類型,并且必須用于適合這種類型變量的方法
★數(shù)據(jù)與代碼完全分離:創(chuàng)建新的代碼很困難或根本不可能.
★變量可以集中在結(jié)構(gòu)體中或者定義好的子結(jié)構(gòu)體和過程或方法的對象中以便于使用;一種類型的對象不能用于期待其他類型對象處.

    確定類型由幾個(gè)好處.第一,聲明變量如何使用使大型程序更易于管理并區(qū)分那些必須被分別對待的變量.第二,編譯器可以利用類型信息來偵測某些類型的錯(cuò)誤,比如,試圖把一個(gè)浮點(diǎn)值作為一個(gè)指針.第三,定義類型能使編譯器更好的執(zhí)行特殊代碼.例如,如果編譯器知道一個(gè)變量總是對整型值有效,那么他就可以產(chǎn)生一個(gè)整型指令來操縱這個(gè)變量;如果編譯器不知道變量的類型,那么他就必須產(chǎn)生額外的指令在運(yùn)行時(shí)檢查變量類型.

    總之,系統(tǒng)程序設(shè)計(jì)語言被設(shè)計(jì)來處理與匯編語言相同的工作,即隨機(jī)地產(chǎn)生請求.系統(tǒng)程序設(shè)計(jì)語言比匯編語言層次更高,類型更強(qiáng).這就使請求產(chǎn)生更迅速并且處理更容易,除了在運(yùn)行時(shí)有一點(diǎn)損失,圖示1是匯編語言和其他幾種系統(tǒng)程序設(shè)計(jì)語言的比較.


3.腳本語言
    腳本語言,像Perl,Python,Rexx,Tcl,Visual Basic和Unix shells代表了與系統(tǒng)程序設(shè)計(jì)語言完全不同的編程.腳本語言假設(shè)已經(jīng)存在了一系列由其他語言寫成的有用的組件.腳本語言不希望隨機(jī)地產(chǎn)生請求,他希望主要是把組件接在一起.例如,Tcl和Visual Basic可以被用于在屏幕上安排一系列用戶圖形控制,而Unix shells scripts被用于把過濾程序集合入管道.腳本語言常用于擴(kuò)展組件特性,但他們很少用于復(fù)雜的算法和數(shù)據(jù)結(jié)構(gòu);這些東西常由組件提供.腳本語言有時(shí)涉及膠著語言或系統(tǒng)整體語言.

    為了簡化連接組件的工作,腳本語言被設(shè)計(jì)為無類型的:所有的東西無論是看起來還是使用起來都是完全一樣的,因此他們可以互換.例如,在Tcl或Visual Basic中一個(gè)變量可以一會(huì)兒處理字符串,一會(huì)兒又處理整型.代碼和數(shù)據(jù)也??苫Q,因此,可以用一個(gè)程序?qū)懥硪粋€(gè)程序,然后高速執(zhí)行,腳本語言一般是面向字符的,因?yàn)樗鼮樵S多不同的事物提供了一致的描述.

    無類型語言使組件更容易連在一起.在使用時(shí)沒有優(yōu)先級限制,并且所有的組件及其值都用統(tǒng)一的方式描述.除此之外,任何組件和值都可以在任何情況下使用;為某一目的而設(shè)計(jì)的組件可以被用于設(shè)計(jì)者完全沒有預(yù)見過的完全不同的目的.例如,在Unix shells中,所有的過濾程序從輸入讀入字節(jié)流,并把字節(jié)組成的字符串寫入輸出;任何兩個(gè)程序都可以通過把一個(gè)的輸出連到另一個(gè)的輸入而把兩者聯(lián)系起來.

   下面的shell命令把三個(gè)過濾堆在一起來計(jì)算選中區(qū)域中包含單詞"scripting" 的行數(shù):

select | grep scripting | wc

    select程序讀入當(dāng)前顯示選中的文本并把它輸出;grep程序讀取輸入并把包含"scripting"的行輸出;wc程序?qū)斎氲男袛?shù)求和.其中的每個(gè) 程序都可以用于許多其他情況來做不同的工作.

     系統(tǒng)程序設(shè)計(jì)語言的強(qiáng)類型本質(zhì)上阻止重用.類型鼓勵(lì)編程人員創(chuàng)建包含不相容接口的類型("接口很好,接口越多越好").每個(gè)接口需要特別類型的對象,而編譯器不允許接口使用任何其他類型的對象,即使那樣有用.為了使用一個(gè)已經(jīng)存在的接口的新的對象,就必須寫轉(zhuǎn)換代碼以便在對象的類型和接口期望的類型間進(jìn)行翻譯.這反過來又需要重編譯部分或全部分布式二進(jìn)制形式的應(yīng)用程序,在普通情況下這是不可能的.

     為了能看出無類型語言的優(yōu)點(diǎn),考慮下面的Tcl命令:

button .b -text Hello! -font {Times 16} -command {puts hello}

     這個(gè)命令創(chuàng)建了一個(gè)新的按鈕來顯示16點(diǎn)Times字體,當(dāng)用戶敲擊控制鍵時(shí)顯示一段小的信息.它把六種不同的類型混合成一個(gè)單一的狀態(tài):一個(gè)命令名(button),一個(gè)按鈕控制(.b),所有權(quán)名字(-text, -font, 和-command),簡單字符串(Hello! 和hello),包含鉛字名(Times)及字點(diǎn)大小(16)的字體名(Times 16)和Tcl腳本(puts hello).Tcl代表所有這些非正式字符串.在這個(gè)例子中可以在任何一個(gè)命令中為屬性賦值,而未賦值的屬性使用給定的缺省值.在這個(gè)例子中20個(gè)以上的屬性是不特別賦值的.

    同樣的例子在Java中用兩種方法執(zhí)行時(shí)需要7行代碼.使用C++和微軟基本類(MFC)需要三個(gè)過程25行代碼,在微軟基本類中僅僅設(shè)置字體就需要幾行代碼:

CFont *fontPtr = new CFont();
fontPtr->CreateFont(16, 0, 0,0,700, 0, 0, 0, ANSI_CHARSET,
OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH|FF_DONTCARE, "Times New Roman");
buttonPtr->SetFont(fontPtr);

    大部分代碼是由強(qiáng)類型造成的.為了設(shè)置按鈕字體,必須運(yùn)用SetFont方法,但這個(gè)方法必須通過指針傳給CFont對象,這反過來需要聲明和初始化一個(gè)新的對象.為了初始化CFont對象必須喚醒它的CreateFont 方法,但CreateFont有一個(gè)需要14個(gè)特殊化引數(shù)的固定接口.在Tcl中字體(Times鉛字,16點(diǎn))的基本特征不用聲明或轉(zhuǎn)換就可以立即使用.另外,Tcl允許在創(chuàng)建按鈕的命令中直接包含按鈕行為,而C++和Java中需要把它放在單獨(dú)聲明的方法中.

    (實(shí)際上可以用隱藏基本語言的復(fù)雜性的圖形開發(fā)環(huán)境處理一個(gè)像這樣的不重要的例子:用戶在表中輸入合適的值,而開發(fā)環(huán)境輸出代碼.然而,在更多復(fù)雜情況像按計(jì)劃產(chǎn)生合適值或接口的條件任務(wù)中開發(fā)人員必須在基本語言下編寫代碼)
這可能看起來腳本語言的無類型特性不能發(fā)現(xiàn)錯(cuò)誤,但實(shí)際上腳本語言和系統(tǒng)程序設(shè)計(jì)語言一樣安全.例如在上面的按鈕例子中如果字體大小被置成非整型字符串,就像xyz,那么就會(huì)出現(xiàn)錯(cuò)誤.不同的是當(dāng)一個(gè)值被使用時(shí)腳本語言在最后一刻進(jìn)行錯(cuò)誤檢查,而強(qiáng)類型在編譯時(shí)發(fā)現(xiàn)錯(cuò)誤這就避免了運(yùn)行時(shí)的檢查.然而提高效率的代價(jià)是限制信息如何使用:這導(dǎo)致了更多的代碼和更不易改變的程序.

    腳本語言和系統(tǒng)程序設(shè)計(jì)語言的另一個(gè)重要不同是腳本語言是被解釋而系統(tǒng)程序設(shè)計(jì)語言是被編譯.被解釋的語言由于沒有編譯時(shí)間而提供快速的轉(zhuǎn)換.通過允許用戶運(yùn)行時(shí)編寫應(yīng)用程序,解釋器使.應(yīng)用程序更加靈活,例如,許多整體線路的綜合分析工具,包括Tcl解釋器;程序用戶編寫Tcl 腳本來使他們的設(shè)計(jì)具體化并控制工具操作.通過快速設(shè)計(jì)代碼解釋器可以實(shí)現(xiàn)強(qiáng)大的功能.例如,一個(gè)基于Tcl的網(wǎng)頁瀏覽器可以通過把網(wǎng)頁中的HTML轉(zhuǎn)換為使用一些常規(guī)表達(dá)替代物的Tcl腳本,從而從語法上分析網(wǎng)頁然后執(zhí)行腳本把頁面翻譯顯示在屏幕上.

   腳本語言不如系統(tǒng)程序設(shè)計(jì)語言效率高,部分是因?yàn)樗麄兪褂媒忉屍鞫皇蔷幾g器,而且因?yàn)樗麄兓窘M件的選擇標(biāo)準(zhǔn)是功能強(qiáng)大和易于使用而不是有效地對應(yīng)基本硬件.例如,腳本語言經(jīng)常使用長度可變的字符串,而同樣的情況下系統(tǒng)程序設(shè)計(jì)語言使用對應(yīng)一個(gè)機(jī)器字的二進(jìn)制值;腳本語言經(jīng)常使用哈希表,而系統(tǒng)程序設(shè)計(jì)語言使用變址陣列.

    幸運(yùn)的是,腳本語言的性能不經(jīng)常是一個(gè)主要的問題.腳本語言應(yīng)用程序通常比系統(tǒng)程序設(shè)計(jì)語言的應(yīng)用程序要小,并且腳本應(yīng)用程序的執(zhí)行受組件執(zhí)行的支配,而這些組件是系統(tǒng)程序設(shè)計(jì)語言提供的典型工具.

    腳本語言比系統(tǒng)程序設(shè)計(jì)語言更高級,平均一個(gè)指令可以做更多的工作.一個(gè)典型的腳本語言指令執(zhí)行成百上千條機(jī)器指令,而一個(gè)典型的系統(tǒng)程序設(shè)計(jì)語言指令執(zhí)行大約五條機(jī)器指令(參圖一).部分不同是因?yàn)槟_本語言使用翻譯器,這不如系統(tǒng)程序設(shè)計(jì)語言中被編譯的代碼.但是主要的不同是因?yàn)槟_本語言的初期操作有更強(qiáng)大的功能.例如,Perl中喚醒一個(gè)常規(guī)表達(dá)替代和喚醒一個(gè)整型加法一樣簡單.在Tcl中,變量會(huì)有與它相聯(lián)系的圖標(biāo),因此,設(shè)置變量會(huì)導(dǎo)致側(cè)面影響.例如,一個(gè)圖標(biāo)可能會(huì)被用于保持變量的值在屏幕上持續(xù)更新.



表1.表的每行描述了被執(zhí)行了兩遍的應(yīng)用程序,一遍使用系統(tǒng)程序設(shè)計(jì)語言,像C或Java,一遍使用腳本語言,像Tcl.代碼率列給出了兩個(gè)應(yīng)用程序的代碼行率(>1意味著系統(tǒng)編程語言需要更多的代碼),作用率列給出了開發(fā)率.在大多數(shù)情況下兩個(gè)版本由不同的開發(fā)者執(zhí)行.表中的信息由comp.lang.tcl新聞組中對文章進(jìn)行答復(fù)的不同人提供。.

    由于上面描述的特性,腳本語言允許基于膠著的應(yīng)用程序的快速發(fā)展.表1提供了有趣的支持.它描述了幾個(gè)在系統(tǒng)程序設(shè)計(jì)語言下執(zhí)行后又在腳本語言中重新執(zhí)行的應(yīng)用程序,或反過來也是一樣的.

   在每種情況下腳本版本都比系統(tǒng)編程版本需要更少的代碼和更短的開發(fā)時(shí)間,不同點(diǎn)的變化從2到60.腳本語言第一次執(zhí)行時(shí)好處不顯著,這使人聯(lián)想到任何在第一次執(zhí)行經(jīng)驗(yàn)上的重執(zhí)行都會(huì)更好,而腳本和系統(tǒng)編程的真正不同相差5到10倍,而不是表中的極端點(diǎn).腳本的好處同樣依賴于應(yīng)用程序.在表中的最后一個(gè)例子中,應(yīng)用程序的圖形用戶界面部分是基于膠著的,而模擬裝置部分卻不是;這可能解釋為什么腳本應(yīng)用程序不如其他應(yīng)用程序獲益多.

    總之,腳本語言被設(shè)計(jì)成膠著應(yīng)用程序,他們提供比匯編或系統(tǒng)程序設(shè)計(jì)語言更高層的編程,比系統(tǒng)程序設(shè)計(jì)語言更弱的類型,和解譯后的開發(fā)環(huán)境.腳本語言犧牲執(zhí)行速度來提高開發(fā)速度.

4.不同的任務(wù),不同的工具
    腳本語言不是系統(tǒng)程序設(shè)計(jì)語言的替代品,反過來也一樣.他們各自適合不同類型的工作.把膠著和系統(tǒng)合為一體,應(yīng)用程序可以比腳本語言快5-10倍;系統(tǒng)程序設(shè)計(jì)語言將需要大量復(fù)本和轉(zhuǎn)換代碼來連接各塊.而這直接使用腳本語言.對于復(fù)雜的算法和數(shù)據(jù)結(jié)構(gòu),系統(tǒng)程序設(shè)計(jì)語言的強(qiáng)類型使程序更易于管理.執(zhí)行速度是關(guān)鍵.系統(tǒng)程序設(shè)計(jì)語言可以比腳本語言運(yùn)行快10-20倍,因?yàn)樗a(chǎn)生更少的運(yùn)行時(shí)檢查.

    在決定是否使用腳本語言或系統(tǒng)程序設(shè)計(jì)語言處理一項(xiàng)特殊任務(wù)時(shí)考慮以下問題:

★應(yīng)用程序的主要工作是否是把已經(jīng)存在的組件聯(lián)系起來
★應(yīng)用程序是否要操縱不同種類類型的事物
★應(yīng)用程序是否包含圖形用戶界面
★應(yīng)用程序是否做大量字符串操作
★應(yīng)用程序函數(shù)是否能快速解決問題
★應(yīng)用程序是否需要可擴(kuò)展

  如果這些問題回答"是"就表明這個(gè)應(yīng)用程序使用腳本語言會(huì)更好.另一方面,如果對下面的問題回答"是"就表明系統(tǒng)程序設(shè)計(jì)語言更適合這個(gè)應(yīng)用程序:

★應(yīng)用程序是否執(zhí)行復(fù)雜的算法或數(shù)據(jù)結(jié)構(gòu)
★應(yīng)用程序是否操縱大量數(shù)據(jù)集(像圖像中的所有像素)因而執(zhí)行速度很重要
★應(yīng)用程序的函數(shù)是否已經(jīng)定義好,并且很少改動(dòng)

  在過去的30年中,大多數(shù)主要的計(jì)算機(jī)平臺(tái)同時(shí)提供系統(tǒng)編程和腳本語言。例如,第一個(gè)腳本語言雖然粗糙,卻是一個(gè)JCL(作業(yè)控制語言),它被用于在OS/360中把工作等級按順序排好。個(gè)別工作等級由PL1,Fortran或匯編語言書寫,那時(shí)是系統(tǒng)程序設(shè)計(jì)語言。在二十世紀(jì)八十年代時(shí)Unix機(jī)器上,c被用于系統(tǒng)編程而sh,csh等殼編程被用于腳本。在二十世紀(jì)九十年代的PC時(shí)代里,c和c++被用于系統(tǒng)編程e而Visual Basic用于腳本。在現(xiàn)在已基本成形的網(wǎng)絡(luò)時(shí)代中,Java被用于系統(tǒng)編程而像JavaScript , Perl和Tcl等語言被用于腳本。

  腳本和系統(tǒng)編程是共生的,共同使用,他們能產(chǎn)生格外強(qiáng)大的編程環(huán)境:系統(tǒng)程序設(shè)計(jì)語言用于產(chǎn)生令人興奮的組件,然后用腳本語言把他們組裝起來。例如,Visual Basic的主要吸引力是系統(tǒng)編程者可以用c編寫ActiveX組件,而不太老練的編程者可以在Visual Basic應(yīng)用中使用這些組件。在Unix下編寫用于喚醒用c編寫的應(yīng)用程序的殼腳本很容易。Tcl普及的一個(gè)原因是可以編寫執(zhí)行新命令的c代碼來擴(kuò)展該語言的能力。

5.腳本呈上升趨勢
  腳本語言已經(jīng)存在了很長時(shí)間,但最近幾年幾個(gè)因素的綜合結(jié)果使它的重要性提高了。最重要的因素是應(yīng)用程序綜合向膠著應(yīng)用程序發(fā)展的變換。這種變換的三個(gè)實(shí)例是圖形用戶界面,因特網(wǎng)和組件框架。

  圖形用戶界面出現(xiàn)于二十世紀(jì)八十年代早期,并在二十世紀(jì)八十年代晚期得以普及。在許多編程項(xiàng)目中圖形用戶界面占了一半甚至更多的比重。圖形用戶界面基于膠著應(yīng)用:他的目標(biāo)不是創(chuàng)建新的功能,而是把圖形控制集合和應(yīng)用程序內(nèi)部函數(shù)聯(lián)系起來。我不擔(dān)心任何快速發(fā)展的環(huán)境因?yàn)閳D形用戶界面基于系統(tǒng)程序設(shè)計(jì)語言,不論是Windows環(huán)境,Macintosh Toolbox或Unix Mctif,圖形用戶界面基于c或c++等已被證明難以掌握,使用不靈活,生成結(jié)果不靈活的語言。一些這樣的系統(tǒng)有很好的圖形工具來設(shè)計(jì)屏幕輸出并隱藏基本語言,而一旦設(shè)計(jì)者不得不編寫代碼時(shí)一切變得困難起來,像為接口元素提供行為。所有好的快速開發(fā)圖形用戶界面環(huán)境都基于腳本語言:Visual Basic,Hyperlard和Tcl/tk,隨著圖形用戶界面的普及,腳本語言也越來越流行。

  因特網(wǎng)的增長也使腳本語言變得大眾化。因特網(wǎng)只是一種膠著工具,它不創(chuàng)建任何新的計(jì)算結(jié)果或數(shù)據(jù);它只是簡單的把大量已經(jīng)存在的事物聯(lián)系起來。因特網(wǎng)編程工作的完美工作之一是讓所有連接的組件在一起工作,像腳本語言。例如:Perl 因編寫CGI腳本而流行,JavaScript因編寫網(wǎng)頁而流行。

  基于腳本的第三個(gè)例子是組件框架,像ActiveX,OpenDoc和JavaBeans。雖然系統(tǒng)程序設(shè)計(jì)語言可以很好的創(chuàng)建組件,但腳本更適合組裝組件到應(yīng)用程序中。沒有一個(gè)好的腳本語言來操縱組件,組件框架的大部分功能就都沒有了。這可以部分解釋為什么組件框架在個(gè)人電腦上(Visual Basic提供了方便的腳本工具)比在像Unix/CORBA等組件框架中不包含腳本的平臺(tái)上更成功.

  腳本語言繼續(xù)普及的另一個(gè)原因是腳本技術(shù)的提高?,F(xiàn)代腳本語言像Tcl和Perl離早期腳本語言像JCL的公開宣布已經(jīng)很遠(yuǎn)。例如,JCL不提供基本反復(fù)而早期Unix外殼不提供過程,即使在今天,腳本技術(shù)仍然相對不成熟。例如,Visual Basic不是真正的腳本語言:它最初執(zhí)行像一個(gè)簡單的系統(tǒng)程序設(shè)計(jì)語言,然后修改使之更適合腳本。以后的腳本語言將比現(xiàn)在使用的更好。

    腳本技術(shù)得益于計(jì)算機(jī)硬件的加速發(fā)展。過去常常用系統(tǒng)程序設(shè)計(jì)語言在復(fù)雜的應(yīng)用程序中獲得可接受的執(zhí)行。某些情況下甚至系統(tǒng)程序設(shè)計(jì)語言也不夠有效,因此不得不用匯編編寫應(yīng)用程序。然而,今天的機(jī)器比1980年的快100-500倍,并且仍在繼續(xù)以每18個(gè)月翻一番的速度增長。今天,許多應(yīng)用程序可以用解釋后的程序執(zhí)行,并且仍然有出色的執(zhí)行。例如,Tcl腳本可以操縱幾千個(gè)對象同時(shí)提供好的相互響應(yīng)。由于計(jì)算機(jī)速度的不斷提高,腳本將對越來越大的應(yīng)用程序產(chǎn)生吸引力。

  腳本語言應(yīng)用的不斷增長最終導(dǎo)致編程群體的改變.二十年前大多數(shù)編程者是大型項(xiàng)目的熟練的編程人員.那個(gè)時(shí)代的編程人員需要花幾個(gè)月的時(shí)間掌握一門語言和它的編程環(huán)境,系統(tǒng)程序設(shè)計(jì)語言就是為這些人設(shè)計(jì)的.然而,自從個(gè)人電腦出現(xiàn)以后,越來越多的非專業(yè)編程者加入到編程者的行列.對這些人來說,編程不是他們的主要工作,而只是他們偶爾用來幫助他們工作的工具.偶然編程的例子是簡單的數(shù)據(jù)庫查詢或者是巨大的擴(kuò)展片.偶然編程者不希望花幾個(gè)月的時(shí)間學(xué)習(xí)系統(tǒng)程序設(shè)計(jì)語言但他們可以花幾個(gè)小時(shí)的時(shí)間學(xué)到足夠的腳本語言知識(shí)來寫出有用的代碼.由于腳本語言由簡單的句法并且省略了對象線程等復(fù)雜的特性,因而它比系統(tǒng)程序設(shè)計(jì)語言要容易學(xué).例如,比較Visual Basic和Visual C++,很少有偶爾編程者會(huì)選擇Visual C++,而大部分會(huì)用Visual Basic建立有用的應(yīng)用程序.

   即使在今天,用腳本語言編寫的應(yīng)用程序的數(shù)目也遠(yuǎn)多于用系統(tǒng)程序設(shè)計(jì)語言編寫的應(yīng)用程序的數(shù)目.在Unix系統(tǒng)中有比C程序更多的外部腳本,而在Windows下Visual Basic的編程者和應(yīng)用程序都比C或C++的要多.當(dāng)然,多數(shù)大型和廣泛使用的應(yīng)用程序都是用系統(tǒng)程序設(shè)計(jì)語言寫成的,所以,如果比較代碼總行數(shù)或是建立的副本數(shù),則系統(tǒng)程序設(shè)計(jì)語言略勝一籌.不管怎么樣,腳本語言已經(jīng)是應(yīng)用程序開發(fā)的主動(dòng)力,并且今后它的市場份額會(huì)繼續(xù)提高.

6.對象的作用
   腳本語言在編程語言和軟件工程中通常被專家忽視.取而代之,他們更注重像C++和Java等面向?qū)ο笙到y(tǒng)程序設(shè)計(jì)語言.面向?qū)ο缶幊瘫徽J(rèn)為是代表下一步編程語言發(fā)展的主流.像強(qiáng)類型和繼承等面向?qū)ο?特征 據(jù)說可以減少開發(fā)時(shí)間,提高軟件重用率,并解決包括腳本語言技巧等其他問題.

   面向?qū)ο缶幊虒?shí)際能提供多少好處?不幸的是,我還沒有看到足夠的數(shù)據(jù)可以確切地回答這個(gè)問題.在我看來,對象只能提供一定的好處:或許能提高20-30%的創(chuàng)作力,但決不會(huì)有兩倍,更不用說是十倍.現(xiàn)在抱怨C++的和喜歡它的一樣多,并且一些語言專家開始公開反對面向?qū)ο缶幊?這一段剩下的部分用于解釋為什么對象不能像腳本一樣顯著地提高創(chuàng)作力,并討論腳本語言中可以獲得的面向?qū)ο缶幊痰暮锰?

  面向?qū)ο缶幊滩荒茱@著提高創(chuàng)作力的原因是他沒有提高編程層次或鼓勵(lì)重用.像C++等面向?qū)ο笳Z言中編程者仍然使用需要用大量細(xì)節(jié)來描述和操縱的基本的小單元工作.理論上可以開發(fā)強(qiáng)大的函數(shù)庫包,并且如果這些函數(shù)庫被廣泛使用就將提高編程層次.然而,這樣的函數(shù)庫卻很少.大多數(shù)面向?qū)ο笳Z言的強(qiáng)類型使包的定義受限制從而難以重用.每個(gè)包都需要特殊類型的對象,如果兩個(gè)包在一起工作,就必須寫轉(zhuǎn)換代碼在兩個(gè)包需要的類型間進(jìn)行翻譯.面向?qū)ο笳Z言的另一個(gè)問題是他們強(qiáng)調(diào)繼承.當(dāng)一個(gè)類借用為另一個(gè)類寫的代碼時(shí)執(zhí)行繼承并不是一個(gè)好主意,它使軟件難以管理和重用.它把類的執(zhí)行綁在一起,因而沒有另外一個(gè)類任何一個(gè)其它類都不可理解:不知道其繼承的方法在父類中如何執(zhí)行,則無法理解子類;而不知道其方法如何被子類繼承,則無法理解父類.在一個(gè)復(fù)雜的類繼承中,不理解它所繼承的所有其他的類就無法理解任何一個(gè)類.更糟的是,一個(gè)類無法從它繼承的類中被分離以用于重用.多重繼承使這個(gè)問題變得更麻煩.執(zhí)行繼承導(dǎo)致和goto語句被重復(fù)執(zhí)行時(shí)所看到的一樣的交錯(cuò)和不可靠.因此,面向?qū)ο笙到y(tǒng)經(jīng)常不能處理復(fù)雜問題并缺少重用.

   另一方面,腳本語言實(shí)際引起了有效的軟件重用.在有趣的組件由系統(tǒng)程序設(shè)計(jì)語言建立使他們使用了模塊,隨后用腳本語言把他們膠著在應(yīng)用程序中.這種勞動(dòng)的分割提供了為重用的自然的框架結(jié)構(gòu).組件被設(shè)計(jì)為可重用的組件和腳本間有定義好的接口以利于組件的使用.例如,在Tcl中組件是C中執(zhí)行的常規(guī)命令.他們看起來更象是內(nèi)在的命令,因而更容易在Tcl腳本中使用.在Visual Basic中組件是ActiveX的擴(kuò)展,可用于從工具面板直接拖到窗體中.
不管怎么樣,面向?qū)ο缶幊讨辽偬峁┝藘蓚€(gè)有用的特性.第一個(gè)是封裝:對象用某種隱藏執(zhí)行細(xì)節(jié)的方法把數(shù)據(jù)和代碼聯(lián)系起來.這使管理大型系統(tǒng)更加容易.另一個(gè)有用的特性是接口繼承,這涉及提供同樣方法的類和APIs,即使他們有不同的執(zhí)行,這時(shí)類之間可以相互轉(zhuǎn)化,從而鼓勵(lì)重用.

   幸運(yùn)的是,對象的這些好處在腳本語言中可以像在系統(tǒng)程序設(shè)計(jì)語言中一樣實(shí)現(xiàn),并且所有的腳本語言都提供面向?qū)ο缶幊?例如,Python是面向?qū)ο竽_本語言,Python第五版包括提供對象,Object Rexx是Rexx的面向?qū)ο蟀姹?而Incr Tcl是Tcl的面向?qū)ο蟀姹?有一點(diǎn)不同是,腳本語言中的對象事物類型的,而系統(tǒng)程序設(shè)計(jì)語言中的對象是強(qiáng)類型的.

7.其他語言
   這篇文章不是所有編程語言的全部特性記述.除了類型長度和編程層次以外還有許多編程語言的其他特性,并且還有許多不能被明確定義為系統(tǒng)程序設(shè)計(jì)語言或腳本語言的其他有趣的語言.例如,Lisp系統(tǒng)的語言就處于腳本語言和系統(tǒng)程序設(shè)計(jì)語言之間,兩方的特性它都有一些.它開創(chuàng)了像解釋和活動(dòng)類型等現(xiàn)在在腳本語言中很普遍的觀點(diǎn),又有自動(dòng)存儲(chǔ)管理和綜合開發(fā)環(huán)境等在腳本和系統(tǒng)程序設(shè)計(jì)語言中同時(shí)使用的觀念.

8.結(jié)論
   腳本語言代表一套與系統(tǒng)程序設(shè)計(jì)語言不同的協(xié)定.他們犧牲執(zhí)行速度和與系統(tǒng)程序設(shè)計(jì)語言相關(guān)的類型長度而提供更高的編程創(chuàng)作力和軟件重用.當(dāng)計(jì)算機(jī)變得更快和比編程者的勞動(dòng)力更便宜時(shí)這個(gè)協(xié)定越來越行得通.在復(fù)雜的數(shù)據(jù)結(jié)構(gòu)和算法中系統(tǒng)程序設(shè)計(jì)語言也適于創(chuàng)建組件,而腳本語言更適合在聯(lián)系復(fù)雜的應(yīng)用程序中進(jìn)行膠著.膠著工作變得越來越盛行,因而腳本在下個(gè)世紀(jì)將成為比今天更為重要的編程范例.

   我希望這篇文章可以在三個(gè)方面影響編程群體;
★在開始一個(gè)新的項(xiàng)目并為每個(gè)工作選擇最強(qiáng)大的工具時(shí)我希望編程人員能考慮到腳本和系統(tǒng)編程的不同
★我希望組件框架的設(shè)計(jì)者能認(rèn)識(shí)到腳本的重要性并確信框架不僅是創(chuàng)建組件的工具,同時(shí)也是把他們膠著在一起的工具
★我希望編程語言研究協(xié)會(huì)能轉(zhuǎn)變他們對腳本語言的態(tài)度,并在將來幫助發(fā)展更強(qiáng)大的腳本語言.對語言設(shè)計(jì)者而言,提高編程層次應(yīng)該是唯一重要的目標(biāo),因?yàn)樗翘岣呔幊陶邉?chuàng)造力的最重要的因素;強(qiáng)類型是否有助于達(dá)到這個(gè)目標(biāo)還不清楚.

9.答謝
   這篇文章得益于很多人的觀點(diǎn),包括Joel Bartlett, Bill Eldridge, Jeffrey Haemer, Mark Harrison, Paul McJones, David Patterson, Stephen Uhler, Hank Walker, Chris Wright,IEEE計(jì)算機(jī)執(zhí)行官,和許多熱心參與這篇文章早期草稿網(wǎng)上新聞組討論的人.Colin Stevens 寫了MFC按鈕例子的版本,Strphen Uhler寫了Java版本.

10.參考資料(譯者注:略。請參看原文)

Scripting: Higher Level Programming for the 21st Century


原文作者:John K. Ousterhout
譯文作者:          @vicky@ 

©Tcl/Tk中文網(wǎng) 2003-2008
ALL RIGHTS RESERVED


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
ASP頁面與ASP.NET頁面的區(qū)別
ASP.NET與ASP有哪些區(qū)別?
為什么不能用漢字編程?
滲透測試工程師必備的編程語言知識(shí)
C語言開發(fā)工程師做什么
感興趣的編程語言
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服