Является ли метапрограммирование подмножеством рефлексии? - PullRequest
20 голосов
/ 04 октября 2011

Раньше я думал, что метапрограммирование включает в себя модификацию программы и (как и некоторые ответы на Что такое рефлексия и почему она полезна? ), что рефлексия просто состоит из самоанализа программы.Тем не менее, вики-тэг отражения говорит:

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

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

[выделение добавлено]

И описание для метапрограммирования:

Метапрограммирование - это написание программ, которые пишут или манипулируют другими программами в качестве своих данных.

Метапрограммирование полезно, поскольку оно может сэкономить программистам ценное время.Некоторые языки поддерживают метапрограмму сами, и это позволяет создавать код с большой выразительной силой.

(я предполагаю, что «запись» не означает запись исходного кода в файл, потому что это будетгенерация кода.)

Может ли это сделать метапрограммирование просто подмножеством отражений?

Или термины различны, потому что некоторые языки программирования метапрограммированы другим языком, и в этом случае метапрограммирование происходит, но не отражение?(В статье о Википедии метапрограммирования было одно нецитированное предложение *)

Или же термины «отражение» и «метапрограммирование» используются по-разному в зависимости от того, какой язык программирования использует человек

Ответы [ 2 ]

15 голосов
/ 06 октября 2011

Нет.Скорее отражение предоставляет средства, которые являются подмножеством того, что может делать метапрограммирование.

Метапрограммирование - это «программы, которые пишут программы».Это включает в себя программы, которые читают текст программ (возможно, включая самих себя, но это довольно редко), анализируют этот код и вносят изменения.Да, это включает в себя запись исходного текста в файлы.Генерация кода является частным случаем метапрограммирования.

Размышление, насколько я понимаю, это способность программы запрашивать свою собственную структуру.Практически в каждой системе, которую я видел, в которой возможно отражение (с действительно исключительным случаем Лиспа и эквивалентных вариантов), механизм отражения предоставлял лишь ограниченные средства самоанализа.Java и C # позволят вам узнать имена классов и методов, но вы не можете запросить у этих систем содержимое метода, оператора или локального объявления.Также вы не можете попросить большинство таких отражающих языков изменить свою структуру, то есть вы не можете добавлять новые классы или поля, используя средства отражения.Большинство языков (например, C ++) практически не имеют встроенной способности «отражать».Хотя утилиты отражения, встроенные в языки, могут быть полезны, они имеют тенденцию быть уникальными в отношении того, что разработчики языка / сборщики компиляторов решили сохранить во время выполнения.

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

Например, наш DMS Software Reengineering Toolkit является инструментом преобразования программы, который имеет полный доступ к абстрактному синтаксическому дереву программы и многим другим фактам, полученным с помощью различных внешних интерфейсов DMS .Таким образом, DMS может произвольно «размышлять» (проверять / анализировать / рассуждать) о языке, который он обрабатывает.И это можно сделать для C, COBOL, Java, C # и C ++;для многих из этих языков он может не только обеспечить доступ к AST, но и доступ к информации таблицы символов и различным формам управления и потока данных, которые ни одна из средств отражения, которые я когда-либо видел, не предлагает вам.

Дополнительноинструмент для преобразования программ, такой как DMS, может модифицировать код, основанный на «отражении», для генерации нового кода, оптимизации, реструктуризации, инструментов, ... Разнообразие эффектов, достижимых таким способом, удивительно широк.

[Так как DMS реализован как набор DSL, он фактически может и обосновывает («размышляет») о своем собственном коде.Мы используем DMS для синтеза больших частей себя из его DSL, включая генерацию кода с некоторыми довольно интересными оптимизациями, включая работающее распараллеливание.]

4 голосов
/ 23 октября 2011

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

Вы можете рассмотреть возможность прочтения книги Жака Питра о Искусственные существа - совесть сознательной машины , в которой подробно объясняется, почему это полезно и как этоможет быть реализовано.Смотрите также его блог .

...