Javascript V8中与JIT编译的混淆

Javascript V8中与JIT编译的混淆,javascript,v8,Javascript,V8,我在研究V8的内部工作原理时遇到了JIT编译器这个术语。最初,我在本文中读到,V8中的JIT编译器被称为“点火”,它是一个解释器。然后,我得出结论,JIT编译器只是一个解释器。但后来我发现另一篇文章将jit编译描述为解释器和编译器的组合。伙计们,JIT编译器真的是解释器和编译器的结合吗?或者JIT编译器只是解释器而已?V8开发者在这里。为了澄清和扩大评论人士已经指出的内容: “JIT”意味着“及时”,意味着某些执行环境动态地(即在运行时)决定生成某些东西(通常是机器代码——通俗地说,“JIT”

我在研究V8的内部工作原理时遇到了JIT编译器这个术语。最初,我在本文中读到,V8中的JIT编译器被称为“点火”,它是一个解释器。然后,我得出结论,JIT编译器只是一个解释器。但后来我发现另一篇文章将jit编译描述为解释器和编译器的组合。伙计们,JIT编译器真的是解释器和编译器的结合吗?或者JIT编译器只是解释器而已?

V8开发者在这里。为了澄清和扩大评论人士已经指出的内容:

  • “JIT”意味着“及时”,意味着某些执行环境动态地(即在运行时)决定生成某些东西(通常是机器代码——通俗地说,“JIT”倾向于意味着“及时编译”,尽管如果你决定在饿的时候准备一顿饭,吃完后马上吃,那么从技术上讲,这也是“JIT”准备。)规范的反面是像C/C++这样的语言,它是由开发人员编译的,在交付给用户并由用户执行之前很久。另一个不同方向的“反面”是执行环境,它执行某些东西而不动态生成机器代码。这种环境通常被称为“解释器”

  • 过去,V8总是产生机器代码。它根本无法执行不首先将其编译为机器代码的JavaScript。显然,这是在客户机上发生的,所以这是一个即时编译器(或者更准确地说,是一组多个编译器…哦,好吧,细节!)的教科书示例

  • 近年来,V8已经有了一个解释器作为它的第一个执行层。现在术语的使用变得复杂了,因为这个解释器“及时地”将“JavaScript”编译成字节码(然后进行解释),但当有人说“JIT编译器”时,他们通常意味着它不是解释器

  • V8还有一个生成机器代码的优化编译器。它在运行时运行(当函数被认为是热的时候),所以它是一个即时编译器


及时吗?(填充一个空白;在最后一个问题中的一个假设可以被排除),发出机器代码的JIT“编译器”是TurboFan;Ignition表示内部字节码,尽管存在从AST到该字节码的编译,但这并不真正被视为JIT,因为它不指导目标机器硬件。(与Java相比,Java需要对字节码进行显式编译,字节码在执行过程中是JIT的。)@user2864740,感谢您的评论,所以您的意思是JIT编译器实际上不是解释器和编译器的组合,而是优化代码的编译器本身。是这样吗?如果是这样的话,为什么要及时调用它?@Mita,因为它在执行代码时会动态优化,而不是在应用程序像提前(AOT)编译器一样运行之前。您可以在C中看到AOT,例如,您首先编译应用程序,然后运行它。JIT本质上是相反的。