靜態語言和動態語言
先舉個例子,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