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


類型系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。

 

首先了解一下基本概念

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完整的類型系統對比表格:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM