文章目錄
- 前言
- 一、Java 與 Java 字節碼
- 二、什么是編譯器(Compiler)
- 三、什么是解釋器(Interpreter)
- 四、編譯器與解釋器有何區別?
- 五、Java 語言屬于哪種語言?
- 總結
前言
我們都知道開發語言整體分為兩類,一類是編譯型編程語言,一類是解釋型編程語言。那么你知道二者有何區別嗎?編譯器和解釋器又各自有何區分?Java 語言屬于編譯型編程語言還是解釋型編程語言呢?一、Java 與 Java 字節碼
首先給大家舉個例子,使用 Java 語言編寫一段代碼,在沒有語法錯誤的前提下,編譯器就會生成一個擴展名為.class
的中間字節碼文件。
Java 語言是高級語言,而 Java 字節碼是低級語言。字節碼類似于機器指令,但它不是體系結構中立的,是可以在任何帶 Java 虛擬機的平臺上運行的。
Java 代碼的編譯流程大致如下:
對于 Java 源程序編譯、執行原理感興趣的同學可以移步我的另有一篇文章 Java 版本、語言規范、API、JDK、IDE、Java 源程序編譯、執行原理(跨平臺性根本原因)、特殊字符用法、8 大數據類型小結。
二、什么是編譯器(Compiler)
編譯器是將源代碼編譯(翻譯)成低級語言的程序。編譯器把源程序的每一條語句都編譯成機器語言,并保存為二進制文件,運行時計算機可以直接通過運行語言來運行此程序,速度會很快。
英文譯文:A compiler is a program that compiles (translates) source code into a low-level language. The compiler compiles every statement of the source program into machine language and saves it as a binary file. When running, the computer can run the program directly through the running language, and the speed will be very fast.
三、什么是解釋器(Interpreter)
解釋器是直接執行用編程語言編寫的指令的程序。只有在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度不如編譯后的程序運行的快。而執行 Java 程序也就是運行程序的字節碼,通過 JVM 來解釋 Java 字節碼。
英文譯文:An interpreter is a program that directly executes instructions written in a programming language. Only when the program is executed, it is interpreted into machine language to be executed by the computer one by one, so the running speed is not as fast as the compiled program. Executing a java program is the bytecode of the running program. The Java bytecode is interpreted through the JVM.
解釋的過程就是一次將字節碼中單獨的一步翻譯為目標機器語言代碼,翻譯后立即執行這一步,具體如下圖所示:
四、編譯器與解釋器有何區別?
編譯器產生更快的程序,它必須把每個語句分析一次(邊編譯邊分析),而解釋器必須每次分析一次(增加一條分析一次)。此外編譯器還可以優化其生成的可執行代碼。因為它確切的知道它在哪里運行,并且需要時間來優化代碼。在不同的情況下具有不同的速度。
五、Java 語言屬于哪種語言?
在上圖的例子中,Hello.java 的源代碼文件是通過 Java 編譯器產生.class
的中間字節碼文件然后再送往 JVM 中執行的,進入 JVM 之后的運行流程大致如下圖所示:
所以說,Java 語言既不屬于編譯型編程語言也不屬于解釋型編程語言,因為它由 Java 編譯器編譯為字節碼文件,然后仍需要有 JVM 將字節碼解釋翻譯為目標機器語言,先編譯后解釋。
總結
在本文中我們解釋了什么是編譯器,什么是解釋器,并對二者進行了比較,從原理層面指出 Java 語言既不屬于編譯型編程語言也不屬于解釋型編譯語言。關于進一步了解底層原理的,我們可以去看一下 Java 虛擬機的內容,這既是基礎,面試必問,也是我們真正想搞懂 Java 這門語言的核心所在。我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!