Подтвердить что ты не робот

Является ли метапрограммирование подмножеством отражения?

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

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

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

[выделено курсивом]

И описание метапрограммирования -

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Отражение, насколько я понимаю, это способность программы запрашивать собственную структуру. Практически в каждой системе, в которой было возможно отражение (с действительно исключительным случаем Lisp и эквивалентными вариантами), рефлекторное оборудование обеспечивало лишь ограниченное средство самоанализа. Java и С# позволят вам узнать имена классов и методов, но вы не можете запрашивать эти системы для содержимого метода, оператора или локальной декларации. Вы также не можете просить большинство таких отражающих langauges фактически изменить их структуру, то есть вы не можете добавлять новые классы или поля, используя средства отражения. Большинство langauges (например, С++) в принципе не имеют встроенной способности "отражать" . Хотя утилиты отражения, встроенные в langauges, могут быть полезными, они, как правило, отличаются друг от друга по отношению к тому, что разработчики языка/разработчики компиляторов решили сохранить во время работы.

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

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

Кроме того, инструмент преобразования программ, такой как DMS, может модифицировать код, основанный на "отражении" для генерации нового кода, оптимизации, реструктуризации, инструмента... Множество эффектов, достигаемых таким образом, удивительно велико.

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

Ответ 2

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

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