最新浅析java源代码转换为机器码的编译执行过程

  • 我们先来看一下编译型语言和解释型语言的之间的区别联系

编译型语言:C/C++

      编译过程是将源代码(高级语言,人类容易读,容易理解),转换为机器码(cpu能理解,能高效的执行)的过程.

解释型语言:JavaScript  python 等

     直接解释源代码,并且直接执行,没有编译过程

编译程序是整体编译完了,再一次执行,而解释程序是边解释边执行.

  • 那么java是编译型语言还是解释型语言或者是编译-解释型语言呢?

接下来我们一起来看下java语言的执行过程

  •  首先是你写好的java源代码(根据JDK9的新特性,接下来将有三种方式将java源代码转换为机器码)
  1.      第一种方法:用javac编译器将java源代码编译成我们常见的 .class文件,然后程序在运行时,JVM将需要用到的 .class文件加载到内存中,从class文件中逐行读出一条指令,JVM中解释器解释一条指令,接着执行一条指令,如我们上面所说,边解释边执行,从而达到将.class文件翻译为机器码
  2.      第二种方式:开始依然是由javac编译为.class文件  ,但是我们平时使用的大多数oracle JDK 提供的Hotspot JVM都提供了JIT(Just In Time)编译器,也就是我们平时所说的动态编译器.   根据二八定律,消耗大部分资源的只有那一小部分代码(热点代码).在程序运行时,JIT通过预热(收集信息找出热点)将热点代码转换为机器码.JIT为方法级,会将编译过程的字节码缓存在codeCache中.在这种情况下,部分热点代码就是编译执行而不是解释执行了.
  3.      第三种方式:除了我们日常java使用模式,还有一种新的编译方式即AOT(ahead-of-time complication),直接将字节码编译成机器码,这样避免了JIT等方面的预热消耗.如oracle JDK9就引入了实验性的AOT特性,并增加了新的jaotc工具.
    aot是编译期间,静态的,直接编译成类似类库的东西

    综合我的理解,就目前的主流java版本中,个人觉得单纯说java是编译型语言或者说是解释型语言,是不准确的.比如JDK8,就是编译与解释混合的模式.即所谓的混合模式(-Xmixed)

     欢迎多多交流指正

猜你喜欢

转载自blog.csdn.net/youngogo/article/details/81106275
今日推荐