zoukankan      html  css  js  c++  java
  • Java虚拟机--编译那点事儿

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

    1.编程语言:

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

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

    2.编译

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

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

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

    3.反编译

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

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

      反编译前:

      

      反编译后:

      

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

      再比如:

      

      

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

       

      

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

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

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

      

      反编译后得到:

      

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

      

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

      

  • 相关阅读:
    服务器时间不准导致 com.sun.facelets.impl.DefaultFacelet refresh
    推荐10款来自极客标签的超棒前端特效[第五期] java程序员
    IE10的市场占有率扩充了一倍 java程序员
    固定背景实现的背景滚动特效 java程序员
    支持触摸设备的响应式HTML5音频播放器 AudioPlayer.js java程序员
    WebRTC与Ace在线代码编辑器合作,实现实时协作编程 java程序员
    最流行的JavaScript库,jQuery不再支持IE旧版本 java程序员
    Jquery实现鼠标移上弹出提示框,移出消失 java程序员
    xxx.c: Error: C3065E: type of input file 'xxxx' unknown java程序员
    35+多用途WordPress主题 java程序员
  • 原文地址:https://www.cnblogs.com/lemon-pomelo/p/9373905.html
Copyright © 2011-2022 走看看