如何查看原生函数(如toString)的源代码实现



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

如何看到本机C/C++实现?我在这里看到了很多链接到Chromium库和V8库的答案,但这些都太大了,对初学者不太友好,而且就我所能找到的,没有任何真正的指南。

我在找这样的东西:

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

显然,我明白我不会在Javascript中找到这个。我只是想找一个类似的细节水平。

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

这里的ECMA规范给出了一元操作的以下规范:

一元运算符

一元操作符将其操作数转换为Number类型,然后否定它。注意,+0等于−0,- 0等于−0生产+ 0。

结果UnaryExpression:—UnaryExpression被求值为:

exprUnaryExpression的评价结果。让oldValue存在ToNumber(GetValue(expr))。如果oldValue为NaN,则返回NaN。返回oldValue阴性结果;也就是说,用相同的方法计算一个数字星等但符号相反

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

计算一个大小相同但符号相反的数

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

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

要理解发生了什么,你需要理解V8复杂架构的重要部分,所以用so来回答你的问题几乎是不可能的。如果您只是对语义感兴趣,我建议您查看EcmaScript语言定义。

(您引用的代码片段只是一个辅助函数,用于在其中一个阶段转换一元操作符的编译器内部类型信息。)

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

最新更新