Java是解释执行这句话正确吗?谈谈你对Java平台的理解。
正文:
对于Java解释执行这句话我想大家心里其实是有一定的理解的,Java是一个面向对象语言,并且可以跨平台执行的一种语言,Java公司对Java语言的宣传语是“编写一次,可在任何地方运行(Write once, run anywhere)”。下面我们一起来看一看Java是怎么做到这个特点的。
Java语言执行过程:
- 将Java源码(.java文件)通过编译器命令(javac.exe)编译成JVM文件(.class文件)
- 再将(.class文件)交给JVM解释转换成字节码输出给硬件,最终执行出结果。
相信大家看到这里已经对Java执行过程有了一个意向,上图中出现了一个JIT(Just-In-Time)代码生成器,有的人可能不知道这个JIT是什么鬼。
JIT简单介绍:
在介绍JIT之前我们先了解两个概念:静态编译,动态编译。
1、动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
2、JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。
3、自适应动态编译(adaptive dynamic compilation)也是一种动态编译,但它通常执行的时机比JIT编译迟,先让程序“以某种式”先运行起来,收集一些信息之后再做动态编译。这样的编译可以更加优化。
总结
对于“Java是解释执行”这句话,这个说法不太准确。我们开发的Java的源代码,首先通过Javac编译成为字节码(bytecode),然后,在运行时,通过 Java虚拟机(JVM)内嵌的
解释器将字节码转换成为最终的机器码。但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,都提供了JIT(Just-In-Time)编译器,也就是通常所说的
动态编译器,JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行了。
知识扩展
回归正题,对于Java平台的理解,可以从很多方面简明扼要地谈一下,例如:Java语言特性,包括泛型、Lambda等语言特性;基础类库,包括集合、IO/NIO、网络、并发、安全
等基础类库。对于我们日常工作应用较多的类库,面试前可以系统化总结一下,有助于临场发挥。