Я думаю о метапрограммировании как о «программах, которые пишут (или модифицируют) другие программы».(В другом ответе говорилось: «фабрики, которые делают фабрики», хорошая аналогия).
Люди находят для этого все виды применения: настройка приложений, генерация шаблонного кода, оптимизация программы для особых обстоятельств, реализация DSL, вставка кода врешать проблемы ортогонального проектирования («аспекты») ...
Что примечательно, так это то, что было изобретено много различных механизмов для создания этой части: текстовые шаблоны, макросы, условные выражения препроцессора, универсальные шаблоны, C ++ - шаблоны, аспекты,рефлексия ... И обычно некоторые из этих механизмов встроены в некоторые языки, а другие механизмы - в другие языки, и большинство языков вообще не поддерживают метапрограммирование.Такое точное распределение возможностей означает, что вы можете выполнять некоторые виды метапрограммирования на одном языке с ограничениями, но при этом не можете выполнять такие действия на другом языке.Это отягчает: -}
Наблюдение, которому я следил за рукояткой, состоит в том, что можно создать универсальный механизм метапрограммирования, который работает с любым языком в форме программных преобразований .Программное преобразование - это параметризованный шаблон: «если вы видите этот синтаксис, замените его на этот синтаксис».
Одно само преобразование обычно не впечатляет,но десятки или сотни могут внести впечатляющие изменения в код.Поскольку (сложные) программные преобразования могут фактически имитировать машину Тьюринга, они могут выполнять произвольные изменения кода, включая все те точечные техники, которые вы нашли без разбора.
Инструмент, который принимает определения языка.Специфичные для языка преобразования и генерирующие другое для применения этих преобразований - это meta -метапрограммирующий инструмент: программа для написания «программ, которые пишут программы».
Значение в том, что вы можете применить такой инструментосуществлять широкие возможности изменения произвольного кода.И вам не нужен комитет по разработке языков, чтобы понять, что вам нужна особая поддержка метапрограммирования, и поторопитесь, чтобы предоставить ее, чтобы вы могли продолжить работу сегодня.
Интересный урок заключается в том, что для такого механизма требуется сильная поддержка анализа программ (таблиц символов, управления и анализа потоков данных и т. Д.), Чтобы помочь ему сосредоточиться на проблемах в коде, чтобы механизм метапрограммирования мог что-то делать.в этот момент (очень слабым примером этого являются точечные спецификации в аспектах, которые говорят «вносить изменения в местах, которые похожи на это»).
ФП попросил конкретные примеры того, где было метапрограммированиеприменяется.Мы использовали наш инструмент мета-метапрограммирования ( DMS Software Reengineering Toolkit ) для автоматического выполнения следующих действий с большими базами кода:
- Языковая миграция
- Реализация тестового покрытия и профилировщиков
- Реализация обнаружения клонов
- Массовая реинжиниринг архитектуры
- Генерация кода для управления фабрикой
- SOAizationвстроенные сетевые контроллеры
- Извлечение архитектуры для программного обеспечения мэйнфреймов
- Генерация векторных SIMD-команд из вычислений массива
- Обратный инжиниринг кода обратно к понятиям
на многих языках, включая Java, C #, C ++, PHP, ...
ФП также спросил: «Почему это было лучше, чем альтернатива?»Ответ связан с масштабом, временем и точностью.
Для больших приложений большой размер базы кода означает, что у вас нет ресурсов или времени для проведения такого анализа или изменений вручную.
Для задач генерации кода или оптимизации вы можете сделать это вручную, но инструменты могут сделать это намного быстрее и точнее.
По сути, эти инструменты делают то, что делают людипросто не может.
Стоит отметить, что инструменты не обладают креативностью; ты все еще
нужно, чтобы люди определяли, что им делать, например, чтобы решить
в чем заключается задача (см. список выше для примеров) и определите
как определить анализы / преобразования для достижения эффекта.
Вам все еще нужны meta -программисты. Тем не менее, когда метапрограммист
вооружить такой инструмент с необходимыми знаниями, результирующий код может
похоже, что он создан невероятно быстрым, креативным, опытным программистом.