专栏首页Effective Objective C傻傻分不清:JIT编译器,解释器,AOT编译器
原创

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

编译器和解释器

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

编译器所干的事,将一门语言 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

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

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • OOP六大原则

    最近面试字节跳动的时候,被问起面向对象编程的六大原则,想来已经忘光了,重新复习整理一下。

    用户7257200
  • 那些年刷力扣遇到的坑:众数问题

    该方法利用快排中 partition 操作查找中位数,即根据 partition 操作数的 index 判断是否为中位数,循环:若 index == len/2...

    用户7257200
  • 秋招iOS面经:过五关斩六将

    这个时候,面试官一方面想仔细看一下你的简历写了些啥,一方面希望候选者能将简历上的内容融会贯通,给面试官娓娓道来。

    用户7257200
  • 社交概念与SDN模型有什么相似之处?

    社交原则似乎与网络工程,设计和软件定义网络有着奇怪的联系,或许就像很多人说的一个看似无关的原则通常可以应用于其他场景。社会辅助性原则对网络控制平面的使用和SDN...

    SDNLAB
  • Java面试题合集

    1.抽象类与接口的区别是什么? 一个类可以实现多个接口,但是只能继承以及抽象类。类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声...

    Java高级架构
  • 精选21道Java后端面试题,看完你也能唬住面试官拿30K

    用数组实现队列时要注意 溢出 现象,这时我们可以采用循环数组的方式来解决,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。

    欧阳愠斐
  • JVM系列第4讲:从源代码到机器码,发生了什么?

    在上篇文章我们聊到,无论什么语言写的代码,其到最后都是通过机器码运行的,无一例外。那么对于 Java 语言来说,其从源代码到机器码,这中间到底发生了什么呢?这就...

    陈树义
  • Java的面试基础题(一)

    Java虚拟机是一个可执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。 Java被设计成允许应用程序可以运行在任意的...

    Demo_Yang
  • Memcached 只允许本地访问 11211 端口 解决未授权漏洞

    魏艾斯博客www.vpsss.net
  • 2020年网络安全行业趋势预测

    2019年网络安全形势已然更加复杂,网络攻击手段更为多样,数据泄露、勒索软件、APT攻击等安全事件频发。此外,网络安全市场也在急剧膨胀,快速发展,安全产品更新快...

    FB客服

扫码关注云+社区

领取腾讯云代金券