Java到底是解釋型還是編譯型語言?
定義
回答這個問題,我們首先來看下概念:
開發人員編寫代碼,語言是人類可理解的方式,是具有語義的,然而計算機無法理解和執行,因此需要做一層轉換。
解釋型語言:
- 運行時,由專門的解釋器將代碼解釋成機器可運行的機器語言。這種方式副作用就是執行效率會差一些。但是只要解釋器支持不同平台,代碼是不需要變動的,可移植性好。
- 編譯型語言:將源碼一次性編譯成計算機可識別的機器語言,結果往往以可執行文件的形式存在,例如C、C++等。由於事前編譯,具有運行速度快的特點,但是面對不同的操作系統,可移植性較差。
分析
回過頭來看Java,我們知道,Java代碼執行前需要先編譯成class文件,再交由JVM執行。因此從這一過程來看,Java可以稱之為編譯型語言。
然而,class文件的內容屬於一種中間語言,計算機無法直接識別,仍然需要由JVM解釋成機器語言執行,因此這個角度來說,可以稱之為解釋型語言。
拓展
那么Java為什么要這么設計呢?
個人理解:
- Java能這么強勢的列於開發語言之林這么多年,不光是因為開源和豐富的第三方庫,還因為其平台無關性。而平台無關性正是因為JVM的存在,所以設計之初就是解釋型的。
- 源文件需要進行的解釋步驟前,還需要進行語法檢查、語義分析等復雜過程,影響解釋效率。而先將源文件編譯成class,省去了這個步驟;同時因為編譯成class(字節碼),文件大小也會小很多,有利於移植和跨平台
綜上,我認為Java設計之初就考慮到了:可移植型和效率的兼顧。