類型系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。
首先了解一下基本概念
Program Errors
- trapped errors。導致程序終止執行,如除0,Java中數組越界訪問
- untrapped errors。 出錯后繼續執行,但可能出現任意行為。如C里的緩沖區溢出、Jump到錯誤地址
Forbidden Behaviours
語言設計時,可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.
Well behaved、ill behaved
- well behaved: 如果程序執行不可能出現forbidden behaviors, 則為well behaved。
- ill behaved: 否則為ill behaved...
有了上面的概念,再討論強、弱類型,靜態、動態類型
強、弱類型
- 強類型strongly typed: 如果一種語言的所有程序都是well behaved——即不可能出現forbidden behaviors,則該語言為strongly typed。
- 弱類型weakly typed: 否則為weakly typed。比如C語言的緩沖區溢出,屬於trapped errors,即屬於forbidden behaviors..故C是弱類型
偏向於不容忍隱式類型轉換,弱類型相對於強類型來說類型檢查更不嚴格,比如說允許變量類型的隱式轉換,允許強制類型轉換等等。強類型語言一般不允許這么做。
弱類型
> "1"+2 '12'
強類型
>>> "1"+2 Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: cannot concatenate 'str' and 'int' objects
動態、靜態類型
- 靜態類型 statically: 如果在編譯時拒絕ill behaved程序,則是statically typed;
- 動態類型dynamiclly: 如果在運行時拒絕ill behaviors, 則是dynamiclly typed。
其中靜態類型可以分為兩種:
- 如果類型是語言語法的一部分,在是explicitly typed顯式類型,比如java和c;
- 如果類型通過編譯時推導,是implicity typed隱式類型, 比如ML和Haskell
簡單地說,就是在聲明了一個變量之后,不能改變它的類型的語言,是靜態語言;能夠隨時改變它的類型的語言,是動態語言。因為動態語言的特性,一般需要運行時虛擬機支持。
動態類型
>>> a = 1 >>> type(a) <type 'int'> >>> a = "s" >>> type(a) <type 'str'>
靜態類型
Prelude> let a = "123" :: Int <interactive>:2:9: Couldn't match expected type `Int' with actual type `[Char]' In the expression: "123" :: Int In an equation for `a': a = "123" :: Int
下面是些例子

附上wiki完整的類型系統對比表格: