類型系統(tǒng)的一些概念陶冷,眾說紛紜,使用上也比較亂毯辅。有些東西埂伦,甚至不好嚴(yán)格定義。以下算學(xué)術(shù)界的一種相對“嚴(yán)格”的說法思恐。
1. 先定義一些基礎(chǔ)概念
Program Error
strapped errors沾谜。導(dǎo)致程序終止執(zhí)行,如除0胀莹,Java中數(shù)組越界訪問
untrapped errors基跑。 出錯后繼續(xù)執(zhí)行,但可能出現(xiàn)任意行為描焰。如C里的緩沖區(qū)溢出媳否、Jump到錯誤地址
Forbidden Behaviours
語言設(shè)計時,可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.
Well behaved荆秦、ill behavedwell
- behaved: 如果程序執(zhí)行不可能出現(xiàn)forbidden behaviors, 則為well behaved篱竭。
- ill behaved: 否則為ill behaved...
2. 有了上面的概念,再討論強(qiáng)步绸、弱類型掺逼,靜態(tài)、動態(tài)類型
強(qiáng)瓤介、弱類型
強(qiáng)類型strongly typed: 如果一種語言的所有程序都是well behaved——即不可能出現(xiàn)forbidden behaviors坪圾,則該語言為strongly typed晓折。
弱類型weakly typed: 否則為weakly typed。比如C語言的緩沖區(qū)溢出兽泄,屬于trapped errors漓概,即屬于forbidden behaviors..故C是弱類型
前面的人也說了,弱類型語言病梢,類型檢查更不嚴(yán)格胃珍,如偏向于容忍隱式類型轉(zhuǎn)換。譬如說C語言的int可以變成double蜓陌。 這樣的結(jié)果是:容易產(chǎn)生forbidden behaviours觅彰,所以是弱類型的
靜態(tài)類型 statically: 如果在編譯時拒絕ill behaved程序,則是statically typed;
動態(tài)類型dynamiclly: 如果在運(yùn)行時拒絕ill behaviors, 則是dynamiclly typed钮热。
3. 誤區(qū)
大家覺得C語言要寫int a, int b之類的填抬,Python不用寫(可以直接寫a, b),所以C是靜態(tài)隧期,Python是動態(tài)飒责。這么理解是不夠準(zhǔn)確的。譬如Ocaml是靜態(tài)類型的仆潮,但是也可以不用明確地寫出來宏蛉。。Ocaml是靜態(tài)隱式類型
靜態(tài)類型可以分為兩種:如果類型是語言語法的一部分性置,在是explicitly typed顯式類型拾并;
如果類型通過編譯時推導(dǎo),是implicity typed隱式類型, 比如ML和Haskell
4.下面是些例子
- 無類型: 匯編
- 弱類型鹏浅、靜態(tài)類型 : C/C++
- 弱類型嗅义、動態(tài)類型檢查: Perl/PHP
- 強(qiáng)類型、靜態(tài)類型檢查 :Java/C#
- 強(qiáng)類型隐砸、動態(tài)類型檢查 :Python, Scheme
- 靜態(tài)顯式類型 :Java/C
- 靜態(tài)隱式類型 :Ocaml, Haskell