天天看點

編譯型語言和解釋型語言、動态語言和靜态語言、動态類型語言和靜态類型語言的概念與差別

編譯型語言和解釋型語言

1、編譯型語言

需通過編譯器(compiler)将源代碼編譯成機器碼,之後才能執行的語言。一般需經過編譯(compile)、連結(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,連結是把各個子產品的機器碼和依賴庫串連起來生成可執行檔案。

優點:編譯器一般會有預編譯的過程對代碼進行優化。因為編譯隻做一次,運作時不需要編譯,是以編譯型語言的程式執行效率高。可以脫離語言環境獨立運作。

缺點:編譯之後如果需要修改就需要整個子產品重新編譯。編譯的時候根據對應的運作環境生成機器碼,不同的作業系統之間移植就會有問題,需要根據運作的作業系統環境編譯不同的可執行檔案。

代表語言:C、C++、Pascal、Object-C以及最近很火的蘋果新語言swift

2、解釋型語言

解釋性語言的程式不需要編譯,相比編譯型語言省了道工序,解釋性語言在運作程式的時候才逐行翻譯。

優點:有良好的平台相容性,在任何環境中都可以運作,前提是安裝了解釋器(虛拟機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護。

缺點:每次運作的時候都要解釋一遍,性能上不如編譯型語言。

代表語言:JavaScript、Python、Erlang、PHP、Perl、Ruby

3、混合型語言

既然編譯型和解釋型各有缺點就會有人想到把兩種類型整合起來,取其精華去其糟粕。就出現了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平台提供了中間語言運作庫運作中間碼,中間語言運作庫類似于Java虛拟機。.net在編譯成IL代碼後,儲存在dll中,首次運作時由JIT在編譯成機器碼緩存在記憶體中,下次直接執行(博友回複指出)。我個人認為抛開一切的偏見C#是這個星球上最好的程式設計語言。可惜微軟的政策限制了C#的推廣。

Java先生成位元組碼再在Java虛拟機中解釋執行。

嚴格來說混合型語言屬于解釋型語言。C#更接近編譯型語言。

動态語言和靜态語言

1、動态語言

是一類在運作時可以改變其結構的語言:例如新的函數、對象、甚至代碼可以被引進,已有的函數可以被删除或是其他結構上的變化。通俗點說就是在運作時代碼可以根據某些條件改變自身結構。

主要動态語言:Object-C、C#、JavaScript、PHP、Python、Erlang。

2、靜态語言

與動态語言相對應的,運作時結構不可變的語言就是靜态語言。如Java、C、C++。

3、注意:

很多人認為解釋型語言都是動态語言,這個觀點是錯的!Java是解釋型語言但是不是動态語言,Java不能在運作的時候改變自己結構。反之成立嗎?動态語言都是解釋型語言。也是錯的!Object-C是編譯型語言,但是他是動态語言。得益于特有的run time機制(準确說run time不是文法特性是運作時環境,這裡不展開)OC代碼是可以在運作的時候插入、替換方法的。

C#也是動态語言,通過C#的反射機制可以動态的插入一段代碼執行。是以我說C#是這個星球最好的程式設計語言。

動态類型語言和靜态類型語言

1、動态類型語言

很多網上資料把動态類型語言和動态語言混為一談,簡直是誤人子弟。動态類型語言和動态語言是完全不同的兩個概念。動态類型語言是指在運作期間才去做資料類型檢查的語言,說的是資料類型,動态語言說的是運作是改變結構,說的是代碼結構。

動态類型語言的資料類型不是在編譯階段決定的,而是把類型綁定延後到了運作階段。

主要語言:Python、Ruby、Erlang、JavaScript、swift、PHP、Perl。

2、靜态類型語言

靜态語言的資料類型是在編譯其間确定的或者說運作之前确定的,編寫代碼的時候要明确确定變量的資料類型。

主要語言:C、C++、C#、Java、Object-C。

3、注意:

相當一部分程式員,也包括曾經的我,認為解釋型語言都是動态類型語言,編譯型語言都是靜态類型語言。這個也是錯的。swift是編譯型語言但是它也是動态類型語言。C#和Java是解釋型語言也是靜态類型語言。

強類型語言和弱類型語言

1、強類型語言:

強類型語言,一旦一個變量被指定了某個資料類型,如果不經過強制類型轉換,那麼它就永遠是這個資料類型。你不能把一個整形變量當成一個字元串來處理。

主要語言:Java、C#、Python、Object-C、Ruby

2、弱類型語言:

資料類型可以被忽略,一個變量可以賦不同資料類型的值。一旦給一個整型變量a賦一個字元串值,那麼a就變成字元類型。

主要語言:JavaScript、PHP、C、C++(C和C++有争議,但是确實可以給一個字元變量賦整形值,可能初衷是強類型,形态上接近弱類型)

3、注意:

一個語言是不是強類型語言和是不是動态類型語言也沒有必然聯系。Python是動态類型語言,是強類型語言。JavaScript是動态類型語言,是弱類型語言。Java是靜态類型語言,是強類型語言。

本文轉載自:https://www.cnblogs.com/zy1987/p/3784753.html?utm_source=tuicool