Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我是一个虚拟机,在执行JavaScript时我将如何处理数字?_Javascript_Runtime_Dynamic Languages_V8 - Fatal编程技术网

如果我是一个虚拟机,在执行JavaScript时我将如何处理数字?

如果我是一个虚拟机,在执行JavaScript时我将如何处理数字?,javascript,runtime,dynamic-languages,v8,Javascript,Runtime,Dynamic Languages,V8,我一直在思考如何最好地弥合CLR world(.NET runtime)和JavaScript之间的差距,我想到的一件事是JavaScript中的一种类型的概念,它在某种程度上是从使用情况推断出来的,而C#不需要这样做 我想更多地了解JavaScript引擎的实现细节,特别是如何处理数字。该标准概述了一系列在特定上下文中有效的操作,并产生特定的结果。严格来说,JavaScript中不存在整数的概念,但有一些典型的整数算术运算,如位移位(>)它始终对32位有符号整数进行运算,并始终生成32位有符号

我一直在思考如何最好地弥合CLR world(.NET runtime)和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虚拟机大师愿意尝试一下?(在这一点上,我更感兴趣的是虚拟机的内部结构,而不是规范的实际细节)

如果您想深入了解JavaScript实现如何处理
数字类型,那么没有什么比访问源代码更重要的了。我会看看:

  • (V8是谷歌的JavaScript引擎,用于Chrome、NodeJS和其他一些地方,是速度最快的引擎之一。)
  • (SpiderMonkey是Mozilla的引擎,用于Firefox)

最终我会着手解决这个问题,我一直在摸索V8的源代码,但我觉得有点像在黑暗中摸索。这是相当多的源代码。虽然我有一个问题要问你,你对JavaScript环境下的64位整数有什么看法?@John:是的。:-)好的是,他们倾向于使用ECMAScript规范中的节号标记源代码,这样您至少可以找到一个起点。但它是密集的东西…@John:据我所知,JavaScript中根本没有64位整数。所有JavaScript整数操作都定义为32位操作,格式为:Convert
Number
to int32;对int32值执行运算;将结果转换为编号。规范中唯一提到的64位整数是关于实现可以自由使用它们作为时间值基础(如果需要)的一个侧重点。数字的基本值是64位,但它是64位双精度浮点数据(IEEE 754)。好吧,如果我有一个54位的数字,比如18014398509481984,会怎么样?