(這篇文章曾於 IEEE 電腦雜誌 1998 年三月號上刊載)
作者序
Perl、Tcl等scripting語言所呈現的設計風格相較起C、JavaTM等系統程式語言是截然不同的。 Scripting語言的目的是要將應用程式「黏」起來;這些語言使用不指定資料型態的方式來達到高階程式的境界並擁有比系統程式語言更多的應用程式開發機會。 隨著電腦運算速度的提升與程式多元化,scripting語言在未來將會對應用程式有非常大的影像力。
John K. Ousterhout
譯者序
前一陣子小弟在網路上尋找有關scripting和系統程式語言差異的文章,我找到了這一篇。小弟讀完了以後覺得這篇文章真的是寫的很好,雖然是作者個人的看法,但是其中有許多詳細的解釋和精闢的觀點,小弟將這篇文章翻譯成中文,希望能將好文章跟大家分享!這篇譯本並不是經過官方校正的版本,所以可能在某些地方難免辭意會有所出入,如果您有興趣可以參考看看原文稿:http://www.tcl.tk/doc/scripting.html
阿得
關鍵字: 元件架構, 物件導向程式設計, scripting, 嚴謹的資料型態控管, 系統程式語言。
1 引言
在過去十五年內,人們寫程式的方式已經有大幅度的改變。 這項改變是源於程式語言的變遷:從系統程式語言轉移到scripting語言,如從C++和JavaTM轉移到Perl或Tcl。雖然有為數不少的人親眼目睹這項重大的發展,卻遲遲無法認同,更不用提大家是否了解改變發生的原因。 這篇文章是我的看法:Scripting語言在21世紀將會會比系統程式語言更有效率的完成工作。
Scripting語言的目的跟系統程式語言不同,他們之間的差異則是可以回溯到語言本質上的差異。 系統程式語言的目的在於「無中生有」:完成各種資料結構與演算法的設計,這種特性已可以在早期電腦上的單字記憶演算法中看到。Scripting語言與系統程式語言不同的地方是其作用在於將應用程式「黏」起來: 這些語言假設運作環境中已經有許多功能強大的元件和模組,而語言的目的就是將這些元件整合起來運作。系統程式語言的資料型態規定地非常嚴謹,而scripting語言則是取消了資料型態的限制來簡化各種元件間的鍵結並專心於程式的開發。
Scripting語言與系統程式語言在某些情況下是互補的,在許多從1960年代就已經開始研發的大型的運算平台上都包含這兩種類型的語言。 這些語言大部分的時候都是在元件架構下一起使用:利用系統程式語言寫元件然後用scripting語言將元件與其它scripting語言結合。 但近來的一些趨勢,如大幅提升的電腦運算速度、功能更強大的scripting語言、地位更根深蒂固的圖型使用者介面(GUI)、元件架構與網際網路的蓬勃發展使得scripting語言的使用率越來越高。這些趨勢在接下來的十年內將會繼續,產生越來越多以scripting語言寫成的程式,而系統成語言的角色也會以元件寫作為主。
2 系統程式語言
為了要深入了解scripting語言與系統程式語言之間的差異,我們必須先了解系統程式語言的用處。 系統程式語言最早是用來取代以機械指令為基礎的組合語言。 組合語言中的每一行程式碼都是機械指令,程式設計師必須了解低階的細節如處理器的暫存器分配和程序呼叫的詳細步驟,由此可見,體積龐大的組合語言程式是非常難管理的。 一直到1950年代末,高階程式語言如LISP,Fortran,與Algol慢慢的被研發出。 這些語言的程式碼不再是以機械指令為主,語言的編譯器(compiler)將程式碼編譯成為二位元指令碼。 慢慢的,許多以Algol為基礎的系統程式語言被開發出,如PL/1,Pascal,C,C++與Java。 系統程式語言雖然沒有組合語言的高效率但是卻比較容易閱讀,進而減少了程式開發的時間,這個特點使得系統程式語言幾乎完全取代了組合語言,作為開發大型程式的主要語言。 系統程式語言與組合語言之間的差異有兩種:系統程式語言屬於較高階的語言而且擁有十分嚴謹的資料型態控管。「高階」一詞代表編譯器會自動處理一些小細節,讓程式碼變得簡短,例:
編譯器會自動去處理CPU暫存器的細節,因此程式設計師不需擔心中央處理器中的暫存器與系統記憶體的資料傳遞。
程序呼叫的細節也是自動處理:程式設計師不需要去將參數從call stack中來回移動。
程式設計師可以以簡單的while與for關鍵字來控制迴圈結構;編譯器會自動產生細部的指令來確定迴圈能夠正常運作。
系統程式語言的每一行程式碼都可能會編譯成五行左右的機械指令,而組合語言則是一行程式碼對應一行機械指令(一個非正式的分析顯示:由五個不同的程式設計師撰寫的八個C語言原始檔,其程式碼對機械指令的比例範圍是從3~7倍;Capers Jones在研究許多不同的語言後發現一樣的工作,以組合語言寫成的程式長度是系統程式語言的3~6倍)。 不管用什麼語言,程式設計師每年能寫的程式碼長度幾乎都是一個定數,因此使用系統程式語言能夠比使用組合語言更有效率地開發程式。
第二個組合語言與系統程式語言間的差異就是資料型態的控管。「資料型態」指的是每一項資料的類型在使用前就已經被指定。在一個資料型態控管嚴謹的程式中,程式設計師必須為每一項變數宣告資料型態來防止資料處理上可能發生的違規行為。而一個沒有什麼資料型態控管的語言中,資料型態不需要提前宣告:這代表資料的型態是被其之後的使用方式所定義的。
現今的電腦記憶體的預設幾乎沒有所謂的資料型態:任何被儲存的單字都可以儲存其他類型的資料,不管事整數、浮點數、指標、或是一整串指令都可以。 一個數值的型態是由使用的方式定義的:如果程式指向一串資料則資料會被當作程式碼去執行;如果資料是用在一項加減數學運算中則會以整數的方式呈現,依次類推。同樣的資料可以在不同的情況下有不同的型態。
相較之下,現今的系統程式語言則有十分嚴謹的資料型態控管:
所有的變數必須宣告成一種特定的資料型態,如整數、字串指標,這些變數必須依照本身被指定的資料型態去運作。
資料與程式碼是分開的:很難去即時產生新的程式碼,不,應該說是不可能的。
變數可以透過程式的操作成為一個資料結構或是物件的一部分;一個特定類別的指標不能夠儲存不同類別的物件。
資料型態控管有一些好處:第一,先定義好型態的變數,讓龐大的程式比較易於管理和閱讀。第二,編譯器可以用資料型態來偵測一些可能發生的邏輯錯誤,如將浮點數轉為指標。第三,資料型態使得編譯器能夠產生各別資料型態的機械指令,進而讓程式有更佳的執行效率,舉例說明:如果編譯器不知道一個變數的資料型態,他必須產生額外的機械指令來在程式執行時期對變數進行檢查;反之,如果編譯器已經知道一個變數只能儲存整數,則可以省略這段多餘的指令。 在這邊做個結尾,系統程式語言的目的是取代組合語言的角色,多半指的是開發新的程式。系統程式語言多半是高階語言而且擁有比組合語言更嚴謹的資料型態管理。雖然程式執行的效率略遜於組合語言程式,但是其開發程式的效率和方便性則是有長足的進步。
3 Scripting語言
Scripting語言如Perl、Python、Rexx、Tcl、Visual Basic與Unix Shells呈現一種與系統程式與言非常不同的程式設計方式。Scripting語言通常假設運作環境中已經有許多其他語言撰寫的元件可以使用,由此可見其目的並不在於「無中生有」,而是將不同的元件進行整合來完成工作。舉例:Tcl與Visual Basic能夠用來重新組合螢幕上的使用者介面控制、Unix Shell Scripts則是用來組合filter程式成為pipeline。Scripting語言常常被作為延伸元件功能的工具,但是他們很少會將原有的演算法與資料結構複雜化,因為演算法和資料結構是元件本身具有的功能。因此,Scripting語言又能夠被稱作「黏著語言」或是「系統整合語言」。 為了要簡化元件聯結的工作,Scripting語言的資料型態選擇非常的簡單,因此數值能夠很容易的被儲存和轉換。舉例:Tcl與Visual Basic中的變數能夠儲存字串但是也能夠儲存整數值。程式碼和資料也能夠很方便的相互轉換,因此能夠在程式執行時期迅速的組合並且執行新的程式碼。Scripting 語言多半是以文字處理為主,因此能夠使用字串來儲存許多不同的數值。
一個資料型態控管較鬆散的語言比較容易連結元件,因為所有的變數一開始並沒有強制限定其資料型態,因此所有的元件和數值都是以統一的方式表示,而不特意去區分其型態;這種特性帶來最大的好處就是元件和數值可以很方便的被儲存或被使用;元件可以被拿來執行原設計師完全沒有預料過的工作。舉例:在Unix Shell中,所有的filter軟體都是讀取一個位元組的串流,然後再輸出一個修改過的串流,任何兩個程式都能夠被連結:做法很簡單,只要將一個程式的輸出連到另一個程式的輸入即可。接下來這一段Shell指令將三個filter排列在一起來計算含有「scripting」字樣的一段文字有幾行:
select | grep scripting | wc
Select 程式會讀入螢幕上選取的文字並且輸出這段文字;而grep程式則會輸出所有輸入內含有「scripting」字樣的行列。而wc程式則會計算總共被輸出的多少行。此例中的每一個程式在不同的情況下能完成不同的工作。
由於系統程式語言有著嚴謹的資料型態控管,因此他們並不適合將程式中已經使用過的變數再次利用。資料型態指定促使程式設計師創造多種不相容的介面(帶來的隱藏訊息是「介面很棒,而且越多越好」)。 每個介面都需要特定型態的物件,而編譯器也會禁止任何不同型態的物件與該介面共用。如果要解決問題,程式設計師必須額外撰寫轉換函式來將不同的型態的物件做轉換。這也代表部分或是整個程式必須被重新編譯,但這在多數情況下而言是不可能的,因為程式都是以二位元碼的方式分享。 以下的Tcl 指令充分的顯示出不指定資料型態的好處:
button .b -text Hello! -font {Times 16} -command {puts hello}
這段指令會創造一個按鈕元件,按鈕上顯示一段字串,字型大小為16-point,字體為Times。當使用者按下這個按鈕,程式會發出一個簡短的訊息。這簡單的指令中混合了六種不同的元素:指令名稱(button)、一個按鈕控制項(.b)、名稱(-text ..
訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容