Ответ 1
Нет. Скорее, отражение предоставляет средства, которые являются подмножеством того, что может сделать метапрограммирование.
Метапрограммирование - это программы, которые пишут программы. Это включает в себя программы, которые читают текст программ (возможно, включая самих себя, но это довольно редко), анализировать этот код и вносить изменения. Да, он включает в себя запись исходного текста в файлы. Генерация кода - это особый случай метапрограммирования.
Отражение, насколько я понимаю, это способность программы запрашивать собственную структуру. Практически в каждой системе, в которой было возможно отражение (с действительно исключительным случаем Lisp и эквивалентными вариантами), рефлекторное оборудование обеспечивало лишь ограниченное средство самоанализа. Java и С# позволят вам узнать имена классов и методов, но вы не можете запрашивать эти системы для содержимого метода, оператора или локальной декларации. Вы также не можете просить большинство таких отражающих langauges фактически изменить их структуру, то есть вы не можете добавлять новые классы или поля, используя средства отражения. Большинство langauges (например, С++) в принципе не имеют встроенной способности "отражать" . Хотя утилиты отражения, встроенные в langauges, могут быть полезными, они, как правило, отличаются друг от друга по отношению к тому, что разработчики языка/разработчики компиляторов решили сохранить во время работы.
В итоге вы получаете гораздо более мощную возможность "отражения", если вы выходите за пределы языка и устанавливаете ограничения, которые в нем встроены дизайнеры langauge. Действительно хорошая система метапрограммирования имеет доступ ко всей структуре программы и, таким образом, может отвечать на произвольные вопросы о структуре программы (по модулю ограничений Тьюринга).
В качестве примера наш DMS Software Reengineering Toolkit является инструментом преобразования программ, который имеет полный доступ к абстрактному синтаксическому дереву программы и многим другим фактам, полученным различные интерфейсы языка DMS. Поэтому DMS может "отражать" (проверять/анализировать/рассуждать) довольно произвольно относительно языка, который он обрабатывает. И он может сделать это для C, COBOL, Java, С# и С++; для многих из этих langauges, он может не только обеспечить доступ к AST, но и доступ к информации таблицы символов и различным формам управления и потока данных, которые никакие объекты отражения, которые я когда-либо видел, не предлагают вам.
Кроме того, инструмент преобразования программ, такой как DMS, может модифицировать код, основанный на "отражении" для генерации нового кода, оптимизации, реструктуризации, инструмента... Множество эффектов, достигаемых таким образом, удивительно велико.
[Поскольку DMS реализован как набор DSL, он фактически может и не может ( "отражать" ) свой собственный код. Мы используем DMS для синтеза больших частей себя из своих DSL, включая генерацию кода с некоторыми довольно интересными оптимизациями, включая рабочую параллелизацию.]