java虚拟机编译_Java虚拟机--编译那点事儿

当我们写完HelloWorld.java文件后,计算机怎么知道我们要干什么?那就需要说下编译了(可见文章:JIT编译),这里也简单补充点:

1.编程语言:

编程语言分为高级语言和低级语言:C、C++、Java等属于高级语言;机器语言和汇编语言属于低级语言。那和编译有什么关系呢?

简而言之,编译就是把程序员认识的高级语言转换成机器认识的低级语言的过程,可用命令javac进行编译;相对的,也会存在反编译,把机器看得懂的转成程序员看的懂的,理论上是把class文件转成java文件,但实际上是转成了我们可以看的懂的字节码,要想分析程序运行的背后原理,反编译必不可少。

2.编译

再来说下编译,编译可分为前端编译和后端编译,前者与语言有关,目标机器无关;后者与目标机器有关,语言无关。放在Java中,把.java文件编译成.class文件称为前端编译;把.class文件编译成机器语言称为后端编译。

前端编译成的.class文件中的字节码是一种中间代码,其有两点重要性质:易于生成;能轻松的翻译成目标机器上的语言。

后端编译,会将字节码解释成机器指令,为了提高性能和效率,引入了JIT技术,将“热点代码”翻译成机器指令,优化并缓存起来,以备下次使用。详见:JIT编译文章

3.反编译

我们对本地代码进行反编译,来体会一下它的用处。

我们有没有想过枚举类是个什么类?enum是什么意思?这时就需要反编译了:

反编译前:

631e1514d14b0789afecc1aea52494a9.png

反编译后:

05c5269ed5f7c3a2131359a0b4655462.png

经过反编译可知,enum类是一个被final修饰的class并继承了lang包下的Enum类,这样我们就知道它是怎么回事儿了。

再比如:

71a812f78b205792b58382e6a407d9cc.png

2a43d97d390de74de2dccdd910b364ad.png

上面两张图是switch结构的两种数据类型,那有什么不一样呢?看是看不出来的,反编译后就知道了:

f72d81e2b7d75943071a07fc5ed67782.png

54ee569c30e730946408105b86e9752f.png

通过反编译可知,整型的直接比较数值;char类型的比较ascii码,会转成int型,那问题来了,String类型呢?通过反编译将会知道,String类型是通过equals()和hashCode()方法来实现。所以,Switch只支持一种数据类型,那就是整型,其他数据类型都会进行转换。

4.Java 10的本地变量类型推断

3月21日 Java 10发布,简单说一下其本地变量类型的推断。

11a0f4c3ea5232e23e0b3817c4941bf6.png

反编译后得到:

c3922eb4c7e28779368220ede608c081.png

两张图一对比就一目了然,它是个什么样子了。现在都慢慢的换上Java 8了,所以10就先了解这些吧。我们下期再见!

参考资料:http://www.hollischuang.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值