前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >傻傻分不清:JIT编译器,解释器,AOT编译器

傻傻分不清:JIT编译器,解释器,AOT编译器

原创
作者头像
用户7257200
修改2020-05-20 14:28:40
5.5K0
修改2020-05-20 14:28:40
举报

编译器和解释器

编译器和解释器的区别在于是否编译和执行过程是否是同时进行。

编译器所干的事,将一门语言 X 编译为另一门语言 Y (可以是语言 X、高级语言、低级语言等),整个编译过程涉及词法分析、语法分析、语义分析。该过程往往由程序员在编写程序时完成。

而解释器则直接将语言 X 编写的程序在目标机器上运行。CPU就可以被当作某种指令集合的解释器。事实上,CPU的指令集合可能比我们看到的更复杂,其内部由更多的私有指令集合组成,转化为可见的公有指令集合。

JIT编译器和AOT编译器

引入解释器的思想,逐渐演化出JIT编译器(Just-in-Time Complier):和AOT编译器(Ahead-of-Time Complier)。

两者主要是区分编译过程出现的时机。前者在程序执行时进行编译;后者则是在程序执行前进行编译。需要注意的是,JIT编译器将语言 X 转化为机器代码时,需要解释器的参与。可以认为,没有解释器,亦不存在JIT编译器。

Java JVM:JIT编译器和解释器

JVM.png
JVM.png

Java语言的编译和执行中,均涉及编译器和解释器。

首先,程序员在编写Java程序时,利用Java编译器,将Java语言编译成Java ByteCode;之后,执行过程中需要使用JVM(Java虚拟机)将ByteCode转化为机器代码。对于JVM的设计有两种,一种使用解释器直接在目标机器上执行,一种则是使用JIT编译器。前者使编译和执行的过程同时进行,对于执行次数比较少的ByteCode来说,此处的编译时间可以忽略不计;而对于频繁执行的ByteCode来说,编译时间是累加的。因此JVM通过统计ByteCode的执行次数来进行优化,其根据执行频率判断是否将ByteCode预先编译成机器代码,以节省时间,提高执行效率。

注:如文中有误或者不清楚的地方欢迎留言勘误。

参考资料

[1] https://stackoverflow.com/questions/1326071/is-java-a-compiled-or-an-interpreted-programming-language

[2] https://www.quora.com/Why-do-we-call-it-JIT-compiler-and-not-JIT-interpreter-to-refer-to-the-thing-that-converts-the-Java-bytecode-to-the-machine-code#MoreAnswers

[3] https://softwareengineering.stackexchange.com/questions/246094/understanding-the-differences-traditional-interpreter-jit-compiler-jit-interp

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 编译器和解释器
  • JIT编译器和AOT编译器
  • Java JVM:JIT编译器和解释器
    • 参考资料
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档