Мета-программирование

10

Я только начал свое путешествие как разработчик C ++, и недавно я исследовал тему под названием метапрограммирование. До сих пор я прошел много информации по этой теме, и у меня мало вопросов.

  1. Использование Reflection в c ++: возможно ли это? Согласно моему пониманию, рефлексия - это метод метапрограммирования, который обладает способностью манипулировать состоянием программы, и его манипулирование может быть самоанализом или интроцессией.

  2. В чем разница между отражающей архитектурой и архитектурой метауровня? В какую категорию попадает архитектура метапрограммирования?

  3. Мета-программирование имеет два уровня: мета-уровень и базовый уровень. В моем понимании объектная программа или исследуемая система является базовым уровнем, а метапрограмма, которая будет работать над исследуемой системой, является метауровнем. Я прав?

Также помогите мне, предоставив некоторые рекомендации по работе над шаблонным метапрограммированием в C ++.
Можете ли вы предложить мне несколько реальных примеров, которые я могу найти, чтобы получить практические навыки в этой технике программирования?

ChrisF
источник
2
Этот вопрос может больше относиться к программистам, чем к stackoverflow. Первый более теоретический, а второй более практичный. На некоторые части можно легко ответить с практической точки зрения С ++ не имеет отражения , но другие не связаны с кодом (например, разница между отражающей и метауровневой архитектурами)
Дэвид Родригес - dribeas
Этот ответ SO объясняет, почему в C ++ нет отражения: stackoverflow.com/q/359237/120163 и некоторые слабые методы C ++ для его плохой симуляции.
Ира Бакстер
Если вы очень заинтересованы в метапрограммировании, я предлагаю вам взглянуть на язык D, который на данный момент более понятен, чем C ++.
Deadalnix

Ответы:

10

Метапрограммирование просто означает, что у вас есть средства для написания кода, который пишет другой код (в широком смысле). C ++ делает это через механизм шаблонов, который в основном является типобезопасным языком макросов. Вполне возможно просто применить шаг раскрытия шаблона, и в результате получится действительный код C ++, не содержащий шаблонов.

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

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

tdammers
источник
+1 Мне очень нравится ваш ответ, и я хочу спросить об использовании компилятора в качестве службы, как в C #, или об использовании механизма сценариев, как в Java, для выполнения кода, который создается во время выполнения. Разве это не форма метапрограммирования?
М.Самир
Так кто-нибудь, кто создает интерпретатор Python на C, занимается метапрограммированием? Как насчет реализации ORM, который отображает объектно-ориентированный язык в SQL? Является ли каждый веб-фреймворк примером метапрограммирования?
Кодзиро
1
  1. Нет. Программы на C ++ компилируются в машинный код, и вся информация о классах и т. Д. Теряется (если только не используется C ++ / CLI для среды .NET, но это не чистый C ++).

2-3. Я не знаю - ждите другого ответа, который поможет с этим :-)

Мета-программирование с использованием шаблонов C ++ является очень мощным, но и сложным. Расширение шаблона требует функционального стиля программирования, а не императивного программирования, которое использует C ++. Если у вас нет опыта работы с функциональным программированием, я бы порекомендовал вам сделать обход и выучить базовый шрифт, хаскель или схему.

Андерс Абель
источник