Метапрограмування


10

Я щойно розпочав свою подорож як розробник C ++, і нещодавно досліджував тему, яку називають метапрограмуванням. Поки що я пережив багато інформації по цій темі і маю мало запитань.

  1. Використання відбиття в c ++: чи можливо? Як на моє розуміння, рефлексія - це мета-програмування, яка має можливість маніпулювати станом програми, а її маніпулювання може бути самоаналіз або інтроцесія.

  2. Чим відрізняється відбиваюча архітектура та метарівнева архітектура? У яку категорію потрапляє архітектура метапрограмування?

  3. Метапрограмування буває двох рівнів: мета рівня та базового рівня. Наскільки я розумію, об'єктна програма або досліджувана система є базовим рівнем, а метапрограма, яка буде працювати над досліджуваною системою, є метарівнею. Я прав?

Також допоможіть мені, надавши деякі вказівки щодо роботи над метапрограмуванням шаблонів у C ++.
Чи можете ви запропонувати мені кілька прикладних прикладів, які я можу шукати, щоб отримати практичну практику в цій програмуванні?


2
Це питання може належати більше для програмістів, ніж для stackoverflow. Перші - більш теоретичні, а пізніші - більш практичні. На деякі частини можна легко відповісти з практичної точки зору, C ++ не має відображення , а інші не пов'язані з кодом (наприклад, різниця між архітектурою, що відбиває та метарів, наприклад)
Девід Родрігес - dribeas

Ця відповідь відповідає питанням, чому C ++ не відображає: stackoverflow.com/q/359237/120163 , а також деякі слабкі методи C ++ для їх імітації.
Іра Бакстер

Якщо ви дуже зацікавлені в метапрограмуванні, пропоную вам ознайомитись з мовою D, яка в цьому питанні чіткіша, ніж C ++.
deadalnix

Відповіді:


10

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

Відображення - це здатність мови програмування та / або середовища виконання перевіряти (і часто змінювати) власні мовні елементи під час виконання. Як правило, відображаючі мови пропонують структури даних, які представляють елементи мови, такі як класи, методи, змінні, параметри тощо, а також підпрограми чи класи для їх огляду, модифікації та створення. Можливість модифікації робить відображення типом метапрограмування, оскільки дозволяє писати код, що генерує інший код.

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


+1 Мені дуже подобається ваша відповідь, і я хочу запитати про використання компілятора як сервісу, як у C #, або використання механізму сценаріїв, як у Java, для виконання коду, побудованого під час виконання. Чи не це також форма метапрограмування?
М.Самер

Отже, кожен, хто будує інтерпретатор Python в C, є метапрограмуванням? Що з реалізацією ORM, яка відображає об'єктно-орієнтовану мову в SQL? Чи кожен веб-фреймворк є прикладом метапрограмування?
kojiro

1
  1. Ні. Це не так. Програми C ++ складаються з машинного коду, і вся інформація про класи тощо втрачається (якщо тільки не використовувати C ++ / CLI для середовища .NET, але це не чисто C ++).

2-3. Я не знаю - чекайте чергової відповіді, яка допоможе в цьому :-)

Метапрограмування за допомогою шаблонів C ++ дуже потужне, але й складне. Розширення шаблону вимагає функціонального стилю програмування, а не імперативного програмування, яке використовує C ++. Якщо у вас немає попереднього досвіду роботи з функціональним програмуванням, я б рекомендував вам здійснити об'їзд і вивчити основні лісп, хескелл або схему.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.