Отражательная поддержка в C

Лучший способ понять, почему C++ является способом, которым это, и ценить, это - достижения, должен считать "Дизайн и Эволюцию C++".

Для всех его бородавок, C++ является довольно блин хорошим языком.

27
задан Francesco Menzani 1 May 2015 в 16:08
поделиться

6 ответов

Отражение в целом - это средство программы для анализа структуры некоторого кода. Этот анализ используется для изменения эффективного поведения кода.

Отражение, поскольку анализ обычно очень слаб; обычно он может предоставить доступ только к именам функций и полей. Эта слабость проистекает из того, что разработчики языка, по сути, не хотят предоставлять полный исходный код во время выполнения вместе с соответствующими процедурами анализа для извлечения того, что нужно, из исходного кода.

Другой подход - взяться за анализ программы напрямую, используя мощный инструмент анализа программ, например, тот, который может анализировать исходный текст точно так же, как это делает компилятор. (Часто люди предлагают использовать для этого сам компилятор, но обычно это не работает; компилятор хочет быть компилятором, и чертовски сложно приспособить его для других целей).

Что необходимо, так это инструмент, который:

  • Анализирует исходный текст языка
  • Строит абстрактные синтаксические деревья, представляющие каждую деталь программы. (Это полезно, если в AST сохраняются комментарии и другие сведения об источнике макет кода, такой как номера столбцов, буквальные значения системы счисления и т. д.)
  • Строит таблицы символов, показывающие объем и значение каждого идентификатора
  • Может извлекать потоки управления из функций
  • Может извлекать поток данных из кода
  • Может построить граф вызовов для системы
  • Может определить, на что указывает каждый указатель.
  • Позволяет создавать настраиваемые анализаторы, используя приведенные выше факты
  • Может преобразовывать код в соответствии с такими настраиваемыми анализами (обычно путем изменения AST, представляющих проанализированный код)
  • Может восстанавливать исходный текст (включая макет и комментарии) из пересмотренные AST.

Используя такой механизм, каждый реализует анализ на любом уровне детализации, а затем преобразует код для достижения эффекта, достигаемого отражением во время выполнения. Есть несколько основных преимуществ:

  • Уровень детализации или объем анализа - это вопрос амбиций (например, это не так. ограничено только тем, что может делать только отражение во время выполнения)
  • Нет никаких накладных расходов во время выполнения для достижения отраженного изменения в поведении
  • Используемый механизм может быть общим и применяться во многих языках, скорее чем быть ограниченным тем, что предоставляет конкретная языковая реализация.
  • Это совместимо с идеей C / C ++, что вы не платите за то, что не используете. Если вам не нужно отражение, вам не нужен этот механизм. И твой язык не нуждается в встроенном интеллектуальном багаже ​​слабого отражения.

См. наш DMS Software Reengineering Toolkit , чтобы узнать о системе, которая может выполнять все вышеперечисленное для C, Java и COBOL, а также для большинства его для C ++.

[ИЗМЕНИТЬ август 2017 г .: теперь обрабатывает C11 и C ++ 2017]

19
ответ дан 28 November 2019 в 05:16
поделиться

какие уловки вокруг этого? Есть какие-нибудь советы?

Компилятор, вероятно, при желании сгенерирует «файл символов отладки», который отладчик может использовать для отладки кода. Компоновщик также может сгенерировать «файл карты».

Уловка / совет может заключаться в создании и последующем чтении этих файлов.

8
ответ дан 28 November 2019 в 05:16
поделиться

На основе по ответам на Как добавить отражение в приложение C ++? (Stack Overflow) и тот факт, что C ++ считается «надмножеством» C, я бы сказал, что вам не повезло.

Также есть хороший длинный ответ о , почему в C ++ нет отражение (переполнение стека) .

5
ответ дан 28 November 2019 в 05:16
поделиться
  1. Реализовать отражение для C было бы намного проще ... потому что C - простой язык.
  2. Есть несколько основных параметров для анализа программы, например, определить, существует ли функция, путем вызова dlopen / dlsym - - зависит от ваших потребностей.
  3. Существуют инструменты для создания кода, который может изменять / расширять себя с помощью tcc .
  4. Вы можете использовать вышеуказанный инструмент для создания собственных анализаторов кода.
3
ответ дан 28 November 2019 в 05:16
поделиться

Вам нужно будет реализовать это самостоятельно с нуля. В прямом C нет никакой информации о времени выполнения, хранящейся в структурах и составных типах. Метаданные просто не существуют в стандарте.

2
ответ дан 28 November 2019 в 05:16
поделиться

Мне нужно было отражение в группе struct s в проекте C ++.
Я создал XML-файл с описанием всех этих структур - к счастью, типы полей были примитивными.
Я использовал шаблон (не шаблон C ++ ) для автоматической генерации класса для каждой struct вместе с методами установки / получения.
] В каждом классе я использовал карту для связывания имен строк и членов класса (указатели на члены).

Я не пожалел об использовании отражения, потому что оно открыло новые способы разработки моих основных функций, которые я даже не мог представить без отражения.
(Кстати, это был внешний генератор отчетов для программы, использующей базу данных raw )

Итак, я использовал генерацию кода, указатели функций и карты для имитации отражения.

3
ответ дан 28 November 2019 в 05:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: