1、编译型语言
- 编译型语言是指程序在执行之前需要一个专门的编译过程,
- 把源代码编译为机器语言,这样运行时就不需要重新编译,
- 执行效率高,但缺点是,编译型语言依赖编译器,跨平台性差。
比如C语言程序的执行过程,要先将后缀为.c的源文件通过编译、链接为后缀为.exe的可执行文件,才能运行。
2、解释型语言
- 解释型语言是指源代码不需要预先进行编译,
- 在运行时,要先进行解释再运行,
- 解释型语言执行效率低,但跨平台性好。
比如JavaScript,Python
3、Java 是解释执行对吗?
Java分为编译期和运行期
- 编译期:将源代码编译为以“.class”结尾的字节码文件
- 运行期:将字节码文件加载进虚拟机进行解释或者编译执行
从硬件视角看,Java字节码无法直接执行,因此Java虚拟机需要把字节码翻译成机器码才能运行。在HotSpot中,上述翻译有二种方式:
-
解释执行:逐条将字节码编译为机器码在执行(同声传译)
-
即时编译:以方法为单位将字节码先编译为机器码在执行(放录音)
前者优势无需等待编译,而后者运行速度快。
总结!
Java是编译-解释型语言!
- 源代码首先通过Javac编译成字节码,然后在运行时,通过虚拟机内嵌的解释器将字节码转化机器码。
- 在运行期HotSpot采用混合模式,先解释执行字节码,然后反复执行的热点代码,在以方法为单位即时编译
- JVM中提供了JIT(Just In Time) 编译器也就是动态编译器。JIT能够在运行时将热点代码编译为机器码,这段热点代码就是编译执行,而不是解释执行。
HotSpot内置了多个即时编译器:C1(Client编译器),C2(Server编译器)。Java 7始,HotSpot默认采用分层编译的方式:热点方法首先被C1编译,而后热点方法中的热点会进一步被C2编译。