動態語言與靜態?直譯與編譯?強型別與弱型別?



(2021/06/18) 更新
 靜態語言的定義是能在編譯時期確認與檢查型別,在執行的時候不能改變結構,而動態語言則是在執行時確認與檢查型別,也能在執行時改變結構,例如:建立新方法或新屬性。

舉個例子,使用某物件呼叫doSomething(),如果在編譯時就會告訴我們,這物件沒有doSomething()這方法,這就是靜態語言,如果到了執行時才發生沒有該方法的錯誤就是動態語言。

靜態類型又分兩種,一種直接設定的是顯式類型如:String something = "something"
另一種透過類型推導的為隱式類型如:var something = "something"
後者的好處是在改變行型別不需要修改這個值傳遞過的所有方法,算是吸收了動態語言的優點,也保留靜態語言的型別檢查。

而直譯與編譯就比較好理解,有透過編譯器跟只透過直譯器的差別,而通常有編譯器的多半是靜態語言而只有直譯器的多半都是動態語言,但為了滿足更多方向的需求,動態語言也會使用編譯器來編譯(速度優化、語言轉換需求)、靜態語言也會有使用直譯器來解釋的情形(REPL需求)。

而弱型別與強型別又有什麼不同呢?
強型別的語言會拒絕隱性的型別轉換如:
var string = "3";
var number = 2 + string;
在Java中就會顯示錯誤
而在弱型別的JavaSctipt中就會顯示23,它幫我們把2轉為字串了,雖然在這個例子當中,看起來這個功能好像很方便,但在實際開發中很容易遇到出乎意料的自動轉型所導致的程式錯誤,所以就易開發、可維護性這件事情上來說,我個人會偏好選擇靜態、強型別的語言來當作開發工具。

參考
弱类型、强类型、动态类型、静态类型语言的区别是什么?

最後希望你帶走知識的同時,也能留下短短一兩句的心得與我們分享或是幫我們按下+1並分享到FB

留言

  1. 你好:
    剛好最近對 "用到直譯器的語言都是動態語言?" 感到好奇
    來找到這篇文章

    文章內你提到這段話 "只有直譯器的都是動態語言"
    我原本的認知也是這樣

    但是 php compiler 的作者說
    https://stackoverflow.com/questions/1393883/why-is-dynamic-typing-so-often-associated-with-interpreted-languages

    供你參考

    回覆刪除

張貼留言

有什麼想法歡迎跟我們分享