如果我是VM,执行JavaScript时如何处理数字?

问题描述

| 我一直在思考如何最好地弥合CLR世界(.NET运行时)和JavaScript之间的鸿沟,想到的一件事是JavaScript中的一种类型概念,它是从用法中推断出来的,而C#却没有不需要这样做。 我想了解更多有关JavaScript引擎的实现细节,特别是关于如何处理数字的问题。该标准概述了在某些情况下有效的一系列操作,并产生了特定的结果,严格来说,JavaScript中不存在整数的概念,但是有一些典型的整数算术运算,例如移位(
>>
)总是对32位有符号整数进行运算,并始终产生32位有符号整数。 我想最难的部分是弄清楚什么时候数字是整数,什么时候数字不是整数。但是虚拟机如何做到这一点?
var x = 1; // is this an integer or a double?
var x = 1.0; // is this an integer or a double?
var x = 2147483648; // is this an integer or a double?
var x = 9007199254740993; // is this an integer,double or runtime error?
我猜想其中有很多启发式方法。我正在特别寻找一些可以用来更好地推理这些事情的基本主题。 同样从性能角度来看,如果您意识到某些数字被用作整数,则可以通过坚持整数来绝对优化那些情况。但是,您怎么知道何时执行此操作? 那里的JavaScript VM专家谁愿意对此采取行动? (在这一点上,我对虚拟机的内部比对规范的实际细节更感兴趣)     

解决方法

如果您想深入了解JavaScript实现如何处理
Number
类型,那无异于去到源头。我看一下: V8源代码(V8是Google的JavaScript引擎,在Chrome,NodeJS和其他一些地方使用。是那里最快的一种。) SpiderMonkey源代码(SpiderMonkey是Mozilla的引擎,在Firefox中使用)