Метапрограмування стосується різноманітних способів, якими програма володіє знаннями про себе або може маніпулювати собою.
У таких мовах, як C #, відображення є формою метапрограмування, оскільки програма може вивчати інформацію про себе. Наприклад, повернення списку всіх властивостей об'єкта.
Такими мовами, як ActionScript, ви можете оцінювати функції під час виконання для створення нових програм, таких як eval ("x" + i). DoSomething () вплине на об'єкт, який називається x1, коли i дорівнює 1, а x2, коли я дорівнює 2.
Нарешті, ще одна поширена форма метапрограмування - це коли програма може змінити себе нетривіально. LISP добре відомий цим, і це те, що Пол Грехем виступав десь десять років тому. Мені доведеться переглянути деякі його конкретні нариси. Але ідея полягає в тому, що програма змінила б іншу частину програми на основі свого стану. Це дозволяє забезпечити рівень гнучкості для прийняття рішень під час виконання, що в більшості популярних мов сьогодні дуже важко.
Варто також зазначити, що ще в добрі дні програмування в прямому зібранні програми, які змінювали себе під час виконання, були необхідними і дуже звичними.
З есе Пола Грема "Що зробило Ліппа різним" :
У багатьох мовах є щось, що називається макросом. Але макроси Lisp унікальні. І вірите чи ні, те, що вони роблять, пов’язане з дужками. Дизайнери Lisp не поставили всі ці дужки в мові, щоб вони були різними. Для програміста Blub код Lisp виглядає дивно. Але ці дужки існують не просто так. Вони є зовнішнім свідченням принципової різниці між Lisp та іншими мовами.
Код Lisp складається з об'єктів даних Lisp. І не в тривіальному сенсі, що вихідні файли містять символи, а рядки є одним із типів даних, підтримуваних мовою. Після прочитання парсером код Lisp складається з структур даних, які можна пройти.
Якщо ви розумієте, як працюють компілятори, те, що відбувається насправді, полягає не стільки в тому, що у Lisp є дивний синтаксис, скільки в Lisp, який не має синтаксису. Ви записуєте програми на дерева розбору, які генеруються в компіляторі під час розбору інших мов. Але ці дерева розбору повністю доступні для ваших програм. Ви можете писати програми, які ними маніпулюють. У Ліспі ці програми називають макросами. Це програми, які пишуть програми.
Програми, які пишуть програми? Коли ти коли-небудь захотів би це зробити? Не дуже часто, якщо думати в Коболі. Весь час, якщо думати в Ліспі. Тут було б зручно, якби я міг навести приклад потужного макросу і сказати там! як щодо цього? Але якби я це зробив, це було б просто схоже на хитрість до того, хто не знав Ліспа; тут немає місця, щоб пояснити все, що потрібно знати, щоб зрозуміти, що це означає. В Ansi Common Lisp я намагався рухати речі так швидко, як тільки міг, і навіть так не потрапив до макросів до сторінки 160.
Але я думаю, що можу навести певний аргумент, який може бути переконливим. Вихідний код редактора Viaweb, ймовірно, мав приблизно 20-25% макросів. Макроси писати складніше, ніж звичайні функції Lisp, і вважати, що це поганий стиль використовувати їх, коли вони не потрібні. Отже, кожен макрос у цьому коді є, тому що він повинен бути. Це означає, що щонайменше 20-25% коду в цій програмі роблять речі, які ви не можете легко зробити жодною іншою мовою. Як би скептично налаштований програміст Блуб щодо моїх претензій на таємничі сили Ліспа, це повинно викликати у нього цікавість. Ми не писали цей код для власної розваги. Ми були крихітними стартапами, програмуючи настільки важко, як могли, щоб поставити технічні бар'єри між нами та нашими конкурентами.
Підозріла людина може почати замислюватися, чи є тут якась кореляція. Великий фрагмент нашого коду робив речі, які дуже важко зробити іншими мовами. Отримане програмне забезпечення робило те, що програмне забезпечення наших конкурентів не могло зробити. Можливо, був якийсь зв’язок. Я закликаю вас слідувати цій темі. Можливо, до цього старого чоловіка більше, ніж на очах, хапається, ніж на очах.