Проблема проектирования с почти статическими данными - PullRequest
1 голос
/ 10 сентября 2009

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

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

Проблема в том, что может быть загружено несколько программ, и каждая из них может иметь разные типы, связанные с одинаковыми именами. Это единственное предположение лишает возможности иметь одну глобальную (статическую) среду, которая в противном случае была бы идеальным решением.

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

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

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

Ответы [ 3 ]

1 голос
/ 14 сентября 2009

Что отделяет окружающую среду? Если это контекст выполнения (объекты в контексте вызывают только объекты в одном и том же контексте), то вы можете использовать один поток на среду и хранить «локальные глобальные переменные» в локальном потоке (или просто глобальную карту с ключами будучи идентификаторами потока).

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

0 голосов
/ 16 сентября 2009

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

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

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

0 голосов
/ 16 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...