Проблема проектирования с почти статическими данными
-
05-07-2019 - |
Вопрос
Я занимаюсь разработкой интерпретатора простого языка программирования.
<Ол>std::map<string, Type*>
), которая переводит имена типов в объекты типов. Проблема в том, что может быть загружено несколько программ, и каждая из них может иметь разные типы, связанные с одинаковыми именами. Это единственное предположение делает невозможным создание одной глобальной (статической) среды, которая в противном случае была бы идеальным решением.
Поэтому кажется, что мне нужно (# 1) указатель на окружение в каждом объекте типа или (# 2) для выполнения каждой операции в контексте окружения (например, путем предоставления ее везде в качестве первого аргумента ). р>
Проблемы, которые я вижу:
(# 1) Избыточность информации, потому что все подключенные узлы данных будут иметь одинаковую среду. Среда будет отличаться только для строго отдельных данных.
(# 2) Много тривиальной передачи среды подпрограммам, запутывающим код.
Мне кажется, что эта проблема соответствует общему шаблону, который я бы назвал почти статическими данными . Есть идеи, что будет лучшим решением?
Решение 3
Идея использования локального хранилища потоков интересна, но я наконец-то нашел другое решение:
Я использую типы в два этапа: сначала они все создаются, а затем они " скомпилированы " ;. Компиляция требует среды, но выполняется только один раз. Он заключается в переводе всех имен типов в соответствующие объекты типов. После компиляции среда больше не нужна. Р>
Тем не менее, я думаю, что это все же скорее обходной путь, чем общее решение.
Другие советы
Что разделяет окружение? Если это контекст выполнения (объекты в контексте вызывают только объекты в одном и том же контексте), то вы можете использовать один поток на среду и сохранить & Quot; local-globals & Quot; в локальном потоке (или просто в глобальной карте, ключами которой являются идентификаторы потоков).
Это имеет ряд недостатков. С одной стороны, это не работает, если есть кросс-контекстные вызовы. И, конечно, это заставляет вас в резьбовую модель.
Возможно, вы захотите иметь два хранилища типов - одно глобальное для конкретных типов, другое локальное для TypeRef. Локальное хранилище должно быть помещено в контекст анализируемой программы.