如何理解編譯型語言、解釋型語言?
編譯型和解釋型在平時開發業務邏輯的時候,基本上用不到。
但對他們有一個稍微深入的瞭解,還是有所必要的,畢竟這是一種基礎知識和概念。
基礎知識是底層支撐,雖然很少運用在具體事情上,但能夠塑造幫助我們對計算機領域的思維結構。
編譯型
編譯型語言所開發的程式,需要通過編譯器(compiler)將原始碼轉換為機器碼後才能執行。
編譯通常分為兩個步驟:
-
compile
編譯:將原始碼轉換為機器碼 -
linker
連結(打包):當原始碼、資源等檔案比較多時,將多個檔案打包在一個執行檔案中。
編譯型語言所開發程式,一旦發生更改,整個模組甚至整個專案就需要重新編譯,並根據不同的環境和平臺編譯出不同平臺的執行檔案,這給開發人員除錯、釋出都會帶來一些麻煩。
常見編譯語言有:c、c++、oc、swift
解釋型
解釋型語言所開發的程式,會在執行過程中(runtime)通過直譯器一邊將原始檔轉換為執行碼,一邊執行,也就是逐行翻譯。
直譯器可以稱之為虛擬機器,比如java的虛擬機器jvm。
解釋型語言也可以分兩種:
- 半編譯半解釋
Java屬於半編譯半解釋,它將原始碼轉換成中間碼才能被jvm(java虛擬機器)執行。
所謂一次編譯,到處執行,是指在編譯和執行中間,多了一個jvm這個抽象層。
中間碼依賴jvm,而不依賴於平臺(作業系統),只要jvm支援中間碼,中間就能執行,不同平臺的相容性,就由jvm來解決,開發者可以專注於開發業務邏輯,這解決了編譯語言的跨平臺問題。
但如果你程式碼發生了改變,仍然需要再次編譯。
- 完全解釋
Php是完全解釋,它‘一次編譯’都省了,直接由直譯器載入原始碼,就開始逐行翻譯並執行。
那麼,除錯程式的時候,更改程式碼就能直接再次執行,不存在編譯的步驟,它在跨平臺的基礎上,又為開發除錯提供了便利。
但這不一定是好事,這將導致php每一次執行,都需要先解釋,再執行,執行效率上比不上java的直接由jvm執行中間碼。
當然,java半編譯半解釋,雖然通過jvm解決了跨平臺問題,但執行效率上,也是比不上編譯型語言的,因為編譯型語言開發的程式執行時,計算機只需要關注程式本身的流程就好了,但java,jvm也是對計算機資源的一種開銷,不過這種開銷非常小,幾乎可以忽略。
注意
最後,有一個注意點要特別關注一下。
完全解釋的語言,因為它是按讀取順序解釋程式碼的,所以,當你在使用某個函式的時候,一定要考慮到它是不是已經存在了。
比如,php就是完全解釋語言,當你把函式a定義在function.php中,而你在index.php中呼叫了a函式,一定要確保在呼叫a函式之前,就已經將function.php引入,否則會報找不到函式的錯誤。
javascript也是這樣,一個例子就是jquery和jquery外掛,所以jquery必須在jquery外掛之前被引入。