二者名稱相似、重疊度高,但無必然聯繫:Scala 是動態語言卻屬靜態類型;VB(非 VB.NET)支援動態類型卻是靜態語言。必須區分「語言分類」與「類型系統」。
包含兩要素:允許取值集合、允許參與運算。既有針對機器的物理意義(記憶體分配、數值運算),又有針對人的邏輯意義(表達高層概念、提高抽象性、保證安全性)。
類比法律原則:靜態類似「疑罪從有」的有罪推定制,動態類似「疑罪從無」的無罪推定制。取捨原則:「Static Typing Where Possible, Dynamic Typing When Needed」——盡可能守規則,必要時求變通。「規則如褲帶,過寬過緊都不好。」
「若會走鴨步、會呱呱叫,何妨視作鴨子?」Ruby 代碼示範:Duck、Frog 只要有 shout、swim 方法即可被 shoutAndSwim 接受,無需共同繼承樹或顯式介面。C++ 模板雖可實現類似功能,但無法處理「雞只會叫、魚只會游」的動態分派情況。優點:利於代碼重用;陷阱:隱性介面組合易誤用、維護者易破壞客戶代碼、可能濫用(輪船也開進池塘)。
動靜由綁定時間劃分,強弱由約束強度劃分,兩者正交。弱類型允許隱性類型轉換(1+"2" 在 VB=3、JS="12"、C=地址運算),易藏污納垢;強類型嚴格類型控制,一般不允許隱性轉換,需顯式鑄型。類型安全語言能完全避免類型錯誤,強類型通常類型安全,弱類型通常不安全。但「水至清則無魚」,過度嚴苛會失去活力。
