摘要:
Perl和Tcl等腳本語言代表一種與c或JavaTM為代表的系統程序設計語言完全不同的編程形式。腳本語言為"膠著"應用程序而設計,它使用無類型方法來實現高級編程和比系統程序設計語言更快的發展應用。計算機速度的增長和混合應用的改變使腳本語言在今后的應用中越來越重要。
關鍵字:
組件框架,面向對象編程,腳本,強類型,系統編程
1.簡介
在過去的十五年里,人們編寫計算機程序的方法發生了根本的轉變。這種轉變是從c或c++等系統程序設計語言到Perl或Tcl等腳本語言的過渡。雖然很多人參與了轉變,卻很少有人意識到它的發生,更不用說知道為什么會發生。這篇文章是我關于為什么在下個世紀腳本語言可以比系統程序設計語言更好的處理許多編程工作的一點看法。
與系統程序設計語言相比,不同的腳本語言為不同的工作而設計,這導致了語言間的根本不同。系統程序設計語言起源于像內存字等最初期的計算機元素,它為建立數據結構和算法而創建。相反的,腳本語言為膠著而設計:他們假設已經存在一套強大的組件,而它主要是把組件連在一起。系統程序設計語言使用強類型定義來幫助處理復雜事務,而腳本語言使用無類型定義來簡化組件間的聯系,并提供快速應用開發.
腳本語言和系統程序設計語言互為補充,并且二十世紀六十年代以來的大多數主要的計算機平臺都同時提供這兩種類型的語言。這些語言在組件框架中有著典型的應用:組件由系統程序設計語言創建,并由腳本語言組合在一起。然而,速度更快的機器,更好的腳本語言,圖形用戶界面和組件構造重要性的不斷提高,因特網的發展等發展趨勢大大提高了腳本語言的應用。在今后的十年中,這種趨勢將繼續,而且越來越多的完全使用腳本語言和系統程序設計語言書寫的應用程序將主要用來創建組件。
2.系統程序設計語言
為了理解腳本語言和系統程序設計語言的不同,最好先了解一下系統程序設計語言是如何發展的.系統程序設計語言是作為除匯編語言外的另一種選擇而引入的.在匯編語言里,實際上機器的每一個細節都被反映在程序里.每個狀態代表一個簡單的機器指令,而程序員必須處理像寄存器分配和程序調用順序等低層細節.因此,用匯編語言編寫和維持大型程序是很困難的.
二十世紀五十年代后期像Lisp,Fortran和Algol等高層語言開始出現.這些語言里的狀態和機器指令不再完全一致,編譯程序把過程程序中的每個狀態翻譯成一系列二進制指令.經過一段時間,一系列系統程序設計語言包括PL/1,Pascal,C,C++和Java由Algol發展而來.系統程序設計語言沒有匯編語言的效率高,但他們使應用程序更快的發展起來,因此,系統程序設計語言在大型應用項目的發展中幾乎完全取代了匯編語言.
系統程序設計語言與匯編語言在兩個方面有所不同:它是高層語言并且是強類型."高層"意味著很多細節被自動處理以便編程人員可以寫更少的代碼而做同樣的工作.例如:
★編譯程序處理寄存器分配,所以編程人員不需要寫代碼來在寄存器和內存間轉移數據
★自動設計程序調用順序:編程人員不需要擔心調用棧之間的參數轉移
★編程人員可以使用像while和if等簡單的關鍵字來控制結構,編譯器執行所有的指令細節來完成控制結構
平均每行系統程序設計語言代碼翻譯成大約五條機器指令,與此相比,每行匯編語言代碼翻譯成一條機器指令(由5個不同的人寫的8個c文件的非正式分析中,我發現這個比率為每行3到7條指令;Capers Jones從大量語言的研究中發現對于一個給定的工作,匯編語言需要的代碼長度大約是系統程序設計語言代碼長度的3-6倍)不管是什么語言,編程人員每年可以寫大體上相同數量的代碼行,因此,系統程序設計語言允許用比匯編語言快得多的語言寫應用程序.
匯編語言和系統程序設計語言的第二個不同是類型設置.我使用"類型"來說明信息的意義在它被使用前就被特殊化.在強類型語言中編程人員聲明如何使用每條信息,并避免此信息被用于其他方式.在弱類型語言中信息應用是沒有優先權限制:信息的意思完全由它的使用方法確定,而不是任何初始約定.
現代計算機基本上是無類型的:內存中的任何字對任何類型的值比如整型,浮點數,指針或結構體都是有效的.值的意思由它的使用方法確定:如果指向一個內存字,那么他就被認為是結構體;如果一個字涉及一個整型加結構體,那么他就被認為是整型,如此等等.相同的字在不同的時間可用于不同的方法.
與此相反,現在的系統程序設計語言是強類型定義的.例如:
★系統程序設計語言中的每個變量都必須被聲明為整型或指針或字符串等特殊類型,并且必須用于適合這種類型變量的方法
★數據與代碼完全分離:創建新的代碼很困難或根本不可能.
★變量可以集中在結構體中或者定義好的子結構體和過程或方法的對象中以便于使用;一種類型的對象不能用于期待其他類型對象處.
確定類型由幾個好處.第一,聲明變量如何使用使大型程序更易于管理并區分那些必須被分別對待的變量.第二,編譯器可以利用類型信息來偵測某些類型的錯誤,比如,試圖把一個浮點值作為一個指針.第三,定義類型能使編譯器更好的執行特殊代碼.例如,如果編譯器知道一個變量總是對整型值有效,那么他就可以產生一個整型指令來操縱這個變量;如果編譯器不知道變量的類型,那么他就必須產生額外的指令在運行時檢查變量類型.
總之,系統程序設計語言被設計來處理與匯編語言相同的工作,即隨機地產生請求.系統程序設計語言比匯編語言層次更高,類型更強.這就使請求產生更迅速并且處理更容易,除了在運行時有一點損失,圖示1是匯編語言和其他幾種系統程序設計語言的比較.
3.腳本語言
腳本語言,像Perl,Python,Rexx,Tcl,Visual Basic和Unix shells代表了與系統程序設計語言完全不同的編程.腳本語言假設已經存在了一系列由其他語言寫成的有用的組件.腳本語言不希望隨機地產生請求,他希望主要是把組件接在一起.例如,Tcl和Visual Basic可以被用于在屏幕上安排一系列用戶圖形控制,而Unix shells scripts被用于把過濾程序集合入管道.腳本語言常用于擴展組件特性,但他們很少用于復雜的算法和數據結構;這些東西常由組件提供.腳本語言有時涉及膠著語言或系統整體語言.
為了簡化連接組件的工作,腳本語言被設計為無類型的:所有的東西無論是看起來還是使用起來都是完全一樣的,因此他們可以互換.例如,在Tcl或Visual Basic中一個變量可以一會兒處理字符串,一會兒又處理整型.代碼和數據也�?苫Q,因此,可以用一個程序寫另一個程序,然后高速執行,腳本語言一般是面向字符的,因為它為許多不同的事物提供了一致的描述.
無類型語言使組件更容易連在一起.在使用時沒有優先級限制,并且所有的組件及其值都用統一的方式描述.除此之外,任何組件和值都可以在任何情況下使用;為某一目的而設計的組件可以被用于設計者完全沒有預見過的完全不同的目的.例如,在Unix shells中,所有的過濾程序從輸入讀入字節流,并把字節組成的字符串寫入輸出;任何兩個程序都可以通過把一個的輸出連到另一個的輸入而把兩者聯系起來.
下面的shell命令把三個過濾堆在一起來計算選中區域中包含單詞"scripting" 的行數:
select | grep scripting | wc
select程序讀入當前顯示選中的文本并把它輸出;grep程序讀取輸入并把包含"scripting"的行輸出;wc程序對輸入的行數求和.其中的每個 程序都可以用于許多其他情況來做不同的工作.
系統程序設計語言的強類型本質上阻止重用.類型鼓勵編程人員創建包含不相容接口的類型("接口很好,接口越多越好").每個接口需要特別類型的對象,而編譯器不允許接口使用任何其他類型的對象,即使那樣有用.為了使用一個已經存在的接口的新的對象,就必須寫轉換代碼以便在對象的類型和接口期望的類型間進行翻譯.這反過來又需要重編譯部分或全部分布式二進制形式的應用程序,在普通情況下這是不可能的.
為了能看出無類型語言的優點,考慮下面的Tcl命令:
button .b -text Hello! -font {Times 16} -command {puts hello}
這個命令創建了一個新的按鈕來顯示16點Times字體,當用戶敲擊控制鍵時顯示一段小的信息.它把六種不同的類型混合成一個單一的狀態:一個命令名(button),一個按鈕控制(.b),所有權名字(-text, -font, 和-command),簡單字符串(Hello! 和hello),包含鉛字名(Times)及字點大小(16)的字體名(Times 16)和Tcl腳本(puts hello).Tcl代表所有這些非正式字符串.在這個例子中可以在任何一個命令中為屬性賦值,而未賦值的屬性使用給定的缺省值.在這個例子中20個以上的屬性是不特別賦值的.
同樣的例子在Java中用兩種方法執行時需要7行代碼.使用C++和微軟基本類(MFC)需要三個過程25行代碼,在微軟基本類中僅僅設置字體就需要幾行代碼:
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);
大部分代碼是由強類型造成的.為了設置按鈕字體,必須運用SetFont方法,但這個方法必須通過指針傳給CFont對象,這反過來需要聲明和初始化一個新的對象.為了初始化CFont對象必須喚醒它的CreateFont 方法,但CreateFont有一個需要14個特殊化引數的固定接口.在Tcl中字體(Times鉛字,16點)的基本特征不用聲明或轉換就可以立即使用.另外,Tcl允許在創建按鈕的命令中直接包含按鈕行為,而C++和Java中需要把它放在單獨聲明的方法中.
文章來源于領測軟件測試網 http://www.kjueaiud.com/