靜態與動態類型


靜態類型語言中,變量具有類型,而且在編譯期確定,具有某一類型的變量只能持有相同類型的數據。動態類型語言中,變量沒有類型,只有數據有類型,變量可以持有任意類型的數據。例如,C是靜態類型語言,一個int型變量只能作為int來處理。Python是動態語言,變量可以持有整數、字符串、列表、閉包等任何數據。

Java通常被認為是靜態語言,然而准確來說並非如此。Java的變量有類型,但是變量可以持有子類型的數據,例如Animal變量可以持有Cat或者Dog,具體是什么類型,是由運行時的數據決定的。這顯然是動態語言的特性。極端的情況,Java中Object類型的變量,可以持有任意數據,因為任意類型都是Object的子類。如果所有的變量和函數參數都聲明為Object類型,恐怕Java就可以作為動態語言使用了。所以,Java並非純粹的靜態類型語言,它打破了兩者的界限。

之所以這樣做,是為了在靜態語言中增加動態特性。靜態語言嚴謹,容易檢查和優化,但是靈活性不足,尤其是在大型軟件、需求多變的情況下,一個很小的改變往往需要修改多處代碼。動態語言靈活,但是由於缺少類型信息,前期不容易差錯,也不容易優化。Java的這種融合是一個很好的做法,它給出了部分類型信息,可以用於編譯期的檢查和優化;而剩下的類型信息則推遲到執行期決定,提供了動態性。

推廣到一般情況,靜態語言和動態語言之間並不是非此即彼,而是一個過渡帶。如果代碼中沒有給出變量的任何類型信息,那么這是純粹的動態語言。這種情況下,可以認為所有的變量都是Object類型。如果代碼中能夠給出變量的一些類型信息(這些類型顯然都是Object的派生類),那么語言就具有了靜態性。代碼中給出的類型越抽象,信息越少(抽象到極點就是Object);類型越具體,信息越多,編譯器就能夠對代碼進行更詳細的檢查和更好的優化。如果代碼中完全給出了變量的類型信息,這就是純粹的靜態語言。設想有一種語言,不局限於動態或者靜態類型,而是能夠根據代碼中給出的類型的抽象或者具體程度,進行編譯和執行。這樣的語言應當能夠更好的結合動態語言的靈活性和靜態語言的嚴謹性,並且能夠根據具體的代碼適應性的在二者之間進行調整。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM