Метапрограммирование | это... Что такое Метапрограммирование? (original) (raw)
- Агентно-ориентированная
- Компонентно-ориентированная
- Конкатенативная
- Декларативная (контрастирует с Императивной)
- Событийно-ориентированная
- Комбинаторная
- Императивная (контрастирует с Декларативной)
- Предметно-ориентированная
- Метапрограммирование
- Автоматизация процесса программирования
- Обобщённое программирование
- Рефлексивно-ориентированная
- Итерационная
- Параллельная
- Структурная
Шаблон: Просмотр • программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы[1] (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 1251 день] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
Генерация кода
При этом подходе код программы не пишется вручную, а создается автоматически программой-генератором на основе другой, более простой программы.
Такой подход приобретает смысл, если при программировании вырабатываются различные дополнительные правила (более высокоуровневые парадигмы, выполнение требований внешних библиотек, стереотипные методы реализации определенных функций и пр.). При этом часть кода теряет содержательный смысл и становится лишь механическим выполнением правил. Когда эта часть становится значительной, возникает мысль задавать вручную лишь содержательную часть, а остальное добавлять автоматически. Это и проделывает генератор.
Реализуется двумя основными методами:
- Шаблоны (наиболее известные случаи применения — препроцессор Си и шаблоны в C++)
Решают задачу, если соблюдение «правил» сводится к вставке в программу повторяющихся (или почти повторяющихся) кусков кода. Помимо этого, обладают ещё рядом достоинств: например, помогают повторному использованию. См. также: полиморфизм
- Внеязыковые средства (пример: генераторы синтаксических и лексических анализаторов lex, yacc, bison)
Применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это — более высокоуровневый язык программирования, а генератор — не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм.
- В Perl существует понятие «source filters» («фильтров исходного кода») — метода переработки файлов с исходным кодом перед выполнением, позволяющего полностью менять синтаксис и семантику языка. Одним из известных примеров является модуль Lingua::Romana::Perligata, позволяющий писать код Perl на латыни.[2]
- В Форт программисту предоставляют встроенные в язык возможности по изменению своего синтаксиса и семантики. Это достигается определением архитектуры виртуальной машины и полного доступа к возможностям изменения её составляющих.
Самомодифицирующийся код
Возможность изменять или дополнять себя во время выполнения превращает программу в виртуальную машину. Хотя такая возможность существовала уже давно на уровне машинных кодов (и активно использовалась, например, при создании полиморфных вирусов), с метапрограммированием обычно связывают перенос подобных технологий в высокоуровневые языки.
Основные методы реализации:
- Интроспекция — представление внутренних структур языка в виде переменных встроенных типов с возможностью доступа к ним из программы.
Позволяет во время выполнения просматривать, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.
Пространство имён
System.Reflection
и типSystem.Type
в .NET; классыClass, Method, Field
в Java; представление пространств имен и определений типов через встроенные типы данных в Python; стандартные встроенные возможности в Форт по доступу к ресурсам виртуальной машины; получение значения и изменение свойств почти любого из объектов в ECMAScript (с оговорками).Интерпретация произвольного кода, представленного в виде строки.
В языке Пролог метапрограммирование позволяет автоматизировать разработку и верификацию (проверку свойств) Пролог-программ. Метапрограммы рассматривают программы на Прологе как термы и позволяют анализировать их свойства и взаимоотношения, строить программы для управления другими Пролог-программами[3].
См. также
Примечания
- ↑ Джонатан Бартлетт, Искусство метапрограммирования, Часть 1: Введение в метапрограммирование
- ↑ Lingua::Romana::Perligata — search.cpan.org
- ↑ Метакидес, Нероуд, 1998
Литература
- Метакидес Г., Нероуд А. Принципы логики и логического программирования = Principles of Logic and Logic Programming. — М.: Факториал, 1998. — С. 252-253. — 288 с. — ISBN 5-88688-037-2
Ссылки
- R# — метапрограммирование в .Net
- BOOST MPL LIBRARY (англ.) — библиотека для метапрограммирования с использованием шаблонов C++
- Boost Preprocessor Library (англ.) — библиотека для метапрограммирования с использованием препроцессора C++
- Статья об ещё одном подходе к метапрограммированию (англ.)
- Клаус Крэфт, Анжелика Лангер. Шаблоны выражений (expression templates). Часть 1 Часть 2
- Джонатан Бартлетт, Искусство метапрограммирования, Часть 1: Введение в метапрограммирование
Категория:
- Парадигмы программирования
Wikimedia Foundation.2010.
Полезное
Смотреть что такое "Метапрограммирование" в других словарях:
- C++ — У этого термина существуют и другие значения, см. C. См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в … Википедия
- Boost (библиотека) — Boost Тип библиотека (программирование) Написана на С++ Операционная система Кроссплатформенный Последняя версия Boo … Википедия
- Nemerle — Семантика: мультипарадигменный, объектно ориентированный, функциональный, императивный Тип исполнения: компилируемый Появился в: 0.9.3 16 мая … Википедия
- Boost — Тип библиотека (программирование) Написана на С++ Операционная система Кроссплатформенный Последняя версия Boost 1.52.0 (05.11.2012) … Википедия
- Библиотека Boost — Boost Тип библиотека (программирование) Написана на С++ ОС Кроссплатформенный Версия Boost 1.39.0 02.05.2009 … Википедия
- С++ — См. также: Си (язык программирования) C++ Семантика: мультипарадигмальный: объектно ориентированное, обобщённое, процедурное, метапрограммирование Тип исполнения: компилируемый Появился в: 1985 г. Автор(ы): Бьёрн Страуструп … Википедия
- Python — У этого термина существуют и другие значения, см. Python (значения). Python Класс языка: му … Википедия
- Лилли, Джон — Об английском драматурге см. статью: Лили, Джон … Википедия
- Джон Каннингэм Лилли — Об английском драматурге см. статью: Лили, Джон Джон Лилли Джон Каннингэм Лилли (англ. John Cunningham Lilly) (6 января 1915 30 сентября 2001) американский врач психоаналитик, учёный нейробиолог. Известен своими исследованиями природы сознания… … Википедия
- Джон Лилли — Об английском драматурге см. статью: Лили, Джон Джон Лилли Джон Каннингэм Лилли (англ. John Cunningham Lilly) (6 января 1915 30 сентября 2001) американский врач психоаналитик, учёный нейробиолог. Известен своими исследованиями природы сознания… … Википедия