弱类型、强类型、动态类型、静态类型语言的区别
類型系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。
首先了解一下基本概念
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是弱類型
弱類型語言,類型檢查更不嚴格,如偏向于容忍隱式類型轉換。
譬如說C語言的int可以變成double。 這樣的結果是:容易產生forbidden behaviours,所以是弱類型的
弱類型
> "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
靜態類型,編譯的時候就知道每一個變量的類型,因為類型錯誤而不能做的事情是語法錯誤。
動態類型,編譯的時候不知道每一個變量的類型,因為類型錯誤而不能做的事情是運行時錯誤。
靜態類型指的是編譯器在compile time執行類型檢查,動態類型指的是編譯器(虛擬機)在runtime執行類型檢查。簡單地說,就是在聲明了一個變量之后,不能改變它的類型的語言,是靜態語言;能夠隨時改變它的類型的語言,是動態語言。因為動態語言的特性,一般需要運行時虛擬機支持。
靜態類型更適合構建大型應用( ? )
- 靜態類型檢查可以做到early fail,即你編寫的代碼即使沒有被執行到,一旦你編寫代碼時發生類型不匹配,語言在編譯階段(解釋執行也一樣,可以在運行前)即可發現。
- 靜態類型對閱讀代碼是友好的。對于復雜的應用,靜態類型就是非常重要的提示和約束。
這也是TypeScript(添加了可選的靜態類型和基于類的面向對象編程)為什么要使用的部分原因了
動態類型
>>> 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" :: IntIn an equation for `a': a = "123" :: Int附圖:
轉載于:https://www.cnblogs.com/xiongxiaolong/p/10179790.html
總結
以上是生活随笔為你收集整理的弱类型、强类型、动态类型、静态类型语言的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux下安装mysql-5.6.41
- 下一篇: UNIX域套接字