1. 程式人生 > >弱類型、強類型、動態類型、靜態類型語言的區別

弱類型、強類型、動態類型、靜態類型語言的區別

ble cal 學術界 ... 技術 perl 設計時 討論 行為

作者:rainoftime
鏈接:https://www.zhihu.com/question/19918532/answer/21647195
來源:知乎

類型系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。1. 先定義一些基礎概念Program Errorstrapped errors。導致程序終止執行,如除0,Java中數組越界訪問untrapped errors。 出錯後繼續執行,但可能出現任意行為。如C裏的緩沖區溢出、Jump到錯誤地址Forbidden Behaviours 語言設計時,可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.Well behaved、ill behavedwell behaved: 如果程序執行不可能出現forbidden behaviors, 則為well behaved。ill behaved: 否則為ill behaved...2. 有了上面的概念,再討論強、弱類型,靜態、動態類型強、弱類型強類型strongly typed: 如果一種語言的所有程序都是well behaved——即不可能出現forbidden behaviors,則該語言為strongly typed。弱類型weakly typed: 否則為weakly typed。比如C語言的緩沖區溢出,屬於trapped errors,即屬於forbidden behaviors..故C是弱類型前面的人也說了,弱類型語言,類型檢查更不嚴格,如偏向於容忍隱式類型轉換。譬如說C語言的int可以變成double。 這樣的結果是:容易產生forbidden behaviours,所以是弱類型的動態、靜態類型靜態類型 statically: 如果在編譯時拒絕ill behaved程序,則是statically typed;動態類型dynamiclly: 如果在運行時拒絕ill behaviors, 則是dynamiclly typed。3. 誤區大家覺得C語言要寫int a, int b之類的,Python不用寫(可以直接寫a, b),所以C是靜態,Python是動態。這麽理解是不夠準確的。譬如Ocaml是靜態類型的,但是也可以不用明確地寫出來。。Ocaml是靜態隱式類型靜態類型可以分為兩種:如果類型是語言語法的一部分,在是explicitly typed顯式類型;如果類型通過編譯時推導,是implicity typed隱式類型, 比如ML和Haskell4.下面是些例子無類型: 匯編弱類型、靜態類型 : C/C++弱類型、動態類型檢查: Perl/PHP強類型、靜態類型檢查 :Java/C#強類型、動態類型檢查 :Python, Scheme靜態顯式類型 :Java/C靜態隱式類型 :Ocaml, Haskell

技術分享圖片

弱類型、強類型、動態類型、靜態類型語言的區別