Метапрограммирование
Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 5546 дней] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).
Генерация кода
При этом подходе код программы не пишется вручную, а создается автоматически программой-генератором на основе другой, более простой программы.
Такой подход приобретает смысл, если при программировании вырабатываются различные дополнительные правила (более высокоуровневые парадигмы, выполнение требований внешних библиотек, стереотипные методы реализации определенных функций и пр.). При этом часть кода теряет содержательный смысл и становится лишь механическим выполнением правил. Когда эта часть становится значительной, возникает мысль задавать вручную лишь содержательную часть, а остальное добавлять автоматически. Это и проделывает генератор.
Реализуется 2 основными методами:
- Шаблоны (наиболее известные случаи применения — препроцессор Си и шаблоны в C++)
- Решают задачу, если соблюдение «правил» сводится к вставке в программу повторяющихся (или почти повторяющихся) кусков кода. Помимо этого, обладают еще рядом достоинств: например, помогают повторному использованию. См. также параметрический полиморфизм
- Внешнеязыковые средства (пример: генераторы синтаксических и лексических анализаторов lex, yacc, bison)
- Применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это — более высокоуровневый язык программирования, а генератор — не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм (таких, как паттерны проектирования).
- В Perl существует понятие «source filters» («фильтров исходного кода») — метода переработки файлов с исходным кодом перед выполнением, позволяющего полностью менять синтаксис и семантику языка. Одним из известных примеров является модуль Lingua::Romana::Perligata, позволяющий писать код Perl на латыни.[1]
- В Forth программисту предоставляют встроенные в язык возможности по изменению своего синтаксиса и семантики. Это достигается определением архитектуры виртуальной машины и полного доступа к возможностям изменения её составляющих.
Самомодифицирующийся код
Возможность изменять или дополнять себя во время выполнения превращает программу в виртуальную машину. Хотя такая возможность существовала уже давно на уровне машинных кодов (и активно использовалась, например, при создании полиморфных вирусов), с метапрограммированием обычно связывают перенос подобных технологий в высокоуровневые языки.
Основные методы реализации:
- Интроспекция — представление внутренних структур языка в виде переменных встроенных типов с возможностью доступа к ним из программы.
- Позволяет во время выполнения смотреть, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.
- Интерпретация произвольного кода, представленного в виде строки
- Существует естественным образом во множестве интерпретируемых языков, например eval() в PHP.
- Компилятор Tiny C позволяет «на лету» компилировать и исполнять код на языке C, представленный в виде строки символов. Также урезанный компилятор C используется внутри игры Alien Shooter для описания уровней.
- Для Forth использования процедуры интерпретации из строки EVALUATE.
Принципиальный недостаток технологий этого направления — неприменимость к компилируемым языкам. Можно ввести в такой язык интерпретатор, как в вышеуказанной библиотеке для С++, но это практически сведет на нет главное преимущество данных языков — производительность. Хороший задел компиляции программы при загрузке, сравнимый с С, демонстрируют удачные реализации Forth языка. Например российский spf4 в тестах сравнения с Си.[2]
Примечания
- ↑ http://search.cpan.org/perldoc?Lingua::Romana::Perligata
- ↑ http://www.forth.org.ru/~af/shootout.htm (обновление 2002 год)
См. также
- Quine
- Предметно-ориентированный язык программирования
- Forth — язык, изначально имеющий расширенные механизмы метапрограммирования.
- Smalltalk — старейший, полностью объектно ориентированый язык программирования, использующий динамическую компиляцию.
- Lisp — старейший язык программирования, естественным образом поддерживающий метапрограммирование.
- Template Haskell — расширение языка Haskell, позволяющее манипулировать синтаксическими деревьями во время компиляции.
- Ruby — «Лисп для простых смертных», простой и одновременно мощный язык программирования.
- Nemerle — язык программирования для платформы .NET со встроенной поддержкой метапрограммирования.
Ссылки
- R# — метапрограммирование в .Net.
- BOOST MPL LIBRARY(англ.) — библиотека для метапрограммирования с использованием шаблонов C++.
- Boost Preprocessor Library(англ.) — библиотека для метапрограммирования с использованием препроцессора C++.
- Статья об ещё одном подходе к метапрограммированию
SQL | Это незавершённая статья о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |
Ошибка: неверное или отсутствующее изображение |
Для улучшения этой статьи желательно?:
|
de:Metaprogrammierung en:Metaprogramming es:Metaprogramación fr:Métaprogrammation ja:メタプログラミング pl:Metaprogramowanie pt:Metaprogramação th:เมทาโปรแกรมมิง vi:Lập trình meta zh:元编程
Если вам нравится SbUP.com Сайт, вы можете поддержать его - BTC: bc1qppjcl3c2cyjazy6lepmrv3fh6ke9mxs7zpfky0 , TRC20 и ещё....