冒號開宗明義:二者「有親戚之名,無血緣之親」。動態語言不一定是動態類型,反之亦然。數據類型包含「允許取值集合」與「允許參與運算」兩要素。類型檢查時間劃分:靜態類型在「運行前」(非必然編譯期),動態類型在「運行期」。
靜態類型不一定需顯式聲明。ML、Haskell 等函數式語言編譯器可透過上下文進行「類型推斷」。動態類型優勢在簡明快捷、天然泛型,引出「鴨子類型」:會走鴨步、會呱呱叫,便視作鴨子。Ruby 代碼示範:`shoutAndSwim` 接受任何有 `shout`、`swim` 方法的對象,無需繼承關係。C++ 模板雖能類似,但編譯期檢查更嚴格(雞無 `swim`、魚無 `shout` 會編譯失敗),動態語言僅在運行期調用缺失方法才報錯。
利於復用,但隱性介面組合要求使用者更小心避免誤用,維護者更小心避免破壞客戶代碼,且可能濫用(輪船混入鴨群)。
靜態類型:編譯期檢查增強可靠性、編譯器優化效能、節省運行期檢查時間、聲明即文檔。冒號以法律原則類比:靜態似「疑罪從有」的有罪推定(證明合法前非法),動態似「疑罪從無」的無罪推定(證明非法前合法)。取捨原則:「Static Typing Where Possible, Dynamic Typing When Needed」。
動靜與強弱是正交概念。弱類型允許隱性轉換(VB `1+"2"=3`,JS `1+"2"="12"`,C 視字串為地址運算),強類型禁止。強類型通常類型安全,弱類型通常不安全。但劃分多為定性描述,無統一定義。理解這些有助日後學習。