編程語言類型
(一)編譯型和解釋型
計算機不能直接理解高級語言,僅僅能直接理解機器語言,所以必需要把高級語言翻譯成機器語言,計算機才干運行高級語言編寫的程序。翻譯的方式有兩種,一個是編譯,一個是解釋。
編譯型語言寫的程序執行之前,已經把程序編譯好了,比方exe文件,以后要執行的話就不用又一次翻譯了。直接使用編譯的結果即可了(exe文件),由于翻譯僅僅做了一次,執行時不須要翻譯,所以編譯型語言的程序執行效率高。
解釋性語言的程序在執行程序的時候才翻譯,邊執行邊翻譯。
這樣解釋性語言每執行一次就要翻譯一次。效率比較低。
用一個樣例類比下,比方一個人讀一本外語書。他能夠選擇直接讀別人翻譯好的(編譯型),或者讓別人一句句讀給他聽(解釋型)。翻譯好的譯文隨時能夠再讀,請別人讀每一個章節都須要又一次讀一次。
(二)動態語言和靜態語言
動態類型語言:在執行期間檢查數據的類型的語言。
用這類語言編程,不會給變量指定類型,而是在附值時得到數據類型。
靜態類型語言:相反靜態類型語言是在執行前編譯時檢查類型。在寫代碼時。沒聲明一個變量必須指定類型。
動態類型語言如JS
return a+b;
}
add(1,2);
add(‘1’,2);
public int add(int a,int b){
return a+b;
}
(三)強類型定義語言和弱類型定義語言
強類型定義語言:強制數據類型定義的語言。
也就是說,一旦一個變量被指定了某個數據類型,假設不經過強制轉換。那么它就永遠是這個數據類型了。舉個樣例:假設你定義了一個整型變量a,那么程序根本不可能將a當作字符串類型處理。
強類型定義語言是類型安全的語言,如Java。
弱類型定義語言:數據類型能夠被忽略的語言。它與強類型定義語言相反, 一個變量能夠賦不同數據類型的值。如JS。
弱類型、強類型、動態類型、靜態類型語言的區別
類型系統的一些概念,眾說紛紜,使用上也比較亂。有些東西,甚至不好嚴格定義。以下算學術界的一種相對“嚴格”的說法。
1. 先定義一些基礎概念
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.。。
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和Haskell
4.下面是些例子
無類型: 匯編
弱類型、靜態類型 : C/C++
弱類型、動態類型檢查: Perl/PHP
強類型、靜態類型檢查 :Java/C#
強類型、動態類型檢查 :Python, Scheme
靜態顯式類型 :Java/C
靜態隱式類型 :Ocaml, Haskell
評論
查看更多