[英]Javascript: How to see source code implementation of native functions like toString
我期待看到一些Javascript函数如何工作。 例如,我想了解Chrome的V8引擎如何实现一元( - )操作或String.prototype.toString()
方法。
如何查看本机C/C++
实现? 我在这里看到许多链接到Chromium存储库和V8存储库的答案,但这些都是巨大的,并不是非常适合初学者,并且在我能找到的任何地方都没有任何指南。
我在寻找这样的东西:
// Pseudo code
function -(arg) {
return arg * -1
}
显然,我明白我不会发现这是用Javascript编写的 。 我只是在寻找类似的细节。
我还没有找到一个简明扼要地展示如何在任何地方找到Javascript函数的本机实现的答案。 有人能指出我正确的方向吗?
这里的ECMA规范给出了Unary的以下规范 - 操作:
一元 - 运算符
一元 - 运算符将其操作数转换为数字类型然后否定它。 注意,否定+0会产生-0,而否定-0会产生+0。
生产UnaryExpression: - UnaryExpression的计算方法如下:
设
expr
是评估UnaryExpression
的结果。 设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操作数外)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.