靜態語言的優點是可避免執行時期型態錯誤、提供重構輔助與更多的文件形式。

靜態語言明確要求程式中提供型態資訊,因而可透過編譯器或工具,在 程式設計 執行前(編譯時期)就檢查出型態錯誤。例如底下的Java範例:

void doQuack(Duck duck) { // 可傳入什麼?duck 可作什麼? }

在實作doQuack()方法時,若嘗試透過duck變數操作Duck沒有定義的方法或屬性,或者呼叫doQuack()方法時傳入非Duck物 件,都會引發編譯錯誤。由於變數本身帶有型態資訊,可據此為基礎來設計相關重構時的輔助操作,例如提取方法(Extract method)時,根據提取的程式設計片段前後文資訊,在自動產生的方法中建立對應型態的參數與傳回型態。

型態資訊也可作為一種文件形式。以上例來說,在沒有揭露doQuack()方法的實作內容下,doQuack()使用者可從參數型態明確得知 doQuack()方法接受Duck實例,doQuack()實作者亦可查閱Duck的API文件,可得知傳入物件的可操作方法或屬性,如果有個方法接受 多個引數,從參數的型態也可得知呼叫方法時引數的傳入順序;另一種文件形式則可透過工具來達成,例如在編輯器中顯示Duck可用方法清單與相關文件檢索資 訊。

靜態語言的缺點是程式語法繁瑣、彈性不足,只能檢查出執行時期前的簡單錯誤。

由於變數在宣告時必須指定型態資訊,使得程式碼撰寫起來特別囉嗦。有些靜態語言可使用類型推論來解決語法繁瑣問題,先前的Scala示範就是一例,然而開發者必須熟悉語言的類型推論框架,這又容易造成語法複雜或程式設計維護上的額外負擔。

靜態語言另一個問題就是較缺乏彈性。例如Java陣列元素必須是同種型態,若陣列中要放置異質元素,必須有類別繼承或介面實作的型態關係。例如:

Object[] person = {1, "programmer", new Date()};

這利用到Java中Object類別為所有物件父類別,以解決異質陣列問題,然而要操作特定型態時就得進行轉型,這又造成囉嗦的語法。例如:

Integer id = (Integer) person[0];

雖然靜態語言可於執行程式設計前檢查出型態錯誤,但沒有辦法檢查執行時期問題,單元測試依舊是必要的,這也是靜態語言反對者常持有的論調:「既然都要依賴更全面性的單元測試,為何要忍受靜態語言帶來的困擾?」

 


轉貼來源:IT專欄 - 林信良

 http://www.piece2ec.com.tw/news.asp?ID=883


參考文獻:

1.陳會安,2002,Java2 程式設計範例教本,台北:學貫行銷股份有限公司。

2.黃中杰,2002,JAVA 與XML 技術手冊,台北:碁峰資訊股份有限公司。

3.楊宗誌,2002,JBuildert 程式設計實務,台北:文魁資訊股份有限公司。

 

 

 

 

網站設計

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 巨群資訊 的頭像
    巨群資訊

    巨群資訊

    巨群資訊 發表在 痞客邦 留言(0) 人氣()