編程語(yǔ)言類型
(一)編譯型和解釋型
計(jì)算機(jī)不能直接理解高級(jí)語(yǔ)言,僅僅能直接理解機(jī)器語(yǔ)言,所以必需要把高級(jí)語(yǔ)言翻譯成機(jī)器語(yǔ)言,計(jì)算機(jī)才干運(yùn)行高級(jí)語(yǔ)言編寫(xiě)的程序。翻譯的方式有兩種,一個(gè)是編譯,一個(gè)是解釋。
編譯型語(yǔ)言寫(xiě)的程序執(zhí)行之前,已經(jīng)把程序編譯好了,比方exe文件,以后要執(zhí)行的話就不用又一次翻譯了。直接使用編譯的結(jié)果即可了(exe文件),由于翻譯僅僅做了一次,執(zhí)行時(shí)不須要翻譯,所以編譯型語(yǔ)言的程序執(zhí)行效率高。
解釋性語(yǔ)言的程序在執(zhí)行程序的時(shí)候才翻譯,邊執(zhí)行邊翻譯。
這樣解釋性語(yǔ)言每執(zhí)行一次就要翻譯一次。效率比較低。
用一個(gè)樣例類比下,比方一個(gè)人讀一本外語(yǔ)書(shū)。他能夠選擇直接讀別人翻譯好的(編譯型),或者讓別人一句句讀給他聽(tīng)(解釋型)。翻譯好的譯文隨時(shí)能夠再讀,請(qǐng)別人讀每一個(gè)章節(jié)都須要又一次讀一次。
(二)動(dòng)態(tài)語(yǔ)言和靜態(tài)語(yǔ)言
動(dòng)態(tài)類型語(yǔ)言:在執(zhí)行期間檢查數(shù)據(jù)的類型的語(yǔ)言。
用這類語(yǔ)言編程,不會(huì)給變量指定類型,而是在附值時(shí)得到數(shù)據(jù)類型。
靜態(tài)類型語(yǔ)言:相反靜態(tài)類型語(yǔ)言是在執(zhí)行前編譯時(shí)檢查類型。在寫(xiě)代碼時(shí)。沒(méi)聲明一個(gè)變量必須指定類型。
動(dòng)態(tài)類型語(yǔ)言如JS
return a+b;
}
add(1,2);
add(‘1’,2);
靜態(tài)類型語(yǔ)言如C、C++、Java、C#等
public int add(int a,int b){
return a+b;
}
(三)強(qiáng)類型定義語(yǔ)言和弱類型定義語(yǔ)言
強(qiáng)類型定義語(yǔ)言:強(qiáng)制數(shù)據(jù)類型定義的語(yǔ)言。
也就是說(shuō),一旦一個(gè)變量被指定了某個(gè)數(shù)據(jù)類型,假設(shè)不經(jīng)過(guò)強(qiáng)制轉(zhuǎn)換。那么它就永遠(yuǎn)是這個(gè)數(shù)據(jù)類型了。舉個(gè)樣例:假設(shè)你定義了一個(gè)整型變量a,那么程序根本不可能將a當(dāng)作字符串類型處理。
強(qiáng)類型定義語(yǔ)言是類型安全的語(yǔ)言,如Java。
弱類型定義語(yǔ)言:數(shù)據(jù)類型能夠被忽略的語(yǔ)言。它與強(qiáng)類型定義語(yǔ)言相反, 一個(gè)變量能夠賦不同數(shù)據(jù)類型的值。如JS。
弱類型、強(qiáng)類型、動(dòng)態(tài)類型、靜態(tài)類型語(yǔ)言的區(qū)別
類型系統(tǒng)的一些概念,眾說(shuō)紛紜,使用上也比較亂。有些東西,甚至不好嚴(yán)格定義。以下算學(xué)術(shù)界的一種相對(duì)“嚴(yán)格”的說(shuō)法。
1. 先定義一些基礎(chǔ)概念
trapped errors。導(dǎo)致程序終止執(zhí)行,如除0,Java中數(shù)組越界訪問(wèn)
untrapped errors。 出錯(cuò)后繼續(xù)執(zhí)行,但可能出現(xiàn)任意行為。如C里的緩沖區(qū)溢出、Jump到錯(cuò)誤地址
Forbidden Behaviours
語(yǔ)言設(shè)計(jì)時(shí),可以定義一組forbidden behaviors. 它必須包括所有untrapped errors, 但可能包含trapped errors.
Well behaved、ill behaved
well behaved: 如果程序執(zhí)行不可能出現(xiàn)forbidden behaviors, 則為well behaved。
ill behaved: 否則為ill behaved.。。
2. 有了上面的概念,再討論強(qiáng)、弱類型,靜態(tài)、動(dòng)態(tài)類型
強(qiáng)、弱類型
強(qiáng)類型strongly typed: 如果一種語(yǔ)言的所有程序都是well behaved——即不可能出現(xiàn)forbidden behaviors,則該語(yǔ)言為strongly typed。
弱類型weakly typed: 否則為weakly typed。比如C語(yǔ)言的緩沖區(qū)溢出,屬于trapped errors,即屬于forbidden behaviors.。故C是弱類型
前面的人也說(shuō)了,弱類型語(yǔ)言,類型檢查更不嚴(yán)格,如偏向于容忍隱式類型轉(zhuǎn)換。譬如說(shuō)C語(yǔ)言的int可以變成double。 這樣的結(jié)果是:容易產(chǎn)生forbidden behaviours,所以是弱類型的
動(dòng)態(tài)、靜態(tài)類型
靜態(tài)類型 statically: 如果在編譯時(shí)拒絕ill behaved程序,則是statically typed;
動(dòng)態(tài)類型dynamiclly: 如果在運(yùn)行時(shí)拒絕ill behaviors, 則是dynamiclly typed。
3. 誤區(qū)
大家覺(jué)得C語(yǔ)言要寫(xiě)int a, int b之類的,Python不用寫(xiě)(可以直接寫(xiě)a, b),所以C是靜態(tài),Python是動(dòng)態(tài)。這么理解是不夠準(zhǔn)確的。譬如Ocaml是靜態(tài)類型的,但是也可以不用明確地寫(xiě)出來(lái)。。
Ocaml是靜態(tài)隱式類型
靜態(tài)類型可以分為兩種:
如果類型是語(yǔ)言語(yǔ)法的一部分,在是explicitly typed顯式類型;
如果類型通過(guò)編譯時(shí)推導(dǎo),是implicity typed隱式類型, 比如ML和Haskell
4.下面是些例子
無(wú)類型: 匯編
弱類型、靜態(tài)類型 : C/C++
弱類型、動(dòng)態(tài)類型檢查: Perl/PHP
強(qiáng)類型、靜態(tài)類型檢查 :Java/C#
強(qiáng)類型、動(dòng)態(tài)類型檢查 :Python, Scheme
靜態(tài)顯式類型 :Java/C
靜態(tài)隱式類型 :Ocaml, Haskell
評(píng)論
查看更多