Я думал о том, как наилучшим образом преодолеть разрыв между миром 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, которые хотели бы попробовать это?(на данный момент я больше интересуюсь внутренними компонентами виртуальной машины, чем собственными спецификациями спецификации)