【问题标题】:The confusion with JIT compilation in V8V8 中与 JIT 编译的混淆
【发布时间】:2020-01-19 07:10:56
【问题描述】:

我在研究 V8 的内部工作原理时遇到了 JIT 编译器这个术语。最初,我在这篇文章https://www.quora.com/How-does-the-JIT-compiler-work-in-JS 中读到,V8 中的 JIT 编译器称为“Ignition”,它是解释器。然后,我得出结论,JIT 编译器只是解释器。但后来我发现另一篇文章https://blog.logrocket.com/how-javascript-works-optimizing-the-v8-compiler-for-efficiency/ 将jit-compilation 描述为解释器和编译器的组合。伙计们,JIT 编译器真的是解释器和编译器的组合吗?还是 JIT 编译器只是解释器?

【问题讨论】:

  • 及时____? (填空;平凡的可以排除最后一题的假设之一)
  • 发出机器码的JIT“编译器”是TurboFan; Ignition 表示内部字节码,尽管从 AST 编译到该字节码,但实际上并不认为是 JIT,因为它不直接针对机器硬件。 (相比之下,Java 需要一个显式的字节码编译步骤,在执行期间是 JIT 的。)
  • @user2864740,感谢您的好心 cmets,所以您的意思是 jit 编译器实际上并不是解释器和编译器的组合,而是编译器本身优化了我们的代码。是对的吗?如果是,那为什么会及时调用呢?
  • @Mita 因为它在代码执行时动态优化,而不是在应用程序运行之前,如 Ahead of Time (AOT) 编译器。您可以在 C 中看到 AOT,例如,您首先 编译应用程序并然后 运行它。 JIT 本质上是相反的。

标签: javascript v8


【解决方案1】:

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

  • “JIT”的意思是“准时”,并且意味着某些执行环境动态地(即在运行时)决定产生某些东西(通常是机器代码——通俗地说,“JIT”往往意味着“准时” -time compilation”,虽然如果你决定在你饿的时候准备一顿饭,然后在它完成后马上吃,那么这在技术上也是“JIT”准备。)典型的对立面是是一种类似于 C/C++ 的语言,它在交付给用户并由用户执行之前很久就由开发人员编译。另一个不同方向的“相反”是执行环境,它执行某些东西而不动态生成机器代码。这种环境通常被称为“解释器”。

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

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

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

【讨论】:

  • 这很有趣,我假设解释器是先构建的,然后出于性能原因对其进行了编译。为什么后来加了口译员?是否存在节点只能解释的环境?
  • 开发解释器的主要原因是它节省了相当多的内存,因为它的字节码比机器码小得多。这主要在移动设备上很重要。能够支持不允许任何 JIT 编译的环境是次要好处,请参阅v8.dev/blog/jitless
  • 谢谢,将阅读链接。当然,我的意思是指定 v8 而不是专门指定节点 :)
猜你喜欢
  • 2023-04-02
  • 2015-11-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 2010-10-06
  • 2023-03-11
  • 2017-12-07
  • 1970-01-01
相关资源
最近更新 更多