1. 程式人生 > >關於編譯性語言、解釋性語言和指令碼語言,動態語言,靜態語言的區別

關於編譯性語言、解釋性語言和指令碼語言,動態語言,靜態語言的區別

//'1'高電平  '0'低電平

// 0 1 10 11  100 101 110 111

//5+6 機器語言

//010010101010100101

//100101010010101010

//010101010100101010

//組合語言

//5+6

//movl $5 -8(rbp)

//movl $6 -12(rbp)

//movl -8(rbp) %eax

//addl -12(rbp) %eax

//movl %eax %esi

編譯型語言和解釋型語言

       計算機是不能理解高階語言,當然也就不能直接執行高階語言了。計算機只能直接理解機器語言,所以任何語言,都必須將其翻譯成機器語言,計算                  機才能執行高階語言編寫的程式。

          一、編譯型語言和解釋型語言

    翻譯的方式有兩種,一個是編譯,一個是解釋。

    兩種方式只是翻譯的時間不同。編譯型語言寫的程式在被執行之前,需要一個專門的編譯過程,把程式編譯成為機器語言的檔案,比如exe檔案,以  後要執行的話就不用重新翻譯了,直接使用編譯的結果就行了(exe檔案),因為翻譯只做了一次,執行時不需要翻譯,所以編譯型語言的程式執行    效率高。 

    解釋則不同,解釋性語言的程式不需要編譯,省了道工序,解釋性語言在執行程式的時候才翻譯,比如解釋性basic語言,專門有一個直譯器能夠直    接執行basic程式,每個語句都是執行的時候才翻譯。這樣解釋性語言每執行一次就要翻譯一次,效率比較低。

    二、指令碼語言

    ①指令碼語言(JavaScript,VBscript等)介於HTML和C,C++,Java,C#等程式語言之間 

    HTML通常用於格式化和鏈結文字。而程式語言通常用於向機器發出一系列複雜的指令。 

    ②指令碼語言與程式語言也有很多相似地方,其函式與程式語言比較相象一些,其也涉及到變數。與程式語言之間最大的區別是程式語言的語法和規則更為嚴格和複雜一些。

    ③與程式程式碼的關係:指令碼也是一種語言,其同樣由程式程式碼組成

    注:指令碼語言一般都有相應的指令碼引擎來解釋執行。 他們一般需要直譯器才能執行。JAVASCRIPT,ASP,PHP,PERL都是指令碼語言。C/C++編譯、連結後,可形成獨立執行的exe檔案。 

    ④指令碼語言是一種解釋性的語言

    例如vbscript,javascript,installshield script等等,它不象c/c++等可以編譯成二進位制程式碼,以可執行檔案的形式存在。指令碼語言不需要編譯,可以直接用,由直譯器來負責解釋,不過每次都需要翻譯,執行速度慢。 

    ⑤指令碼語言一般都是以文字形式存在,類似於一種命令

    舉個例子說,如果你建立了一個程式,叫aaa.exe,可以開啟.js為副檔名的檔案。

    你為.js檔案的編寫指定了一套規則(語法),當別人編寫了.js檔案後,你的程式用這種規則來理解編寫人的意圖,並作出迴應.那麼,這一套規則就是指令碼語言。

 

1、編譯型語言

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

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

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

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

2、解釋型語言

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

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

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

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

3、混合型語言

既然編譯型和解釋型各有缺點就會有人想到把兩種型別整合起來,取其精華去其糟粕。就出現了半編譯型語言。比如C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平臺提供了中間語言執行庫執行中間碼,中間語言執行庫類似於Java虛擬機器。我個人認為拋開一切的偏見C#是這個星球上最好的程式語言。可惜微軟的政策限制了C#的推廣。

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

嚴格來說混合型語言也屬於解釋型語言。

動態語言和靜態語言

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是靜態型別語言,是強型別語言。

如果我的理解有誤,請在回覆中不吝指出,謝謝。