Javascript:如何查看本机函数的源代码实现,如toString

时间:2016-10-04 06:59:48

标签: javascript google-chrome open-source native v8

我希望了解一些Javascript函数是如何工作的。对于例如我想了解Chrome的V8引擎如何实现一元( - )操作或String.prototype.toString()方法。

如何查看原生C/C++实施?我在这里看到许多链接到Chromium存储库和V8存储库的答案,但这些都是巨大的,并不是非常适合初学者,并且在我能找到的任何地方都没有任何指南。

我正在寻找类似的东西:

// Pseudo code
function -(arg) {
  return arg * -1
}

显然,我知道我不会在Javascript 中找到这个写的。我只是在寻找类似的细节。

我还没有找到一个简明扼要地展示如何在任何地方找到Javascript函数的本机实现的答案。有人能指出我正确的方向吗?

ECMA规范here为一元行提供以下规范 - 操作:

  

一元 - 操作员

     

一元运算符将其操作数转换为数字类型然后   否定它。注意,否定+0会产生-0,并且会否定-0   产生+0。

     

生产UnaryExpression: - UnaryExpression评估为   如下:

     

expr成为评估UnaryExpression的结果。让oldValue成为。{1}}   ToNumber(GetValue(expr))。如果oldValue为NaN,请返回NaN。归还   否定oldValue的结果;也就是说,用相同的方法计算一个数字   幅度相反但符号相反。

这非常有用,但我想要了解的是,

  

计算幅度相同但符号相反的数字

计算。是number * -1还是其他什么?或者是多种方式?

1 个答案:

答案 0 :(得分:1)

V8中没有单独的运算符代码或单个实现。 V8是一个即时编译器,通过动态编译本机代码来执行所有JavaScript。 V8支持大约10种不同的CPU架构,每种架构有4层编译器。这已经使每个运营商的40个不同的实现。在许多这些编译中,编译经历了一系列阶段,将输入转换为实际的机器代码。在每种情况下,确切的转换取决于编译时可用的类型信息(在先前的运行中收集)。

要了解正在发生的事情,您需要了解V8复杂架构的重要部分,因此在SO回复中回答您的问题几乎是不可能的。如果您只对语义感兴趣,我建议您查看EcmaScript语言定义。

(你引用的片段只是一个帮助函数,用于转换一元运算符的转换编译器内部类型信息,在许多阶段之一。)

编辑:您在更新的问题中引用的EcmaScript定义的摘录是正确的观察地点。请记住,所有JavaScript编号都是IEEE浮点数。这句话基本上是说-只是反转了这个数字的符号位。您需要参考IEEE 754标准了解更多详情。乘法-1.0是一个复杂得多的操作,但在大多数情况下会有相同的结果(可能除NaN操作数外)。