5

我一直在研究 v8 源代码,特别是“mksnapshot”工具如何在 v8 二进制文件中包含本机 javascript 文件(runtime.js、json.js...)的编译图像,并注意到它还包含一个(有点)源的缩小版本。例如,在检查 d8 可执行文件的内容时,我看到以下代码段:

var $JSON=global.JSON;

function Revive(a,b,c){
var d=a[b];
if((%_IsObject(d))){
if((%_IsArray(d))){
var g=d.length;

在“src/json.js”的开头,我看到:

var $JSON = global.JSON;

function Revive(holder, name, reviver) {
  var val = holder[name];
  if (IS_OBJECT(val)) {
    if (IS_ARRAY(val)) {
      var length = val.length;

显然这两个片段是等价的,但第二个在编译过程中被转换为第一个。

如果包含原始代码以使用“toString”进行检查,我会理解,但是当我在 d8 中输入“JSON.stringify”时,我看到的只是“function stringify() { [native code] }”,那么重点是什么这个?

4

2 回答 2

4

实际上快照不包括编译形式的所有内置函数。

V8 通常更喜欢惰性编译以节省空间和时间。如果您编译不使用的东西,则会浪费内存用于生成的代码(非优化编译器生成的代码非常“冗长”)和时间(如果我们谈论的是快照,则在编译或反序列化时)。

所以它可以延迟编译的所有东西 V8 都会延迟编译,这包括内置函数。因此,快照实际上并不包含所有函数的编译版本,并且需要源来编译 rest。

当源存在时,另一件可能的事情是优化:V8 必须有权访问源以应用其自适应优化管道。

于 2012-09-30T16:41:50.860 回答
-1

可能是因为缓存二进制文件使 v8 变得如此之快:它的构建速度非常快。因此,他们采取了极端措施来加快速度。本机代码的预生成二进制文件消除了客户端的思考,使其运行得更快。整个 v8 都有这样的优化。:)

于 2012-09-29T14:22:09.833 回答