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

If I was a VM how would I treat numbers when executing JavaScript?

本文关键字:何处理 数字 处理 JavaScript 一个 虚拟机 如果 执行      更新时间:2023-09-26

我一直在思考如何最好地弥合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是谷歌的JavaScript引擎,用于Chrome、NodeJS和其他一些地方。是速度最快的引擎之一。)
  • SpiderMonkey源代码(SpiderMonkeyMozilla的引擎,在Firefox中使用)