Я проектирую свой собственный экспериментальный язык сценариев с целью встраивания его в мое более крупное приложение.
Почти все, что я хотел сделать, было запрограммировано плавно, но появился "простой" способ хранения переменных в памятибыть самой сложной частью здесь.Я не знаю, как их хранить, чтобы разрешить все проверки типов, глобальные переменные и специальные флаги на них.Сначала рассмотрим пример кода:
a = 1
b = 2
someFunction()
print(a) --> This should read the global variable and print `1`
a = 3 --> Now `a` should become a local variable of this function
and the global `a` remain unchanged
x = 4 --> `x` should always be local of this function
end
Я называю «локальность» переменных их level
s, поэтому переменные во вложенных блоках имеют более высокий уровень.В приведенном выше коде a
и b
являются переменными уровня 1.Локальные переменные someFunction будут иметь уровень 2. Первая строка функции должна читать глобальную переменную a
(уровень 1), но вторая строка должна снова создать переменную с именем a
, но с уровнем 2, который затеняет глобальную a
с этого момента.Третья строка должна создать переменную x
с уровнем 2. Как хранить и отслеживать все это в памяти?
Что я пробовал до сих пор:
Метод 1: Хранение карт variable=>value
в массиве уровней:
variables
{
level=1 //global variables
{
a => 1,
b => 2
},
level=2 //function variables
{
a => 3,
x => 4
}
}
Но это сделает поиск переменных очень медленным, так как нужно искать все уровни для данной переменной.
Метод 2: Хранение пар (переменных, уровня) в качестве ключей карты:
variables
{
(a, 1) => 1, //global
(b, 1) => 2, //global
(a, 2) => 3, //function
(x, 2) => 3 //function
}
Это та же проблема, что и раньше, так как мы должны попробовать пару (переменная, уровень) со всеми возможнымиуровни для данной переменной.
Какой метод следует использовать для оптимального использования памяти и максимально быстрого времени доступа?
Дополнительные примечания:
Я знаю окак переменные управляются в стеке и куче на других «реальных» языках, но мне сложно сделать это на интерпретируемом языке.«Это не должно быть так, как это делают Луа и Питон», - всегда думаю я.Поправьте меня если я ошибаюсь.Я пытаюсь сохранить переменную в картах и внутренних структурах C ++.
И, наконец, вот как я представляю переменную.Как вы думаете, он большой и может быть больше представлений с эффективным использованием памяти?(Я также пытался поместить здесь «Уровень» в качестве члена, но у него была та же проблема, что и у другого.)
struct Member
{
uchar type; //0=num, 1=str, 2=function, 3=array, etc
uchar flags; //0x80 = read-only, 0x40 = write-only, etc
union {
long double value_num;
char* value_str;
int value_func;
//etc
};
};