1.编译器类型
一段代码是怎么通过简单的人类可读的字符变为机器可执行的010101机器码的,这个过程在JAVA领域涉及两个大的过程
编译期:检查是否有语法错误,如果没有就将其翻译成JVM可识别的字节码文件,即.class文件。把源代码(高级语言)转换成(翻译)低级语言(机器语言)的程序。
运行期:java虚拟机分配内存,解释执行字节码文件,并执行指令操作。
编译期用到的程序或代码就叫编译器,编译器在JVM中通常涉及2个概念:前端编译器和后端编译器
前端编译器:主要功能是把.java文件转换成.class文件,例如:Sun的javac、Eclipse的JDT的增量式编译器;
后端编译器:主要是把前面的.class字节码文件编程机器码,然后交给硬件机器去执行。
这其中后端编译器在JVM中有两种,JIT(Just In Time Compiler)和AOT(Ahead Of Time Compiler)编译器。
2.解释器和编译器
这里又有个解释器和编译器?跟上面的又是什么关系?在运行期间是解释模式还是编译模式,这么说应该更容易直白些。
传统的说法都说JAVA是编译型的语言,但实际上在运行期也有解释器的参与,这么说应该明白些,在运行期既有解释器也有编译器,这里的编译器通常在HotspotVM中就是指JIT.
解释器和编译器关系
目前主流的商用 JVM 内部都同时包含解释器与编译器,二者各有优势:
- 程序需要迅速启动和执行时,解释器可以省去编译时间,立即执行。
- 程序启动后,编译器逐渐发挥作用,把越来越多的代码编译成本地代码,可以减少解释器的中间消耗,提高执行效率。
- 若运行环境的内存资源限制较大,可使用解释器执行节约内存;反之可使用编译执行来提升效率。
总结起来就是:
- 解释器启动较快,占用内存较小,但是执行效率稍低。
- 编译器启动较慢,占用内存较大,但执行效率较高。
Hotspot虚拟机内置了三个即时编译器,其中两个存在已久,分别是:
客户端编译器(Client Compiler)
服务端编译器(Server Compiler)
Graal编译器(JDK10以后才出现)
在分层编译(Tiered Compiation)的工作模式出现以前,HotSpot虚拟机通常是采用解释器与其中一个编译器直接搭配的方式工作,程序使用哪个编译器只取决于虚拟机运行的模式,HotSpot虚拟机会根据自身的版本与宿主机器的硬件性能自动选择运行模式,用户也可以使用 "-client"或"-server"参数去强制指定虚拟机运行在客户端模式还是服务器端模式。