JVM和字节码的关系

文章目录

  • 程序运行的两种方式:静态编译和动态解释
  • Java严格说来是“半解释半编译”型的语言
    • 通过编译原理理解java虚拟机编译和解释机制
  • 字节码文件和JVM的关系
  • JVM如何实现跨平台

程序运行的两种方式:静态编译和动态解释

  • 静态编译的程序在执行前全部被翻译为机器码
  • 动态解释执行的则是一句一句边运行边翻译

Java严格说来是“半解释半编译”型的语言

  • Java代码首先由javac编译器编译成字节码(ByteCode)。字节码文件中JVM指令(也称字节码指令)是JVM唯一能够识别的指令,JVM执行JVM指令时,通过JVM解释器逐条读取字节码文件中JVM指令解释为机器码执行。当某一方法调用次数达到即时编译定义的阈值时,就会触发即时编译器JIT进行优化生成机器码。
  • 字节码文件和JVM指令的规范由JVM规范定义,JVM在不同的硬件平台上需要有不同实现,以达到所谓“一次编写,到处运行”的目标。
    解释器的作用: 省去编译的时间,使代码立即执行。
    JIT编译器的作用: 运行时将反复执行的热点代码编译为二进制机器码,避免解释器反复解释,提高运行效率。

通过编译原理理解java虚拟机编译和解释机制

在编译原理中Javac编译器被称为前端编译器,而JIT编译器被称为后端编译器。
(1)在编译原理中,通常将编译分为前端和后端。其中前端会对程序进行词法分析、语法分析、语义分析,然后生成一个中间表达形式(称为IR:Intermediate Representation)。后端再讲这个中间表达形式进行优化,最终生成目标机器码。
注意:在Java中,javac之后生成的就是中间表达形式(.class)
(2)JVM在执行时,首先会逐条读取IR的指令来执行,这个过程就是解释执行的过程。当某一方法调用次数达到即时编译定义的阈值时,就会触发即时编译,这时即时编译器会将IR进行优化,并生成这个方法的机器码,后面再调用这个方法,就会直接调用机器码执行,这个就是编译执行的过程。

字节码文件和JVM的关系

JVM和字节码的关系_第1张图片

  • JVM虚拟机只能识别字节码文件,任何语言只需要按照JVM规范中关于字节码文件的标准生成字节码文件,就可以在JVM中运行,而不仅仅只有java可以在JVM中运行,其他如Groovy、kotlin也可以在JVM编译器中运行。
  • JVM指令是JVM规范中定义的指令集,在不同的平台JVM指令对应了不同的实现,从而实现了一次编写到处运行。
  • 不同的语言需要不同的前端编译器(如javac、groovyc编译器)等,JVM只和字节码有关系,而与具体语言没关系。

JVM如何实现跨平台

不同CPU架构的汇编指令集不一致,jvm为了实现跨平台,在JVM规范里定义了JVM指令集,针对同一指令在不同平台架构做不同实现(既有C++代码也内联了汇编代码),从而实现了跨平台。

不同语言的源文件通过各自的编译器按照JVM规范编译为字节码文件,JVM加载到内存中,通过解释器解释或通过JIT即时编译器将JVM指令翻译为二进制机器码,交给CPU执行。

你可能感兴趣的:(java基础,JVM)