Я разрабатываю свой собственный экспериментальный язык сценариев с целью встраивания его в мое более крупное приложение.
Почти все, что я хотел сделать, было легко запрограммировано, но «простой» акт сохранения переменных в памяти оказался здесь самой сложной частью. Я не знаю, как их хранить, чтобы на них была разрешена проверка типов, глобальные переменные и специальные флаги. Сначала посмотрите на пример кода:
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
Я называю "локальность" переменных их уровнем
, поэтому переменные во вложенных блоках имеют более высокий уровень. В приведенном выше коде a
и b
являются переменными уровня 1. Локальные переменные someFunction будут иметь уровень 2. Первая строка функции должна читать глобальную переменную a
(уровень 1), но вторая строка должна снова создавать переменную с именем a
, но с уровень 2, который с этого момента затеняет глобальный a
.Третья строка должна создать переменную x
с уровнем 2. Как хранить и отслеживать все это в памяти?
Что я пробовал до сих пор:
Метод 1: Сохранение карт ] переменная => значение
в массиве уровней:
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
}
Здесь та же проблема, что и раньше, поскольку мы должны попробовать пару (переменная, уровень) со всеми возможными уровнями для данной переменной .
Какой метод мне следует использовать для оптимального использования памяти и максимального времени доступа?
Дополнительные примечания:
Я знаю, как переменные управляются в стеке и куче на других «реальных» языках, но мне сложно сделайте это на интерпретируемом языке. «Это не должно быть так, как в Lua и Python», - всегда думаю я. Поправьте меня если я ошибаюсь. Я пытаюсь сохранить переменную в картах и внутренних структурах 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
};
};