【问题标题】:JavaScript compilation in V8V8 中的 JavaScript 编译
【发布时间】:2017-07-01 10:48:23
【问题描述】:

V8 home(Google 的 JavaScript 引擎)中我们读到:

V8 编译并执行 JavaScript 源代码

  • 这是否意味着 JavaScript 在 V8 中不是解释型语言?

  • V8 是否对 JavaScript 使用即时编译方法?


编辑:还有另一个existing question 已经解决了我的第一个问题,但没有解决第二个问题。

【问题讨论】:

  • 来自wiki“V8第一次执行时将JavaScript源代码直接编译成机器码。没有中间字节码,没有解释器。”跨度>
  • “这是否意味着 JavaScript 在 V8 中不是解释型语言?” – 没有“解释语言”这样的东西。语言是一种语言。时期。解释和编译是解释器或编译器的特征(呃!),而不是语言。

标签: javascript v8 jit interpreted-language compiled-language


【解决方案1】:

这是否意味着 JavaScript 在 V8 中不是解释型语言?

答案是“视情况而定”。

从历史上看,V8 使用其“full-codegen”编译器直接编译为机器代码,该编译器生成未优化的代码,使用 inline caching 来实现大多数操作,例如算术运算、变量和属性的加载和存储等。

full-codegen 生成的代码通过在函数被调用和跳回循环顶部时调整计数器来跟踪每个函数的“热”程度。

它还跟踪每个表达式中使用的变量的类型。

如果它确定一个函数(或函数的一部分)非常热,并且它已经收集了足够的类型信息,它会触发“Crankshaft”编译器生成更好的代码。

但是,V8 开发人员正在积极地转移到一个不同的系统,他们从一个名为“Ignition”的解释器开始,然后使用一个名为“Turbofan”的编译器为热函数生成优化代码。

这里有几篇来自 V8 开发者博客的文章描述了这一点:

V8 是否对 JavaScript 使用即时编译方法?

是的,在很多方面。

首先,它具有惰性解析和惰性编译机制。这意味着当它解析一个 Javascript 源文件时,它会急切地解析最外面的范围,立即生成完整的代码生成代码。

但是,对于文件中定义的函数,它会跳过它们,只记录函数的名称及其源代码的位置。它会生成一个虚拟函数,该函数只是调用 V8 运行时来触发函数的实际编译。

其次,它有一个如上所述的两级编译器管道,使用全代码生成+曲轴或点火+涡轮风扇。

当编译被触发时,它最初会生成未优化的代码或点火字节码(它可以非常快地完成),然后如果代码很热,它会触发优化的重新编译(速度慢得多,但生成的效果要好得多代码)。

【讨论】:

  • 哇。我今天访问了 V8 博客,看到了关于测试 Ignition 的内容,记得回答了这个问题,然后来更新了我的答案——发布了编辑后,看到你昨天包含了该信息。好一个!你的让我的答案过时了。有点希望我注意到之前更新它。 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 1970-01-01
  • 2016-08-23
相关资源
最近更新 更多