编译器和解释器的概念
- 解释型语言:是在运行的时候将程序翻译成机器语言。解释型语言的程序不需要在运行前编译,在运行程序的时候才翻译,专门的解释器负责在每个语句执行的时候解释程序代码。
- 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。
Java的编译器和解释器
- 前端编译器(javac.exe):负责将.java编译成.class字节码文件。也称前端编译即此过程依赖于前端编译器而不是JVM。
- 解释器(java.exe):负责将.class逐条解释成cpu可识别的指令。
- 后端编译器(hotspot的即时编译器JIT):HotSpot虚拟机内置了两个即时编译器,分别称为Client Compiler和Server Compiler,习惯上将前者称为C1,后者称为C2,它们俩也是JVM的分类Client VM和Server VM;使用Java -version就可查看
为什么要有即时编译器(JIT):
由于将Java程序的运行是将.class文件交给解释器逐行转换成机器语言运行速度比较慢,所以hotsopt虚拟机采用编译器和解释器并存的架构(注意:前端编译器不属于JVM),将一些执行频率比较高的代码块直接编译成机器码,下次运行直接执行机器码比较块(解释器一次只能翻译一条语句,编译器一次可以编译一个大的代码块,所以速度的提升快就快在这里)
附:
- jvm:用于执行字节码文件的虚拟计算机
* jre:jvm+库函数+运行Java程序所必须的文件
* jdk:jre+编译器+调试器;
hotspot的编译器和解释器是如何配合工作的
- 当程序需要迅速启动然后执行的时候,解释器可以首先发挥作用,编译器不运行从而省去编译时间,立即执行程序
- 在程序运行后,随着时间的推移,编译器逐渐发挥作用,把越来越多的代码编译成本地代码之后,可以获得更高的执行效率
- 当程序运行环境中内存资源限制较大(如部分嵌入式系统中),可以使用解释执行来节约内存;反之,则可以使用编译执行来提升效率。
- 同时,解释器还可以作为编译器(C2才会激进优化)激进优化时的一个“逃生门”,让编译器根据概率选择一些大多数时候都能提升运行速度的优化手段,当激进优化假设不成立。如:加载了新类后,类型继承结构出现变化,出现“罕见陷阱(Uncommon Trap)”时,可以通过逆优化(Deoptimization)退回到解释状态继续执行
(部分没有解释器的虚拟机,也会采用不进行激进优化的C1编译器担任“逃生门”的角色)
之后出现的 **分层编译技术 **我不会,总之JVM的设计是我见过最高深,最巧妙的东西;