Проблема проектирования с почти статическими данными

StackOverflow https://stackoverflow.com/questions/1404067

  •  05-07-2019
  •  | 
  •  

Вопрос

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

<Ол>
  • Существуют древовидные динамические данные , где каждый из узлов данных имеет связанный (принадлежащий) тип-объект .
  • Существует несколько видов типов - ListType, StructType и т. д. - и один специальный - TypeRef . TypeRef содержит имя (строку), которое ссылается на некоторый конкретный тип.
  • Существует (почти) глобальная карта (словарь) - я называю это среда - (std::map<string, Type*>), которая переводит имена типов в объекты типов.
  • Проблема в том, что может быть загружено несколько программ, и каждая из них может иметь разные типы, связанные с одинаковыми именами. Это единственное предположение делает невозможным создание одной глобальной (статической) среды, которая в противном случае была бы идеальным решением.

    Поэтому кажется, что мне нужно (# 1) указатель на окружение в каждом объекте типа или (# 2) для выполнения каждой операции в контексте окружения (например, путем предоставления ее везде в качестве первого аргумента ).

    Проблемы, которые я вижу:
    (# 1) Избыточность информации, потому что все подключенные узлы данных будут иметь одинаковую среду. Среда будет отличаться только для строго отдельных данных.
    (# 2) Много тривиальной передачи среды подпрограммам, запутывающим код.

    Мне кажется, что эта проблема соответствует общему шаблону, который я бы назвал почти статическими данными . Есть идеи, что будет лучшим решением?

    Это было полезно?

    Решение 3

    Идея использования локального хранилища потоков интересна, но я наконец-то нашел другое решение:

    Я использую типы в два этапа: сначала они все создаются, а затем они " скомпилированы " ;. Компиляция требует среды, но выполняется только один раз. Он заключается в переводе всех имен типов в соответствующие объекты типов. После компиляции среда больше не нужна.

    Тем не менее, я думаю, что это все же скорее обходной путь, чем общее решение.

    Другие советы

    Что разделяет окружение? Если это контекст выполнения (объекты в контексте вызывают только объекты в одном и том же контексте), то вы можете использовать один поток на среду и сохранить & Quot; local-globals & Quot; в локальном потоке (или просто в глобальной карте, ключами которой являются идентификаторы потоков).

    Это имеет ряд недостатков. С одной стороны, это не работает, если есть кросс-контекстные вызовы. И, конечно, это заставляет вас в резьбовую модель.

    Возможно, вы захотите иметь два хранилища типов - одно глобальное для конкретных типов, другое локальное для TypeRef. Локальное хранилище должно быть помещено в контекст анализируемой программы.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top