編程語言的強類型、弱類型

大多數情況下,人們用編程語言是否會隱式地轉換數據類型來判斷一門語言是否為弱類型語言,比如 C。

而實際上,對於除了比較經典的語言外,大部分人對於其他常見語言的強、弱類型是分不清楚的——或者說,是不一致的。因此總會有人來爭論它。如果我們以開篇的概念來作為基礎,那麼矛盾就會顯現:

比如 Pascal 曾計劃作為強類型語言,但整體上卻給類型系統引入了一個漏洞,所以技術上來講它是弱類型的。

那麼到底什麼才是強類型,什麼才是弱類型呢?我無法回答你,因為業界本身就沒有對它進行一個完整的定義。所以如果你用強類型語言還是弱類型語言來區分之,是相當不准確的。——因為你無法解釋清楚究竟什麼才是強類型什麼才是弱類型。

大多數情況下,我們用類型安全、內存安全動態類型檢查靜態類型檢查來定義語言——這樣就明確多了。

其實大多數情況下,我們對強弱類型的理解是不同的,大部分人會按照開篇的概念來理解,但有時候也會有其他的想法——這是很正常的,因為這個定義本身就不是嚴格的技術定義。所以由於一開始我並沒有深究這個問題,導致我以“弱類型”來描述了 Swift 語言,而實際上按照我們的普遍定義,它應當是強類型語言——因為它並不能隱式轉換數據類型。

但是說它是弱類型就一定不對嗎?按照我“小眾”的定義,弱類型指的是在聲明的時候不需要顯式地寫出值類型,比如大部分情況下,Swift 有類型推斷可以依賴。所以以此同理,我會認為 C 語言是強類型語言。

你可能覺得很可笑,但是我仍舊厚著臉皮說我是對的,因為對於弱類型的定義只有普遍的理解而並沒有嚴格的定義。

但同樣,我也說明了 Swift 是類型安全的語言,這一點是正確的。

混淆

說起類型安全,你可能就會看到,大部分人用強類型來指代類型安全,他們說 Swift 是強類型語言的時候,其實就是在說:Swift 是一門類型安全的語言。——因為大部分情況下,類型安全的表現和強類型的表現差不多——比如不能隱式地轉換值的類型。

但這裡我還要講,當我們討論一門語言是靜態類型語言還是動態類型語言的時候,又會有不少人說靜態類型語言是強類型語言,因為它的行為也符合強類型的定義。

你看,如果我們說一個語言是強類型語言,那麼它是類型安全的呢?還是說它是靜態類型語言呢?或者兩者都有?

還是說典型的C、C艹,說它是強類型語言,因為它是靜態語言,有些人說不是,因為它不是類型安全的;比如說流行的 Python,它是弱類型語言,因為它不是靜態類型語言對吧?可是有人就要反對了:Python 不允許類型隱式轉換啊它其實是強類型!

所以我們應當避免用強弱來區分編程語言的行為,你這麼做,並不能給聽眾帶來多少益處,恐怕唯一的作用就是讓初學者更加糊塗。

延伸閱讀

什麼是強類型語言和靜態類型語言之間的差異?

強類型

由...出版 R0uter

如非聲明,本人所著文章均為原創手打,轉載請註明本頁面鏈接和我的名字。

加入對話

17 註釋

您的電子郵件地址不會被公開. 必填字段標 *