常見語言分類

靜態語言和動態語言

先舉個例子,C語言:

float pi = 3.14159265;

JavaScript:

var str = "hello";
alert(str);//第一行之後,str就是是一個String類型了

比較這兩個方式。在C語言中,我們用float關鍵字定義了變量 pi,而JS並未使用這樣的方式。
C語言是一種靜態類型,在聲明期 | 編譯期就給定了變量的類型;在靜態類型語言中,類型是從屬於變量(變量改變類型需要類型聲明改變)。從聲明那一刻開始,變量只能被分配聲明類型的數據(給定的數據類型 | 類型轉換後的data)。那既然有這樣的需求,靜態語言會有一個編譯期用於類型檢測,這樣就會產生編譯期運行期兩個時期。
一些常見的靜態類型語言: C++, C#, Java, Basic, Pascal, Ada 和 Fortran。

JavaScript語言是一種動態類型,變量類型可以在運行期間改變;在動態類型語言中,類型是從屬於數據(數據類型改變影響了類型改變)。變量名只是指向了數據,他們可以在任何時刻指向任何類型的數據。既然不需要類型檢測,那麼,也就不需要區分編譯期運行期
一些常見的動態類型語言: 大部分腳本語言和快速原型開發語言,例如,Javascript, Lisp, PHP, Python, Ruby, Scheme 等等。

強類型與弱類型

強弱類型的概念沒有動態和靜態類型語言的區分那麼清晰。一個最常見的定義方式:是否允許不相同類型之間的操作。
例如,JS操作:

var num = 123;
num = num + 'str';//結果123str,JS可以不用在意不同類型的變量之間進行操作

Java操作

int num = 123;
num = num +'str';//異常,Java不允許不同類型之間的變量進行操作

JS會隱式轉換數字num爲字符串,然後得出字符串結果。而Java不允許這樣的轉換(ClassCastException),因爲這是一種過於靈活的表現。

弱類型允許這樣的快速開發,而強類型會在編譯期捕獲這種隱含的錯誤。強類型需要程序員關注類型轉換,而弱類型更多的是通過大量的隱式(自動)轉換完成了這些操作。

P.S.
一般來說,靜態類型由於需要編譯期進行類型檢測。正常來講,靜態類型應該都是強類型,即不允許不同類型之間可以進行操作。而C和Basic語言卻是特殊的不是強類型的靜態類型語言。
因爲,C語言中,對於Char字符的操作,實際隱式轉化爲int進行操作,那麼,這樣的話,打破了強類型的規則。

安全類型和不安全類型

如何定義安全這個概念?對於異常進行捕獲,將會導致程序停止,但是,如果不捕獲異常,就會出現各種奇怪的行爲。所以,安全類型會讓語言在編譯期捕獲隱藏的異常,對於動態語言,將會在運行期捕獲這些異常。
這裏有一個誤區:弱類型的語言缺乏安全性。這個概念是不對的,相反的,由於弱類型會把檢測操作放在運行期,運行期檢測有一個好處,所有的信息都處於待運行狀態並且都可被獲取,使得安全檢測可以被更徹底的執行。
例如:C語言中的指針被認爲是一種不安全的類型,而索引則被認爲是一種安全的類型。

各語言分類

Language Static / Dynamic Strong / Weak Safety
Ada static strong safe
C static weak unsafe
C++ static strong unsafe
Java static strong safe
Javascript dynamic weak safe
Lisp dynamic strong safe
Pascal static strong safe
Perl dynamic weak safe
PHP dynamic weak safe
Python dynamic strong safe
Ruby dynamic strong safe

綜述

強弱類型動靜態語言區別:

這兩個概念是有區別的,強弱類型的本質是是否允許不同類型之間進行操作,例如:

//JavaScript
var i = 1;//i 是number類型,數字
i = i + "abc"//不會報異常,結果爲"1abc"

弱類型隱式轉換了變量類型。

再如:

//Python
a = 1;//a是一個數字類型
a = a+"abc"//異常,不允許數字和字符串進行 "+"操作

python是一個強類型語言,不允許不同類型的變量之間的操作。

這裏強調一下,我一直以爲,Python是動態的語言,所以一定是弱類型語言,但是其實Python是動態的強類型語言。所以說這兩個概念是有區別的:強類型不允許不同類型之間的變量有操作。動態型使得變量的類型是由數據的類型所決定,而不是由關鍵字。

動靜態語言是由變量的初始化方式所決定。

//Java
int a = 1;//整型
float b = 1.0;//浮點型

變量的定義是關鍵字定義的。

//JavaScript
var str = 'abc';//字符串類型
str = 123;//number類型

變量的類型是由數據的類型所定義的。

參考:http://eli.thegreenplace.net/2006/11/25/a-taxonomy-of-typing-systems

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章