专栏首页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 条评论
登录 后参与评论

相关文章

  • JIT-动态编译与AOT-静态编译:java/ java/ JavaScript/Dart乱谈

    C 和 C++ 之类的编译语言性能远超Java,但是生成的代码只能在有限的几种系统上执行,这就有了Java的存在基础(JVM-跨平台)

    周陆军
  • JVM系列第4讲:从源代码到机器码,发生了什么?

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

    陈树义
  • Android虚拟机的JIT编译器

    最近参加了华为方舟的Workshop,从编译到Runtime都有了一些体会,并且对于虚拟机的运行也有了一些了解。

    None_Ling
  • 【Android开发丨主题周】ART 的上位与 JIT 的回归

    Android应用程序主要是通过Java语言开发的(当然,也可以结合NDK通过C/C++开发。另外,从Android N开始,Kotlin已经成为Android...

    博文视点Broadview
  • 如何向面试官解释JVM

    Java 虚拟机(Java Virtual Machine,JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux...

    黑洞代码
  • 快来了解JDK10中引入的全新JIT编译器:Graal

    在(JDK10要来了:下一代 Java 有哪些新特性?)文中,我们提到jdk10中包含有一个实验性质的编译器(compiler)。它的名字叫做:Graal。这是...

    ImportSource
  • 简单聊聊 Dart 的 JIT 和 AOT 模式

    简单来说,Dart Native 同时支持 JIT 和 AOT。Dart 这种设计好处如下:

    Weaster
  • Android各版本虚拟机的Dexopt区别

    从Android 2.1版本到现在的Android 11 , 中间虚拟机变化过三次 :

    None_Ling
  • Java关于 JVM JDK 和 JRE 通俗的解答

    Java虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们...

    赵哥窟
  • 移动跨平台框架Flutter详细介绍和学习线路分享

    Flutter是一款移动应用程序SDK,一份代码可以同时生成iOS和Android两个高性能、高保真的应用程序。 Flutter目标是使开发人员能够交付在不同...

    Android技术干货分享
  • .NET平台系列7 .NET Core 体系结构详解

      .NET Core 是基于.NET Framework 为基础,借鉴了其优秀的思想与强大的功能,经过重新设计与构建,实现了.NET Framework 中...

    张传宁IT讲堂
  • 从JVM到Dalivk再到ART(class,dex,odex,vdex,ELF)

    现在市面上的 Android 手机大部分都是运行的是ART虚拟机了。还记得自己一部 Android手机(HuaweiG520),Android4.1 系统。那时...

    静默加载
  • Python 为什么这么慢?

    大家好,我是猫哥。今天分享一篇文章,讨论了拖慢 Python 整体性能的三大原因。在开始正文之前,需要说明一下(免得有人误以为 Python 慢就不值得使用):...

    Python猫
  • Flutter为什么使用Dart?

    老孟导读:关于Flutter为什么使用Dart?这个话题,就像PHP是世界上最好的语言一样,争论从来没有停止过,有很多说法,比如:

    老孟Flutter
  • 简析 .NET Core 构成体系

    前文介绍了.NET Core 在整个.NET 平台所处的地位,以及与.NET Framework的关系(原文链接),本文将详细介绍.NET Core 框架的构成...

    莫问今朝
  • Dart 代码的组件集合Dart VM

    Dart VM 从某种意义上说是一个虚拟机,它为高级编程语言提供了一个执行环境,「但这并不意味着 Dart 在 Dart VM 上执行时总是需要被解释或 JIT...

    Weaster
  • 编译器和解释器的简介|编译原理

    1.1 Introduction to Compilers and interpreters

    仇诺伊
  • 终于开始了,微软的野心将通过全场景开发平台.NET 5体现得淋漓尽致!

    现在都在谈论全场景开发,也就是用一套开发工具,可以开发包括但不限于桌面、移动、IOT、游戏、Web等平台的应用。这样对于开发人员是非常爽的。本文将介绍微软推出的...

    蒙娜丽宁
  • JIT优化之道

    《JIT优化之道》是去年在公司的一次分享,对于公司组织分享我是赞同又不赞同,怎么讲呢?

    码农戏码

扫码关注云+社区

领取腾讯云代金券