Я пишу (на основе стека) виртуальную машину, которая не включает метаданные типа при хранении переменных, будь то в стеке или фактический байт-код. Кроме того, все данные сохраняются как без знака, где это применимо (все целые числа и символы хранятся как без знака)Вывод типов данных для виртуальной машины без метаданных типа
Какой из следующих подходов был бы более эффективным, учитывая, что я хочу сохранить память очень минимальной (8 бит для bool, 16 бит для короткого замыкания и т. Д.) И не хотят слишком сильно раздувать код или рабочую память.
//Type info.
enum TypeInfo {
TYPE_INT8, //=0
TYPE_INT16,
TYPE_INT32,
TYPE_INT64,
TYPE_STRING,
TYPE_CHAR,
TYPE_BOOL,
TYPE_POINTER,
LEFT_S_RIGHT_S,
LEFT_U_RIGHT_U,
LEFT_S_RIGHT_U,
LEFT_U_RIGHT_S,
BOTH_SAME_TYPE,
SIGNED,
UNSIGNED //=14
};
Используя вышеизложенное, я мог бы интерпретировать байт-код следующим образом. я сделал следующее в каком-то языке:
unsigned int one = 78888;
signed int two = -900;
signed int result = one - two;
print(result); //inferred overloaded function targeting the 'unsigned int' print function
Итак, моя виртуальная сборка машины, может быть сгенерирован что-то вроде следующего:
PUSH32 <78888> //push 'one' onto stack
PUSH32 <-900 cast to an unsigned int> //push 'two' onto stack
ADD32, TypeInfo::LEFT_U_RIGHT_S, TypeInfo::BOTH_SAME_TYPE, TypeInfo::TYPE_INT32
PRNT32, TypeInfo::SIGNED, TypeInfo::INT32
Какой бы лучше подход: это или хранение данные о типе (возможно, только один лишний байт) с самой переменной? Кажется, что много раздувается, чтобы сохранить переменную вместе с ее данными, как в памяти кода, так и в качестве используемой.
Заранее спасибо.
Этот вопрос довольно основан на мнениях. Но я предпочитаю идею, что типы являются языковой концепцией и должны существовать только во время компиляции. –