動態語言的優點是語法簡潔、具有較高的彈性。
動態語言的變數在使用者不需要指定型態資訊,最直接效益就是節省打字的功夫。例如Python在宣告函式時就簡潔許多:
def doquack(duck):
duck.quack()
相較於靜態語言來說,著實簡潔許多。開發者操作變數時也無需思考型態問題,只要思考變數參考的物件擁有哪些行為,也是動態語言界流行的鴨子型態 (Duck typing),這樣的特性在日後較易應付事先沒有設想到的型態,例如doquack()一開始是設計給Duck型態的物件使用,若有個物件不是Duck 型態,但確實擁有quack()方法,那麼要使用doquack()呱呱叫一下也是可以的。語言簡潔與彈性的例子,也可以在底下範例中看出:
person = [1, 'programmer', datetime.now()]
id = person[0]
list中可以是各種物件,將list中的物件指定給變數也沒有轉型的問題。
動態語言的缺點是型態錯誤在執行時期才會呈現出來,效能表現較不理想,編輯輔助工具較為缺乏,依賴慣例或實體文件來得知API使用方式。
靜態語言是在 程式設計 編譯為可執行形式的過程中檢查型態錯誤,動態語言則常採邊剖析邊執行的方式,型態錯誤的程式設計在執行時期才會發現,以doquack()為例,若 human參考的物件並沒有quack()方法,那doquack(human)的呼叫,得在執行時期才發現沒有quack()行為的錯誤。動態語言若要 發掘出型態錯誤,得依賴覆蓋率更全面的單元測試。由於採邊剖析邊執行的方式,執行時期檢查型態必然造成效能負擔。
由於沒有型態資訊,編輯上的輔助或重構工具通常不足。例如:
# 可以傳入什麼物件?
def dosome(x, y):
x.? # 有哪些行為?y.? # 有哪些行為?
只從這個函式定義,編輯工具無從得知x、y有哪些方法或屬性可以操作,也就無法作出提示。dosoome()呼叫者又怎麼知道傳遞的引數順序呢?或是x、 y參考的物件得具有哪些方法?動態語言界常使用命名慣例作為補救,例如x也許慣例上都接受X型態,而y慣例上都接受Y型態,然而通常還是得查詢文件才能瞭 解使用細節。
信任型態約束或慣例約束
從信任的角度來看,選擇靜態語言代表信任它會檢查出開發者可能犯下的型態錯誤,由於型態帶來的約束是強制遵守且不能有例外,對成員來自不同文化或水準不一 的團隊而言,靜態語言在語法層面採用型態作為約束工具,對型態錯誤的發掘有一定的保障作用;相反地,選擇動態語言代表採用慣例作為約束工具,相信開發者會 為自己的程式負責,因而將行為交由物件本身擁有,對於成員有著一致默契、水準與文化的團隊而言,選擇動態語言可獲得較大的彈性來面對需求。
轉貼來源:IT專欄 - 林信良
http://www.piece2ec.com.tw/news.asp?ID=884
參考文獻:
1.王大維,2002,台灣工商業可延伸企業報告語言分類標準之建立,國立台灣大學會計研究所未出版碩士論文。
2.位元文化,2002,XML 技術實務,台北:文魁資訊股份有限公司。
3.林宥吟,2002,延伸性企業報告語言之產業應用-以資產管理產業為例,私立中原大學會計系碩士班未出版論文。