Тип стековой записи (в виртуальной машине)
Есть кое-что, что я не совсем понимаю в виртуальных машинах на основе стека: какой тип значения хранится в стеке? Я имею в виду, что, например, если я помещаю целое число в стек, становится ясно, что его тип является 32-разрядным целым числом. Однако, если я нажму на float, строку или даже ссылку на объект (в ООП), их типы изменятся. Когда стек создается, он определяет их тип, когда они помещаются в стек, или у стека есть предопределенный тип записи, такой как только целые числа, или, возможно, указатель? Я не могу понять это, поэтому любая помощь приветствуется.
1 ответ
Существуют различные подходы, я просто привожу здесь несколько примеров.
В виртуальной машине JavaScript V8 (из браузера Chrome и Node.js) все объекты в стеке имеют указатели на структуру, которая может быть похожа на эту:
class Value {
char type;
union {
Number, String, Object, Array, Date, Set
}
};
Виртуальная машина JavaScript SpiderMonkey от Firefox хранит 64-битные значения в стеке, эти значения называются NaN-упакованными. Если старшие 3 бита все установлены в 1
следующие несколько бит используются для определения типа объекта, а остальные 48 бит используются в качестве указателя на структуру объекта. Если 3 наиболее значимых бита не все 111
тогда все 64-битное значение является double
,
Стек ВМ в среде сбора мусора обычно должен содержать однородные объекты, то есть объекты одного типа, например, не смешивая указатели и целые числа, чтобы сборщик мусора мог успешно проходить и рекурсивно проверять каждый объект, начиная со стека. Например значение в стеке, которое выглядит как 0x123456789
может быть как действительным целым числом, так и действительным указателем, и сборщик мусора не имеет ни малейшего представления, чтобы игнорировать его (если это было целое число) или разыменовывать его (в потенциально неправильной ячейке памяти).
На самом деле существуют усовершенствованные сборщики мусора, которые могут работать со смешанными данными в стеке, делая некоторые предположения, догадываясь и ведя дополнительный учет.