我想了解一些 Javascript 函数在幕后是如何工作的。例如我想了解 Chrome 的 V8 引擎如何实现一元 (-) 操作或 String.prototype.toString()
方法。
如何查看 native C/C++
实现?我在这里看到许多链接到 Chromium 存储库和 V8 存储库的答案,但这些答案很大,对初学者不太友好,据我所知,在任何地方都没有任何指南。
我正在寻找这样的东西:
// Pseudo code
function -(arg) {
return arg * -1
}
很明显,我知道我不会找到用 Javascript 编写的 。我只是在寻找类似级别的详细信息。
我还没有找到简明扼要地说明如何在任何地方找到 Javascript 函数的 native 实现的答案。有人能指出我正确的方向吗?
ECMA 规范 here给出一元操作的以下规范:
Unary - Operator
The unary - operator converts its operand to Number type and then negates it. Note that negating +0 produces −0, and negating −0 produces +0.
The production UnaryExpression : - UnaryExpression is evaluated as follows:
Let
expr
be the result of evaluatingUnaryExpression
. LetoldValue
beToNumber(GetValue(expr))
. If oldValue isNaN
, returnNaN
. Return the result of negatingoldValue
; that is, compute a Number with the same magnitude but opposite sign.
这很有用,但我想了解的是,如何
compute a Number with the same magnitude but opposite sign
是计算出来的。是 number * -1
还是其他?还是多种方式?
最佳答案
V8 中没有单个运算符的代码片段或单一实现。 V8 是一个即时编译器,它通过将所有 JavaScript 动态编译为 native 代码来执行所有 JavaScript。 V8 支持大约 10 种不同的 CPU 架构,每种架构都有 4 层编译器。这已经为每个运算符制作了 40 种不同的实现。在其中的许多项目中,编译都经过了一个很长的阶段流水线,将输入转换为实际的机器代码。在每种情况下,确切的转换取决于编译时可用的类型信息(在之前的运行中收集)。
要了解发生了什么,您需要了解 V8 复杂架构的重要部分,因此几乎不可能在 SO 回复中回答您的问题。如果您只对语义感兴趣,我建议您查看 EcmaScript 语言定义。
(您引用的代码片段只是一个辅助函数,用于在多个阶段中的一个阶段为一元运算符转换编译器内部类型信息。)
编辑:您在更新的问题中引用的 EcmaScript 定义的摘录是正确的地方。请记住,所有 JavaScript 数字都是 IEEE float 。这句话基本上是说 -
只是反转这样一个数字的符号位。您必须引用 IEEE 754 标准以获取更多详细信息。与 -1.0 的乘法运算要复杂得多,但在大多数情况下会产生相同的结果(可能 NaN 操作数除外)。
关于Javascript:如何查看 toString 等 native 函数的源代码实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39846048/