2016-02-29 2 views
2

Я пишу (на основе стека) виртуальную машину, которая не включает метаданные типа при хранении переменных, будь то в стеке или фактический байт-код. Кроме того, все данные сохраняются как без знака, где это применимо (все целые числа и символы хранятся как без знака)Вывод типов данных для виртуальной машины без метаданных типа

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

Какой бы лучше подход: это или хранение данные о типе (возможно, только один лишний байт) с самой переменной? Кажется, что много раздувается, чтобы сохранить переменную вместе с ее данными, как в памяти кода, так и в качестве используемой.

Заранее спасибо.

+0

Этот вопрос довольно основан на мнениях. Но я предпочитаю идею, что типы являются языковой концепцией и должны существовать только во время компиляции. –

ответ

0

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

Как всегда, вы должны сделать компромисс между скоростью и пространства:

  • , если вы хотите сохранить тип с переменной, данные VM будет больше. Операционные коды вашего двигателя VM будут, однако, меньше (нет дополнительных параметров для операции, поскольку они могут быть выведены из информации типа), так что в итоге общий объем памяти может быть меньше. Однако во время выполнения каждый op-код должен анализировать типы своих аргументов, принимать решения о конверсиях (в случае смешанных типов). Таким образом, выполнение может быть медленнее.

  • Если вы сохранили переменные без типа, данные будут меньше. Но op-код потребует дополнительных параметров (здесь ADD32 имеет 3 параметра, как вы уже определили). Таким образом, код будет больше. Однако во время выполнения вы могли пойти быстрее.

  • Вы можете оптимизировать этот второй вариант, сделав коды операций, включая параметры (таким образом, разработаны самые современные команды инструкций для процессоров, отличных от RISK). Поэтому вместо того, чтобы иметь, например, одну инструкцию ADD32 (1 байтовый код) с 3 параметрами (3 дополнительных байта?), Вы могли бы иметь несколько специализированных и оптимизированных кодов операций (с хорошей организацией бит, которая учитывает поля op-кода, это может быть даже организовать в 2 байта).

Обратите внимание, что для второго и третьего подходов требуется сильная типизация на исходном языке, который вы конвертируете в свою виртуальную машину. Если вы хотите иметь динамические типы, вам нужен первый подход.

Смежные вопросы