我在研究 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 编译器只是解释器吗?
V8 开发人员在这里。只是为了澄清和扩展评论者已经指出的内容:
“JIT”的意思是“及时”,意味着一些执行环境动态地(即在运行时)决定产生一些东西(通常是机器代码——通俗地说,“JIT”往往意味着“及时编译”,尽管如果你决定正好在你饿的时候准备一顿饭,然后在它吃完后马上吃,那么从技术上讲,这也是“JIT”准备。)规范的对立面是像 C/C++ 这样的语言,它由编译器编译开发人员,早在交付给用户并由用户执行之前。另一个不同方向的“相反”是执行环境,它在不动态生成机器代码的情况下执行某事。这种环境通常被称为“解释器”。
过去,V8 总是产生机器码。它根本无法执行不首先将其编译为机器代码的 JavaScript。显然这发生在客户端,所以它是一个即时编译器的教科书示例(或者,更准确地说,一组几个编译器......哦,细节!)。
近年来,V8 已将解释器作为其第一个执行层。现在术语的使用变得复杂,因为这个解释器“及时”将 JavaScript“编译”为字节码(然后被解释),但是当有人说“JIT 编译器”时,他们通常意味着它不是解释器。
V8 也有一个生成机器码的优化编译器。它在运行时运行(当一个函数被认为是热函数时),所以它是一个即时编译器。
| 归档时间: |
|
| 查看次数: |
1715 次 |
| 最近记录: |