今天給大家分享下,我們常見卻不一定清楚的名詞:
先上個圖
我們看這個圖,是一個語言坐標系,分別按編程語言的性質粗分為四個軸:動態、靜態、強類型、弱類型。像筆者使用的Javascript就屬於弱類型動態語言。
那么,我們思考,這么多的編程語言有這么多的性質,它們之間存在怎樣的差異呢?
經過一番Google & Baidu后,筆者得出了答案,即為今天的總結:
In a word: 強/弱類型指的是語言類型系統的類型檢查的嚴格程度。動態/靜態類型指的是變量與類型的綁定方法。
強/弱類型
- 強類型 (strongly typed) : 如果一種語言的所有程序都是 well behaved——即不可能出現 forbidden behaviors,則該語言為 strongly typed。
- 弱類型 (weakly typed) : 否則為 weakly typed。比如C語言的緩沖區溢出,屬於 trapped errors,即屬於 forbidden behaviors.. 故C是弱類型。
強類型語言一般不允許這么做。
動態/靜態類型
- 靜態類型 (statically) : 如果在編譯時拒絕ill behaved 程序,則是 statically typed;
- 動態類型 (dynamiclly) : 如果在運行時拒絕ill behaviors, 則是 dynamiclly typed。
靜態類型指的是編譯器在 compile time 執行類型檢查,動態類型指的是編譯器(虛擬機)在 runtime 執行類型檢查。
最后,我們得出結論:
在聲明了一個變量之后,不能改變它的類型的語言,是靜態語言;
能夠隨時改變它的類型的語言,是動態語言。
因為動態語言的特性,一般需要運行時虛擬機支持。
(PS:引用輪子哥的總結:
強類型:偏向於不容忍隱式類型轉換。譬如說haskell的int就不能變成double
弱類型:偏向於容忍隱式類型轉換。譬如說C語言的int可以變成double
靜態類型:編譯的時候就知道每一個變量的類型,因為類型錯誤而不能做的事情是語法錯誤。
動態類型:編譯的時候不知道每一個變量的類型,因為類型錯誤而不能做的事情是運行時錯誤。譬如說你不能對一個數字a寫a[10]當數組用。)