首页 / 知识
关于编译:实时(JIT)编译器有什么作用?
2023-04-17 08:01:00
What does a just-in-time (JIT) compiler do?与非JIT编译器相比,JIT编译器具体做什么? 有人可以给出一个简洁易懂的描述吗? 一个JIT编译器在程序启动后运行,并将代码(通常是字节码或某种VM指令)动态编译(或者只是及时调用),形成通常更快的形式,通常是主机CPU的本机指令系统。 JIT可以访问动态运行时信息,而标准编译器不能并且可以进行更好的优化,例如内联频繁使用的函数。 这与在程序首次运行之前将所有代码编译为机器语言的传统编译器形成对比。 换句话说,传统编译器在您第一次运行它之前将整个程序构建为EXE文件。对于较新的样式程序,使用伪代码(p代码)生成程序集。只有在OS上执行程序之后(例如,通过双击其图标),(JIT)编译器才会启动并生成基于Intel的处理器或其他任何人都能理解的机器代码(m代码)。 最初,编译器负责将高级语言(定义为高于汇编程序的语言)转换为目标代码(机器指令),然后将其(通过链接器)链接到可执行文件中。 在语言发展的某一点上,编译器会将高级语言编译成伪代码,然后由解释器解释它来运行程序。这消除了目标代码和可执行文件,并允许这些语言可移植到多个操作系统和硬件平台。 Pascal(编译为P-Code)是第一个; Java和C#是最近的例子。最终,术语P-Code被字节码替换,因为大多数伪操作都是一个字节长。 Just-In-Time(JIT)编译器是运行时解释器的一个特性,它不是在每次调用方法时解释字节码,而是将字节码编译成正在运行的机器的机器代码指令,然后调用它目标代码。理想情况下,运行目标代码的效率将克服每次运行时重新编译程序的低效率。
JIT-及时 典型场景: 源代码完全转换为机器代码 JIT场景: 源代码将转换为汇编语言,如结构[对于C#的ex IL(中间语言),对于java的ByteCode]。 仅当应用程序需要所需的代码仅转换为机器代码时,中间代码才转换为机器语言。 JIT与非JIT比较:
JIT示例: 正如其他人所说 JIT代表Just-in-Time,这意味着代码在需要时编译,而不是在运行时之前编译。 只是为了向上面的讨论添加一点,JVM维护一个函数执行时间的计数。如果此计数超过预定义的限制,JIT会将代码编译为机器语言,这可以由处理器直接执行(与javac将代码编译为字节码然后java的正常情况不同 - 解释器逐行解释此字节码将其转换为机器代码并执行)。 此外,下次计算该函数时,再次执行相同的编译代码,而不同于正常解释,其中代码被逐行地再次解释。这使得执行更快。 JIT编译器仅在首次执行时将字节代码编译为等效的本机代码。每次连续执行时,JVM仅使用已编译的本机代码来优化性能。
如果没有JIT编译器,JVM解释器会逐行转换字节代码,使其看起来好像正在执行本机应用程序。
资源 JIT代表Just-in-Time,这意味着代码在需要时编译,而不是在运行时之前编译。 这很有用,因为编译器可以生成针对您的特定计算机优化的代码。像普通的C编译器一样,静态编译器会将所有代码编译到开发人员机器上的可执行代码中。因此,编译器将基于某些假设执行优化。它可以更慢地编译并进行更多优化,因为它不会减慢用户执行程序的速度。 在Java编译器生成字节代码(体系结构中立)之后,执行将由JVM(在Java中)处理。字节代码将由加载器加载到JVM中,然后解释每个字节指令。 当我们需要多次调用一个方法时,我们需要多次解释相同的代码,这可能需要更多的时间。所以我们有JIT(即时)编译器。当字节被加载到JVM(其运行时)时,整个代码将被编译而不是解释,从而节省时间。 JIT编译器仅在运行时工作,因此我们没有任何二进制输出。
即时编译器(JIT): 例如,如果我们的java代码中有一个循环语句:
如果i的值为0,则上述循环代码运行10次。 由于同一条指令要执行10次,因此无需一次又一次地编译字节码10次。在这种情况下,有必要仅编译该代码一次,并且可以将值更改所需的次数。因此,Just In Time(JIT)编译器会跟踪这些语句和方法(如上所述),并将这些字节代码编译成机器代码以获得更好的性能。 另一个类似的例子是在字符串/句子列表中使用"正则表达式"搜索模式。 JIT编译器不会将所有代码编译为机器代码。它编译在运行时具有类似模式的代码。 请参阅有关了解JIT的Oracle文档以了解更多信息。 你有一些代码被压缩成一些IL(中间语言)。运行程序时,计算机无法理解此代码。它只能理解本机代码。因此,JIT编译器可以动态地将您的IL编译为本机代码。它在方法级别执行此操作。 我知道这是一个旧线程,但运行时优化是JIT编译的另一个重要部分,似乎没有在这里讨论。基本上,JIT编译器可以在程序运行时监视程序,以确定改进执行的方法。然后,它可以在运行期间动态地进行这些更改。谷歌JIT优化(javaworld有一篇非常好的文章。) 即时编译器(JIT)是一个软件,它接收不可执行的输入并返回要执行的相应机器代码。例如:
这样做的结果是,对于某个CPU架构,必须安装适当的JIT编译器。 差异编译器,解释器和JIT 虽然在我们想要将源代码转换为机器代码时通常会有例外,但我们可以使用:
Jit代表及时编译器 在特定系统平台上使用java及时编译器(实际上是第二个编译器)将字节码符合特定系统代码,一旦代码被jit编译器重新编译,它通常会在计算机中更快地运行。 即时编译器随虚拟机一起提供,可选择使用。它将字节码编译为立即执行的特定于平台的可执行代码。 非JIT编译器获取源代码并在编译时将其转换为机器特定的字节代码。 JIT编译器获取在编译时生成的机器不可知字节代码,并在运行时将其转换为机器特定的字节代码。 Java使用的JIT编译器允许单个二进制文件在多个平台上运行而无需修改。 实时(JIT)编译(也称为动态转换或运行时编译)是一种执行计算机代码的方法,该代码涉及程序执行期间的编译 - 在运行时 - 而不是在执行之前。 IT编译是两种传统的机器代码转换方法的组合 - 提前编译(AOT)和解释 - 并结合了两者的优点和缺点。 JIT编译将编译代码的速度与解释的灵活性相结合。 让我们考虑JVM中使用的JIT, 例如,HotSpot JVM JIT编译器生成动态优化。换句话说,他们在Java应用程序运行时做出优化决策,并生成针对底层系统架构的高性能本机机器指令。 当选择一种方法进行编译时,JVM将其字节码提供给即时编译器(JIT)。在正确编译方法之前,JIT需要理解字节码的语义和语法。为了帮助JIT编译器分析该方法,它的字节码首先在一个称为跟踪树的内部表示中重新构造,它比机器代码更接近于字节码。然后对该方法的树执行分析和优化。最后,树被翻译成本机代码。
参考:
80%的时间使用20%的字节代码。 JIT编译器获取这些统计信息并通过添加内联方法,删除未使用的锁等以及创建特定于该机器的字节码来优化这20%的字节代码以更快地运行。我引用这篇文章,我发现它很方便。 http://java.dzone.com/articles/just-time-compiler-jit-hotspot JIT指的是少数JVM实现中的执行引擎,一个更快但需要更多内存的实时引擎,是一个即时编译器。在此方案中,方法的字节码在第一次调用方法时被编译为本机机器代码。然后缓存该方法的本机机器代码,以便下次调用相同方法时可以重用它。 出于性能原因,JVM实际上在运行时执行编译步骤。这意味着Java没有干净的编译 - 执行分离。它首先执行从Java源代码到字节码的所谓静态编译。然后将此字节码传递给JVM以供执行。但是执行字节码很慢,因此JVM测量字节码的运行频率,当它检测到频繁运行的代码"热点"时,它会执行从"热点"代码(热点分析器)的字节码到机器代码的动态编译。今天有效的Java程序是由机器码执行运行的。 |
最新内容
相关内容
linux命令中的作用?
linux命令中的作用?,系统,网络,地址,管理,信息,服务,软件,工具,命令,通用,linux下的命令都是干什么用的?echo命令的意思是在显示器上显示一段linux编译完运行命令?
linux编译完运行命令?,系统,代码,环境,工具,信息,命令,文件,程序,终端,编辑,在linux中编译C输入完程序后输入个:wq然后按什么键就然后就回到了linux命令mv的作用?
linux命令mv的作用?,命令,管理,系统,文件,工作,目录,互动,名称,情况,文件夹,linuxmv命令详解mv命令是move的缩写,可以用来移动文件或者将文件改linux中编译命令是?
linux中编译命令是?,系统,代码,工具,基础,名字,命令,编译器,文件,终端,源程序,要怎么在linux系统中编译并运行c程序1、在Linux下面,如果要编译linux基本命令和作用?
linux基本命令和作用?,系统,工作,管理,信息,命令,代码,基础,工具,简介,目录,linux系统常用操作命令1、linux常用命令有pwd命令、cd命令、ls命linux源码编译命令?
linux源码编译命令?,代码,设备,环境,工作,官网,最新,下来,电脑,软件,项目,如何编译armlinux的go?第一次编译时用的是root用户(第二次用一般用户linux终端编译命令?
linux终端编译命令?,代码,工具,环境,系统,终端,文件,源程序,编译器,语言,指令,linux终端下如何进行C语言编译在Linux下面,如果要编译一个C语言linuxmv命令作用?
linuxmv命令作用?,系统,文件,命令,名称,目录,文件夹,源文件,缩写,参数,目标,linux中mv命令使用详解mv命令是move的缩写,可以用来移动文件或者将常用的linux命令作用?
常用的linux命令作用?,工作,系统,信息,管理,地址,时间,命令,目录,平均,项目,linux常用命令及用法1、linux系统常用操作命令如下:ls:全拼list,功能linux实时读日志命令?
linux实时读日志命令?,系统,信息,实时,工作,对比,管理,时间,命令,日志,平均,Linux服务器查看日志的几种方法1、如下图所示,先cd到我们需要监控linux实时读日志命令?
linux实时读日志命令?,系统,信息,实时,工作,对比,管理,时间,命令,日志,平均,Linux服务器查看日志的几种方法1、如下图所示,先cd到我们需要监控linux命令行编译文件?
linux命令行编译文件?,代码,系统,项目,工具,网上,手机,电脑,地址,官网,文件,Linux下,用什么命令编译m文件为可执行文件所以使用gcc test -o te