最近在研究Python和Erlang。反覆提到動態類型語言、動態語言、解釋型語言這些概念。這些概念很生澀,在這裏作一個總結。程序員
一、編譯型語言編程
需經過編譯器(compiler)將源代碼編譯成機器碼,以後才能執行的語言。通常需通過編譯(compile)、連接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,連接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。swift
優勢:編譯器通常會有預編譯的過程對代碼進行優化。由於編譯只作一次,運行時不須要編譯,因此編譯型語言的程序執行效率高。能夠脫離語言環境獨立運行。緩存
缺點:編譯以後若是須要修改就須要整個模塊從新編譯。編譯的時候根據對應的運行環境生成機器碼,不一樣的操做系統之間移植就會有問題,須要根據運行的操做系統環境編譯不一樣的可執行文件。編程語言
表明語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift函數
二、解釋型語言性能
解釋性語言的程序不須要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯。優化
優勢:有良好的平臺兼容性,在任何環境中均可以運行,前提是安裝瞭解釋器(虛擬機)。靈活,修改代碼的時候直接修改就能夠,能夠快速部署,不用停機維護。spa
缺點:每次運行的時候都要解釋一遍,性能上不如編譯型語言。操作系統
表明語言:JavaScript、Python、Erlang、PHP、Perl、Ruby
三、混合型語言
既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現了半編譯型語言。好比C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言運行庫運行中間碼,中間語言運行庫相似於Java虛擬機。.net在編譯成IL代碼後,保存在dll中,首次運行時由JIT在編譯成機器碼緩存在內存中,下次直接執行(博友回覆指出)。我我的認爲拋開一切的偏見C#是這個星球上最好的編程語言。惋惜微軟的政策限制了C#的推廣。
Java先生成字節碼再在Java虛擬機中解釋執行。
嚴格來講混合型語言屬於解釋型語言。C#更接近編譯型語言。
一、動態語言
是一類在運行時能夠改變其結構的語言:例如新的函數、對象、甚至代碼能夠被引進,已有的函數能夠被刪除或是其餘結構上的變化。通俗點說就是在運行時代碼能夠根據某些條件改變自身結構。
主要動態語言:Object-C、C#、JavaScript、PHP、Python、Erlang。
二、靜態語言
與動態語言相對應的,運行時結構不可變的語言就是靜態語言。如Java、C、C++。
三、注意:
不少人認爲解釋型語言都是動態語言,這個觀點是錯的!Java是解釋型語言可是不是動態語言,Java不能在運行的時候改變本身結構。反之成立嗎?動態語言都是解釋型語言。也是錯的!Object-C是編譯型語言,可是他是動態語言。得益於特有的run time機制(準確說run time不是語法特性是運行時環境,這裏不展開)OC代碼是能夠在運行的時候插入、替換方法的。
C#也是動態語言,經過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是靜態類型語言,是強類型語言。
若是個人理解有誤,請在回覆中不吝指出,謝謝。