谈谈你对Java平台的理解

Java是解释执行还是编译执行?

Java 是解释执行”这句话,这个说法不太准确。我们开发的 Java 的源代码,首先通过 Javac 编译成为字节码(bytecode),然后,在运行时,通过 Java 虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码。但是常见的 JVM,比如我们大多数情况使用的 Oracle JDK 提供的 Hotspot JVM,都提供了 JIT(Just-In-Time)编译器,也就是通常所说的动态编译器, JIT 能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是 解释执行了。 --<Java核心技术36讲>

  1. Java源代码经过Javac编译成.class文件
  2. class文件经JVM解析或编译运行。
    1. 解析:.class文件经过JVM内嵌的解析器解析执行。
    2. 编译:存在JIT编译器(Just In Time Compile 即时编译器)把经常运行的代码作为"热点代码"编译与本地平台相关的机器码,并进行各种层次的优化。
    3. AOT编译器: Java9提供的直接将所有代码编译成机器码执行.

什么叫做一次编译到处执行

我们通常把 Java 分为编译期和运行时。这里说的 Java 的编译和 C/C++ 是有着不 同的意义的,Javac 的编译,编译Java源码生成“.class”文件里面实际是字节码,而不是可以 直接执行的机器码。Java 通过字节码和 Java 虚拟机(JVM)这种跨平台的抽象,屏蔽了操作系 统和硬件的细节,这也是实现“一次编译,到处执行”的基础。–<Java核心技术36讲>

一次编译、到处运行”说的是Java语言跨平台的特性,Java的跨平台特性与Java虚拟机的 存在密不可分,可在不同的环境中运行。比如说Windows平台和Linux平台都有相应的JDK, 安装好JDK后也就有了Java语言的运行环境。其实Java语言本身与其他的编程语言没有特别大 的差异,并不是说Java语言可以跨平台,而是在不同的平台都有可以让Java语言运行的环境 而已,所以才有了Java一次编译,到处运行这样的效果。 严格的讲,跨平台的语言不止Java一种,但Java是较为成熟的一种。“一次编译,到处运行”这种效果跟编译器有关。编程语言的处理需要编译器和解释器。Java虚拟机和DOS类 似,相当于一个供程序运行的平台。 程序从源代码到运行的三个阶段:编码——编译——运行——调试。Java在编译阶段则体现 了跨平台的特点。编译过程大概是这样的:首先是将Java源代码转化成.CLASS文件字节码, 这是第一次编译。.class文件就是可以到处运行的文件。然后Java字节码会被转化为目标机器代码,这是是由JVM来执行的,即Java的第二次编译。 “到处运行”的关键和前提就是JVM。因为在第二次编译中JVM起着关键作用。在可以运行Java虚拟机的地方都内含着一个JVM操作系统。从而使JAVA提供了各种不同平台上的虚拟机制,因此实现了“到处运行”的效果。需要强调的一点是,java并不是编译机制,而是解释机制。Java字节码的设计充分考虑了JIT这一即时编译方式,可以将字节码直接转化成高性能 的本地机器码,这同样是虚拟机的一个构成部分。

总结

谈谈你对Java平台的理解

谈谈你对Java平台的理解