Метапрограммирование относится к множеству способов, которыми программа познает себя или может управлять собой.
В таких языках, как C #, отражение - это форма метапрограммирования, поскольку программа может исследовать информацию о себе. Например, возврат списка всех свойств объекта.
В таких языках, как ActionScript, вы можете оценивать функции во время выполнения для создания новых программ, таких как eval ("x" + i). DoSomething () повлияет на объект с именем x1, когда i равен 1, и x2, когда i равен 2.
Наконец, еще одна распространенная форма метапрограммирования - это когда программа может изменяться нетривиальным образом. LISP хорошо известен этим, и это то, что Пол Грэм защищал около десяти лет назад. Мне придется поискать некоторые из его конкретных эссе. Но идея состоит в том, что программа будет изменять другую часть программы в зависимости от своего состояния. Это обеспечивает уровень гибкости для принятия решений во время выполнения, что очень сложно на большинстве популярных сегодня языков.
Также стоит отметить, что в старые добрые времена программирования на прямом ассемблере программы, которые изменялись во время выполнения, были необходимыми и очень распространенными.
Из эссе Пола Грэма «Что сделало Лисп другим» :
Во многих языках есть то, что называется макросом. Но макросы Lisp уникальны. И, хотите верьте, хотите нет, но то, что они делают, связано со скобками. Разработчики Lisp не поместили все эти скобки в язык просто для того, чтобы отличаться. Программисту Blub код на Лиспе кажется странным. Но эти скобки не зря. Они являются очевидным свидетельством фундаментального различия Лиспа и других языков.
Код на Лиспе состоит из объектов данных Лиспа. И не в том банальном смысле, что исходные файлы содержат символы, а строки являются одним из типов данных, поддерживаемых языком. Код Лиспа после того, как он прочитан синтаксическим анализатором, состоит из структур данных, которые вы можете перемещать.
Если вы понимаете, как работают компиляторы, то на самом деле происходит не столько то, что Лисп имеет странный синтаксис, сколько то, что Лисп не имеет синтаксиса. Вы пишете программы в деревьях синтаксического анализа, которые генерируются в компиляторе при синтаксическом анализе других языков. Но эти деревья синтаксического анализа полностью доступны для ваших программ. Вы можете писать программы, которые ими управляют. В Лиспе эти программы называются макросами. Это программы, которые пишут программы.
Программы, пишущие программы? Когда бы вы когда-нибудь захотели это сделать? Не очень часто, если подумать на Коболе. Все время, если думать на Лиспе. Было бы удобно, если бы я мог привести пример мощного макроса и сказать там! как насчет этого? Но если бы я это сделал, это было бы просто тарабарщиной для человека, не знающего Лисп; здесь нет места, чтобы объяснить все, что вам нужно знать, чтобы понять, что это значит. В Ansi Common Lisp я старался продвигать вещи так быстро, как мог, и даже в этом случае я не дошел до макросов до страницы 160.
Но я думаю, что могу привести доводы, которые могут быть убедительными. Исходный код редактора Viaweb, вероятно, состоял примерно на 20-25% из макросов. Макросы сложнее писать, чем обычные функции Лиспа, и считается плохим стилем использовать их, когда они не нужны. Таким образом, каждый макрос в этом коде присутствует потому, что должен быть. Это означает, что по крайней мере 20-25% кода в этой программе выполняет то, что вы не можете легко сделать на любом другом языке. Каким бы скептиком ни относился программист Blub к моим утверждениям о таинственных способностях Lisp, это должно вызвать у него любопытство. Мы писали этот код не для собственного развлечения. Мы были крохотным стартапом и программировали изо всех сил, чтобы создать технические барьеры между нами и нашими конкурентами.
Подозрительный человек может задаться вопросом, есть ли здесь какая-то корреляция. Большая часть нашего кода выполняла вещи, которые очень трудно сделать на других языках. Получившееся программное обеспечение делало то, чего не могли делать программы наших конкурентов. Может, была какая-то связь. Я призываю вас следовать этой теме. В этом старике, ковыляющем на костылях, может быть больше, чем кажется на первый взгляд.