我希望了解一些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
还是其他什么?或者是多种方式?
答案 0 :(得分:1)
V8中没有单独的运算符代码或单个实现。 V8是一个即时编译器,通过动态编译本机代码来执行所有JavaScript。 V8支持大约10种不同的CPU架构,每种架构有4层编译器。这已经使每个运营商的40个不同的实现。在许多这些编译中,编译经历了一系列阶段,将输入转换为实际的机器代码。在每种情况下,确切的转换取决于编译时可用的类型信息(在先前的运行中收集)。
要了解正在发生的事情,您需要了解V8复杂架构的重要部分,因此在SO回复中回答您的问题几乎是不可能的。如果您只对语义感兴趣,我建议您查看EcmaScript语言定义。
(你引用的片段只是一个帮助函数,用于转换一元运算符的转换编译器内部类型信息,在许多阶段之一。)
编辑:您在更新的问题中引用的EcmaScript定义的摘录是正确的观察地点。请记住,所有JavaScript编号都是IEEE浮点数。这句话基本上是说-
只是反转了这个数字的符号位。您需要参考IEEE 754标准了解更多详情。乘法-1.0是一个复杂得多的操作,但在大多数情况下会有相同的结果(可能除NaN操作数外)。