java字节码和机器码_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的关系

901c0f21f69c4b9949a781c5136eb636.png

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执行。

转载自CSDN-专业IT技术社区

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值