最近在研究Python和Erlang。反覆提到動態類型語言、動態語言、解釋型語言這些概念。這些概念很生澀,在這裏作一個總結。程序員
需經過編譯器(compiler)將源代碼編譯成機器碼,以後才能執行的語言。
通常需通過編譯(compile)、連接(linker)這兩個步驟。
編譯是把源代碼編譯成機器碼,連接是把各個模塊的機器碼
和依賴庫串連起來生成可執行文件。
優勢: 編譯器通常會有預編譯的過程對代碼進行優化。
由於編譯只作一次,運行時不須要編譯,
因此編譯型語言的程序執行效率高。能夠脫離語言環境獨立運行。
缺點: 編譯以後若是須要修改就須要整個模塊從新編譯。
編譯的時候根據對應的運行環境生成機器碼,
不一樣的操做系統之間移植就會有問題,
須要根據運行的操做系統環境編譯不一樣的可執行文件。
複製代碼
表明語言:C、C++、Pascal、Object-C、swift編程
解釋性語言的程序不須要編譯,相比編譯型語言省了道工序,
解釋性語言在運行程序的時候才逐行翻譯。
優勢: 有良好的平臺兼容性,在任何環境中均可以運行
前提是安裝瞭解釋器(虛擬機)
靈活,修改代碼的時候直接修改就能夠
能夠快速部署,不用停機維護。
缺點: 每次運行的時候都要解釋一遍,性能上不如編譯型語言。
複製代碼
表明語言:JavaScript、Python、Erlang、PHP、Perl、Rubyswift
既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來, 取其精華去其糟粕。就出現了半編譯型語言。 好比C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼, 複製代碼
.NET平臺提供了中間語言運行庫運行中間碼, 中間語言運行庫相似於Java虛擬機。 .net在編譯成IL代碼後,保存在dll中, 首次運行時由JIT在編譯成機器碼緩存在內存中, 下次直接執行(博友回覆指出)。 我我的認爲拋開一切的偏見C#是這個星球上最好的編程語言。 惋惜微軟的政策限制了C#的推廣。緩存
Java先生成字節碼再在Java虛擬機中解釋執行。 嚴格來講混合型語言屬於解釋型語言。C#更接近編譯型語言。bash
是一類在運行時能夠改變其結構的語言:
例如新的函數、對象、甚至代碼能夠被引進,
已有的函數能夠被刪除或是其餘結構上的變化。
通俗點說就是在運行時代碼能夠根據某些條件改變自身結構。
複製代碼
主要動態語言:Object-C、C#、JavaScript、PHP、Python、Erlang。markdown
與動態語言相對應的,運行時結構不可變的語言就是靜態語言。
如Java、C、C++。
複製代碼
不少人認爲解釋型語言都是動態語言,這個觀點是錯的!
Java是解釋型語言可是不是動態語言,Java不能在運行的時候改變本身結構。
反之成立嗎?動態語言都是解釋型語言。也是錯的!Object-C是編譯型語言,可是他是動態語言。得益於特有的run time機制(準確說run time不是語法特性是運行時環境,這裏不展開)OC代碼是能夠在運行的時候插入、替換方法的。
複製代碼
C#也是動態語言,經過C#的反射機制能夠動態的插入一段代碼執行。編程語言
不少網上資料把動態類型語言和動態語言混爲一談,簡直是誤人子弟。
動態類型語言和動態語言是徹底不一樣的兩個概念。
動態類型語言是指在運行期間纔去作數據類型檢查的語言,
說的是數據類型,動態語言說的是運行是改變結構,說的是代碼結構。
複製代碼
動態類型語言的數據類型不是在編譯階段決定的,而是把類型綁定延後到了運行階段。函數
主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。性能
靜態語言的數據類型是在編譯其間肯定的或者說運行以前肯定的,
編寫代碼的時候要明確肯定變量的數據類型。
複製代碼
主要語言:C、C++、C#、Java、Object-C。優化
至關一部分程序員,也包括曾經的我,認爲解釋型語言都是動態類型語言, 編譯型語言都是靜態類型語言。這個也是錯的。 swift是編譯型語言可是它也是動態類型語言。 C#和Java是解釋型語言也是靜態類型語言。 複製代碼
強類型語言,一旦一個變量被指定了某個數據類型,
若是不通過強制類型轉換,那麼它就永遠是這個數據類型。
你不能把一個整形變量當成一個字符串來處理。
複製代碼
主要語言:Java、C#、Python、Object-C、Ruby
數據類型能夠被忽略,一個變量能夠賦不一樣數據類型的值。
一旦給一個整型變量a賦一個字符串值,那麼a就變成字符類型。
複製代碼
主要語言:JavaScript、PHP、C、C++(C和C++有爭議,可是確實能夠給一個字符變量賦整形值,可能初衷是強類型,形態上接近弱類型)
一個語言是否是強類型語言和是否是動態類型語言也沒有必然聯繫。
Python是動態類型語言,是強類型語言。
JavaScript是動態類型語言,是弱類型語言。
Java是靜態類型語言,是強類型語言。
複製代碼
若是個人理解有誤,請在回覆中不吝指出,謝謝。