Структура данных для хранения переменных на интерпретируемом языке

Я разрабатываю свой собственный экспериментальный язык сценариев с целью встраивания его в мое более крупное приложение.

Почти все, что я хотел сделать, было легко запрограммировано, но «простой» акт сохранения переменных в памяти оказался здесь самой сложной частью. Я не знаю, как их хранить, чтобы на них была разрешена проверка типов, глобальные переменные и специальные флаги. Сначала посмотрите на пример кода:

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
    };
};
7
задан Hossein 20 February 2012 в 10:59
поделиться