Я думаю, ви запитуєте про дві різні речі.
- Здатність мови програмування представляти всі свої програми як дані.
- Мислення про програми як дані.
В аналітичних цілях корисно тримати їх окремо. Я зупинюсь на першому.
Здатність мов програмування представляти, маніпулювати (і запускати) свої програми як дані переходить під такі терміни, як метапрограмування або
гомоіконічність .
(Незручно) всім відомі мови програмування можуть робити метапрограмування, а саме, використовуючи тип рядкових даних разом із можливістю виклику зовнішніх програм (компілятор, лінкер тощо) на рядках (наприклад, записуючи їх у файл система спочатку). Однак це, мабуть, не так. Напевно у вас є гарний синтаксис. Рядки - це не симпатичний синтаксис для представлення програми, оскільки майже всі рядки не представляють програми, тобто тип рядкових даних містить багато "мотлоху", коли розглядається як механізм представлення програми. Що ще гірше, алгебра струнних операцій по суті не має зв'язку з алгеброю побудови програми.
Те, що ви, мабуть, маєте на увазі - це щось набагато приємніше. Наприклад , якщо є програмою, то ⟨ P ⟩ є , а також дані, під рукою для маніпулювання і аналізу. Це часто називають цитатою . На практиці котирування негнучкі, тому ми використовуємо квазіцитацію , яка є узагальненням котирування, де цитата може мати "дірки", в яких можна запускати програми, які надають дані для "заповнення" дірок. Наприклад, - квазі-цитата, що представляє собою умовну, де замість умови у нас є діркаП⟨ P⟩⟨ я еП[ ⋅ ]
⟨ Я е[ ⋅ ]т ч е н7еl s e8 + 9⟩
[ ⋅ ]. Якщо програма оцінює дані , то квазіцитата оцінює дані
М⟨ Х > 0 ⟩⟨ Я е[ М]т ч е н7e l s e8 + 9 ⟩
⟨ Я еx > 0т ч е н7e l s e8 + 9 ⟩ .
(Зауважте, що - це звичайна програма (а не програма як дані), яка повертає програму, що цитується, тобто програму як дані.) Для того, щоб це працювало, для представлення програм вам потрібен тип даних. Зазвичай цей тип даних називається AST (абстрактне синтаксичне дерево), і ви можете бачити (квазі) лапки як механізми абревіатури для AST.М
Кілька мов програмування пропонують квазіцитати та інші функції метапрограмування. Саме Лісп з його функціональністю макросування вперто вніс цю здатність сприймати програми як дані. Можливо, на жаль, потужність макросів, заснованих на Ліппі, давно бачилася, що значною мірою спирається на мінімалістичний синтаксис Ліспа; Лише в MetaML (1) було показано, що сучасна синтаксично багата мова здатна до метапрограмування. Відтоді MetaOCaml (2) (нащадок MetaML, важливий для його прориву в досі триваючих пошуках вирішення проблеми, як вводити програми як дані), Шаблон Haskell (3) та Converge (4) (перша мова для отримати всі ключові функції метапрограмування, на мою думку) показали, що різноманітні сучасні мови програмування можуть містити метапрограмування. Важливо усвідомити, що ми можемо взятибудь-яку мову програмування та перетворити її на мову метапрограмування
яка є разом із можливістю представлення (та оцінки) власних програм як даних.LLм пL
Представлення результату запущеної програми, поданої у вигляді даних, досягається додаванням функції яка приймає програму (дану як дані) як вхідну та запускає її , повертаючи свій результат. Наприклад, якщо - програма, що оцінює до 17 і , (квазі) котирується версія , тобто як дані, то також повертається 17. Є всі способи тонкощі тут, які я тут ігнорую, наприклад питання, колиe v a l (⋅)ПР Р е V л ( ⟨ Р ⟩ ) Р ⟨ Р ⟩⟨ P⟩ППе v L (⟨Р⟩ )метапрограмовані програми оцінюються (спричиняючи різницю між мета-програмуванням часу компіляції та часу виконання), що робити з типами чи неспроможними оцінками, що відбувається з обмеженими та вільними змінними в процесі переходу від до або навпаки.П⟨ P⟩
Щодо другого аспекту, міркування про програми, що даються як дані. Як тільки ви можете перетворити програми в дані, вони є "нормальними" даними і можуть бути аргументовані як дані. Ви можете використовувати всі способи перевірки технологій, наприклад залежні типи чи контракти, інтерактивні докази теореми чи автоматизовані інструменти, як Джошуа зазначив. Однак вам доведеться представляти семантику вашої мови в процесі міркування. Якщо ця мова, як вам потрібно, має метапрограмування, все може стати дещо складним, і в цьому напрямку не було зроблено багато роботи, при цьому (5) є єдиною логікою програми для цієї мети. Існує також робота, що базується на Кері-Говарді над міркуванням про метапрограмування (6, 7, 8). Зауважте, що ці підходи, засновані на логіці, і підхід, заснований на типі (2), дійсно може виражати властивості, які існують для всіх майбутніх етапів метапрограмування. Крім (2) жодна з цих робіт не була виконана.
Підсумовуючи це: те, що ви просили, було реалізовано, але це досить тонко, і все ще є відкриті запитання, зокрема, що стосується типів та спрощених міркувань.
В. Таха. Багатоетапне програмування: його теорія та застосування .
В. Таха та М. Ф. Нільсен. Класифікатори навколишнього середовища .
Т. Шеард і С. Пейтон Джонс. Метапрограмування шаблонів для Haskell .
Л. Тратт. Скомпілювати метапрограмування за часом у динамічно набраній мові ОО .
М. Бергер, Л. Тратт, Логіка програм для однорідного метапрограмування .
Р. Девіс, Ф. Пфеннінг, Модальний аналіз поетапних обчислень .
Р. Девіс, часово-логічний підхід до аналізу часових зв'язків .
Т. Цукада, А. Ігараші. Логічна основа класифікаторів середовища .