天天看點

編譯型語言和解釋型語言,動态結構語言和靜态結構語言

目錄

​​編譯型語言和解釋型語言​​

​​動态結構語言(var,val)和靜态結構語言(有明顯的資料類型)​​

編譯型語言和解釋型語言

計算機不能直接的了解進階語言,隻能直接了解機器語言,是以必須要把進階語言翻譯成機器語言,計算機才能執行進階語言的編寫的程式。翻譯的方式有兩種,一個是編譯,一個是解釋。兩種方式隻是翻譯的時間不同。

編譯型語言:

編譯型語言和解釋型語言,動态結構語言和靜态結構語言

需通過編譯器(compiler)将源代碼編譯成機器碼,之後才能執行的語言。

一般需經過編譯(compile)、連結(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,連結是把各個子產品的機器碼和依賴庫串連起來生成可執行檔案。編譯和執行是分開的,但是不能跨平台。

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

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

代表語言:C、C++、Object-C、swift等。

解釋型語言

編譯型語言和解釋型語言,動态結構語言和靜态結構語言

解釋性語言的程式不需要編譯,相比編譯型語言省了道工序,解釋性語言在運作程式的時候才逐行翻譯。每一個語句都是執行的時候才能翻譯。這樣解釋性語言每執行一次要翻譯一次,效率表較低。

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

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

代表語言:JavaScript、Python、PHP

混合型語言

編譯型語言和解釋型語言,動态結構語言和靜态結構語言

混合型語言也叫半編譯型語言。比如java、C#,C#在編譯的時候不是直接編譯成機器碼而是中間碼,.NET平台提供了中間語言運作庫運作中間碼,中間語言運作庫類似于Java虛拟機。.net在編譯成IL代碼後,儲存在dll中,首次運作時由JIT在編譯成機器碼緩存在記憶體中,下次直接執行。

java解釋器采用生成與系統無關的位元組代碼指令技術。也就是說,在任何不同的作業系統上,隻要正确安裝了java運作系統,就有了編寫調試java程式的平台,在分布式應用中,java的這個特點使同一個java程式能在不同的系統上運作,進而提高了軟體生産效率。可移植性是跨平台特性的一個延伸,即具有了跨平台性,就保證了可移植性。java程式、java類庫、java編譯器、java系統都具有可移植性。

另外有一個特殊的情況,正常情況下JavaScript屬于解釋性語言,V8引擎是被設計用來提高網頁浏覽器内部JavaScript執行的性能,為了提高性能,v8會把js代碼轉換為高效的機器碼,而不在是依賴于解釋器去執行。v8引入了JIT在運作時把js代碼進行轉換為機器碼。這裡的主要差別在于V8不生成位元組碼或任何中間代碼。這裡的特殊之處在于JIT做代碼優化(同時生成編譯版本);解釋型語言無法做到這些。

動态結構語言(var,val)和靜态結構語言(有明顯的資料類型)

主要針對點是:運作是是否能夠改變代碼結構。

動态結構語言

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

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

靜态結構語言

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

(1)動态類型語言:動态類型語言是指在運作期間才去做資料類型檢查的語言,也就是說,在用動态類型的語言程式設計時,永遠也不用給任何變量指定資料類型,該語言會在你第一次指派給變量時,在内部将資料類型記錄下來。Python 和 Ruby 就是一種典型的動态類型語言,其他的各種腳本語言如 JavaScript 也屬于動态類型語言。

  • 動态類型語言的優點

    編寫的代碼數量更少,看起來更加簡潔,可以把精力更多地放在業務邏輯上。雖然不區分類型在某些情況下會讓程式變得難以了解,但整體而言,代碼量越少,越專注于邏輯表達,對閱讀程式越有幫助。

  • 動态類型語言的缺點

    無法保證變量的類型,進而在程式的運作期有可能發生跟類型相關的錯誤。

動态類型語言對變量類型的寬容給實際編碼帶來了很大的靈活性。由于無需進行類型檢測,我們可以嘗試調用任何對象的任意方法,而無需去考慮它原本是否被設計為擁有該方法。

  • 靜态類型語言的優點

    首先是在編譯時就能發現類型不比對的錯誤,編譯器可以幫助我們提前避免程式在運作期間有可能發生的一些錯誤。其次,如果在程式中明确規定了資料類型,編譯器還可以針對這些資訊對程式進行一些優化工作,提高程式執行速度。

  • 靜态類型語言的缺點

    首先是迫使程式員依照強契約來編寫程式,為每個變量規定資料類型,歸根結底隻是輔助我們編寫可靠性高程式的一種手段,而不是編寫程式的目的,畢竟大部分人編寫程式的目的是為了完成需求傳遞生産。其次,類型的聲明也會增加更多的代碼,在程式編寫過程中,這些細節會讓程式員的精力從思考業務邏輯上分散開來。