概念
計算機不能直接地理解高級語言,只能直接理解機器語言。所以必須要把高級語言翻譯成機器語言,計算機才能執行高級語言編寫的程序。翻譯的方式有兩種:編譯和解釋。
編譯型語言:
編譯型語言是需通過編譯器(compiler)將源代碼編譯成機器碼之后才能執行的語言。一般需經過編譯(compile)、鏈接(linker)這兩個步驟。編譯是把源代碼編譯成機器碼,鏈接是把各個模塊的機器碼和依賴庫串連起來生成可執行文件。
- 執行過程:源代碼->匯編代碼->機器碼->CPU執行
- 特點
- 執行效率高:只須編譯一次就可以把源代碼編譯成機器碼,后面的執行無須重新編譯,直接使用之前的編譯結果,可以脫離語言環境獨立運行(不需要虛擬機)
- 跨平台性差:依賴於編譯器,編譯之后如果需要修改就要將整個模塊重新編譯。編譯的時候根據對應的運行環境生成機器碼,不同的操作系統之間移植就會有問題,需要根據運行的操作系統環境編譯不同的可執行文件
- 代表語言:C、C++、Golang、Pascal、Object-C、Swift
- 適用范圍:編譯型語言由於程序執行速度快,同等條件下對系統的要求比較低,因此像開發操作系統、大型應用程序、數據庫系統等軟件時一般采用它
解釋型語言:
解釋型語言的程序不需要編譯,相比編譯型語言省了道工序,解釋性語言在運行程序的時候才逐行翻譯。
- 執行過程:源代碼->字節碼->解釋器->機器碼->CPU執行
- 特點
- 執行效率低:程序不需要編譯,程序在運行時才翻譯成機器碼,每執行一次就要翻譯一次,不可脫離語言環境獨立運行(需要虛擬機)
- 跨平台性好:依賴於解釋器,在任何環境中都可以運行,前提是安裝了解釋器(虛擬機)。靈活,修改代碼的時候直接修改就可以,可以快速部署,不用停機維護
- 代表語言:Python、JavaScript、PHP、Shell、Ruby、MATLAB、Perl
- 適用范圍:一些網頁腳本,服務器腳本以及輔助開發接口之類的對速度要求不高,對不同系統兼容性有一定要求的程序通常使用解釋型語言
編譯型語言和解釋型語言的區別
注意
- 一般,編譯型語言的運行效率比解釋型語言更高,但是不能一概而論,部分解釋型語言的解釋器通過在運行時動態優化代碼,甚至能使解釋型語言的性能超過編譯型語言
- Java語言應是編譯型-解釋型語言,因為其同時具備編譯型和解釋型兩種特性:Java文件先編譯成與平台無關的
.class
字節碼文件,然后.class
字節碼文件既可以在Windows平台上的Java虛擬機(JVM)上進行解釋運行,也可以在Linux平台上的JVM上解釋運行。而JVM的翻譯過程是解釋型的,JVM從.class
字節碼文件中讀出一條指令,翻譯一條指令,然后執行一條指令,這個過程就稱為Java的解釋執行。C#與Java類似 - 當我們說“下載一個程序(軟件)”時,不同類型的語言有不同的含義
- 對於編譯型語言,我們下載到的是可執行文件,源代碼被作者保留,所以編譯型語言的程序一般是閉源的
- 對於解釋型語言,我們下載到的是所有的源代碼,因為作者不給源代碼就沒法運行,所以解釋型語言的程序一般是開源的
- 我們所說的解釋型語言能跨平台,是指源代碼跨平台,而不是解釋器跨平台。解釋器用來將源代碼轉換成字節碼,它就是一個可執行程序,是絕對不能跨平台的。在不同的平台下,解釋器會將相同的源代碼轉換成不同的機器碼,解釋器幫助我們屏蔽了不同平台之間的差異