这篇我们来聊聊java的编译器和解释器。先看看官方的解释:
Java Compiler (Java 编译器)
Java compiler reads source files written in the Java programming language, and compiles them into bytecode class files.
Java编译器读取java源文件(*.java)并将它们编译为java字节码文件(*.class)。
Windows系统中的javac.exe可以简单看成是Java编译器。
image.pngJava Interpreter(Java 解释器)
Java compilers generate machine-independent bytecodes instead of machine instructions. The interpreter is like a CPU implemented in software. It decodes and executes bytecodes, independent of what computer they were compiled on.
Java编译器生成的是与机器码不同的java字节码,并不能被硬件中的CPU直接执行。而java解释器就像植根于软件中的CPU,能够解析并执行java字节码。
Windows系统中的java.exe可以简单看成是Java解释器。
通过上面的解释和配图,我们已经基本能够知道java的编译器和解释器是干什么用的了。下面来聊聊为什么要有它们,当然只是我的理解,欢迎大家评论拍砖。
Java有个口号是“Write Once,Run Anywhere”,旨在展示Java程序设计语言的跨平台特性,而能够实现这个特性的基础就是java字节码文件和能够执行它的Java虚拟机 - JVM,一个可以在不同的硬件平台和操作系统上运行java字节码的神器。所以很清晰了,生成java字节码文件就是Java编译器的工作,而执行字节码的工作就是JVM中Java解释器干的活,没有它们就没有“Write Once,Run Anywhere”。
在这里还要说个东东 - JIT编译器(Just In Time Compile 即时编译器),总体来说,这项技术是被用来改善虚拟机的性能的。附解释:
Java程序最初是通过解释器进行解释执行的,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code,如循环,高频度使用的方法等)。为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地机器码,并进行各种层次的优化,完成这个任务的编译器称为JIT编译器。JIT编译器是JRE的一部分。
简单的说,java解释器一行一行的运行java字节码还是太慢了,而机器码运行起来最快。JIT编译器把被多次调用的方法和被多次执行的循环体相关的字节码编译成本地机器码并运行,就可以大大提高运行效率。
顺带说一句,解释器 + JIT编译器就是JVM执行引擎(Execute Engine):
image.png