Недавно ради интереса я решил собрать игрушку для программирования, компилятора и вм. Приступая к реализации виртуальной машины, я застрял. Стек, который содержит переменные и структуры, я реализовал как отдельные массивы для каждого типа. Проблема в том, что когда у меня есть ссылка на структуру, элементы не выровнены, int struct.x может быть по адресу 2, а float struct.y может быть по адресу 56, поэтому доступ к структуре по ссылке будет невозможен, потому что индексы не являются линейными. Как я мог решить это?
редактировать:
во-первых, для каждого типа, который я имею в виду для каждого примитива, и во-вторых, я знаю, что мог бы реализовать его с помощью союзов, но я хочу узнать, как это действительно реализовано в java, c ++ или c #, это своего рода точка создания игрушечного языка чтобы лучше понять, что вы программируете.
в этом случае у вас нет реального выбора, кроме как использовать один тип данных, такой как uin32_t / uint64_t, и просто компилятор разбивает значения на целое число
int sp = 0;
uint32_t stack[MAX_STACK_SIZE];
ИЛИ ЖЕ
как уже говорили другие, создайте стек, представляющий собой массив союзов, возможно, используя помеченный союз. Одна реализация может быть …
union values {
int i;
float f;
};
struct Type {
int tag;
union values val;
};
Type stack[MAX_STACK_SIZE];
Это решать вам, но обычно так и делается.
Других решений пока нет …