为什么说Java是编译与解释共存的语言
在解释这个问题之前首先要知道什么是编译型语言和解释型语言
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:
1.编译
2.解释
由此高级语言也分为编译型语言和解释型语言。
编译型语言:
- 编译型语言注重编译,它是指将文件通过编译器一次性编译成特定平台(操作系统)可以运行的机器码。
解释型语言:
- 使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。
编译型语言与解释型语言的对比
ps:
如何理解编译型语言可移植性较差和解释性语言跨平台性较好
- 任何一行编译型语言,如C语言,由编译器编译成不同的机器语言。
而汇编语言,是针对某一个CPU而写的,编译后得到的机器码不能在另一个CPU上运行。
比如,C语言的 a = b + c; 编译器可以编译到x86、arm、mips
X86的机器指令是add eax,ebx
而mips的,可能是add t 0 , t0, t0,t0,$t1
所以如果你将x86编译器得到的机器码移植到mips,固然是不能运行的,
但也正因为可以编译成机器语言,编译型语言的运行效率较解释型高,因为可以调用操作系统的api,解释型语言为了跨平台性,是不能调用特定操作系统的api的。
java语言为什么两者兼有
- .java经过javac编译器编译之后得到.class文件->这个就是java文件到虚拟机的中间码->.class文件只有被JVM加载->然后通过解释器-逐行解释执行,这种方式的执行速度会相对比较慢。这是属于解释型语言的特点,中间码即.calss文件只是一个中间码,并不算机器码,所以并不满足编译型语言的特点。然而,有些方法和代码块是经常需要被调用的,也就是所谓的热点代码,后面引进了 JIT 编译器,JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。这是属于编译型语言的特点,机器码的运行效率肯定是高于 Java 解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。
解释器的。这也解释了我们为什么经常会说 Java 是编译与解释共存的语言。