Тип записи стека (в виртуальной машине)

Есть кое-что, чего я не совсем понимаю в виртуальных машинах на основе стека: каков тип значения, которое хранится в стеке? Я имею в виду, что, например, если я поместил целое число в стек, ясно, что его тип — 32-битное целое число. Однако, если я нажимаю число с плавающей запятой, строку или даже ссылку на объект (в ООП), их типы меняются. Когда создается стек, определяет ли он их тип, когда они помещаются в стек, или стек имеет предопределенный тип записи, например, только целые числа или, может быть, указатель? Я не могу понять это, поэтому любая помощь приветствуется.


person Kai    schedule 15.06.2018    source источник
comment
Вы реализуете язык, а не пишете. Исходный код Si. Язык. Элемент стека может быть любым, каким вы его считаете, исходя из ваших потребностей как разработчика.   -  person user207421    schedule 16.06.2018


Ответы (1)


Существуют различные подходы, я просто приведу здесь несколько примеров.

В виртуальной машине движка JavaScript V8 (из браузера Chrome и Node.js) все объекты в стеке являются указателями на структуру, которая может быть похожа на эту:

class Value {
   char type;
   union {
      Number, String, Object, Array, Date, Set
   }
};

Виртуальная машина JavaScript Firefox SpiderMonkey хранит 64-битные значения в стеке, эти значения так называемые NaN-упакованы. Если все старшие 3 бита установлены на 1, следующие несколько битов используются для определения типа объекта, а остальные 48 бит используются в качестве указателя на структуру объекта. Если 3 старших бита не все 111, то все 64-битное значение равно double.

Стек VM в среде со сбором мусора обычно должен содержать однородные объекты, то есть объекты одного типа, не смешивая, например, указатели и целые числа, чтобы сборщик мусора мог успешно пройти и проверить каждый объект рекурсивно, начиная со стека. Например, значение в стеке, похожее на 0x123456789, может быть как допустимым целым числом, так и допустимым указателем, и сборщик мусора не догадывается игнорировать его (если это было целое число) или разыменовывать его (в потенциально неправильное место в памяти).

На самом деле существуют продвинутые сборщики мусора, которые могут работать со смешанными данными в стеке, делая некоторые предположения, угадывая и ведя дополнительный учет.

person exebook    schedule 16.06.2018