強類型,弱類型,靜態類型,動態類型的區別

類型系統的一些概念,衆說紛紜,使用上也比較亂。有些東西,甚至很差嚴格定義。如下算學術界的一種相對「嚴格」的說法。java

 

首先了解一下基本概念express

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...

有了上面的概念,再討論強、弱類型,靜態、動態類型bash

強、弱類型

  • 強類型strongly typed: 若是一種語言的全部程序都是well behaved——即不可能出現forbidden behaviors,則該語言爲strongly typed。
  • 弱類型weakly typed: 不然爲weakly typed。好比C語言的緩衝區溢出,屬於trapped errors,即屬於forbidden behaviors..故C是弱類型

偏向於不容忍隱式類型轉換,弱類型相對於強類型來講類型檢查更不嚴格,好比說容許變量類型的隱式轉換,容許強制類型轉換等等。強類型語言通常不容許這麼作。app

弱類型設計

> "1"+2
'12'

強類型blog

>>> "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。

其中靜態類型能夠分爲兩種:ip

  • 若是類型是語言語法的一部分,在是explicitly typed顯式類型,好比java和c;
  • 若是類型經過編譯時推導,是implicity typed隱式類型, 好比ML和Haskell

簡單地說,就是在聲明瞭一個變量以後,不能改變它的類型的語言,是靜態語言;可以隨時改變它的類型的語言,是動態語言。由於動態語言的特性,通常須要運行時虛擬機支持。ci

動態類型get

>>> 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完整的類型系統對比表格:
相關文章
相關標籤/搜索