Netencyclo, The wikipedia mirror - свободную энциклопедию, которую может редактировать каждый : Метапрограммирование

- Метапрограммирование -

Метапрограммирование :

Метапрограммирование

Материал из Википедии — свободной энциклопедии

Перейти к: навигация, поиск

Метапрограммирование — создание программ, которые создают другие программы как результат своей работы (либо — частный случай — изменяющие или дополняющие себя во время выполнения).

Метапрограммирование можно разделить на 2 направления: на стадии компиляции (генерация кода) и на стадии выполнения (самомодифицирующийся код).

Первое направление позволяет получить программу при меньших затратах времени и усилий, чем если бы программист писал её вручную. Второе — расширяет возможности программиста.

Содержание

[править] Генерация кода

При этом подходе код программы не пишется вручную, а создается автоматически программой-генератором на основе другой, более простой программы.

Такой подход приобретает смысл, если при программировании вырабатываются различные дополнительные правила (более высокоуровневые парадигмы, выполнение требований внешних библиотек, стереотипные методы реализации определенных функций и пр.). При этом часть кода теряет содержательный смысл и становится лишь механическим выполнением правил. Когда эта часть становится значительной, возникает мысль задавать вручную лишь содержательную часть, а остальное добавлять автоматически. Это и проделывает генератор.

Реализуется 2 основными методами:

Решают задачу, если соблюдение «правил» сводится к вставке в программу повторяющихся (или почти повторяющихся) кусков кода. Помимо этого, обладают еще рядом достоинств: например, помогают повторному использованию. См. также параметрический полиморфизм
Применяются в случаях, если простых средств вроде шаблонов недостаточно. Язык генератора составляется так, чтобы автоматически или с минимальными усилиями со стороны программиста реализовывать правила парадигмы или необходимые специальные функции. Фактически, это — более высокоуровневый язык программирования, а генератор — не что иное, как транслятор. Генераторы пишутся, как правило, для создания специализированных программ, в которых очень значительная часть стереотипна, либо для реализации сложных парадигм (таких, как паттерны проектирования).
  • В Perl существует понятие «source filters» («фильтров исходного кода») — метода переработки файлов с исходным кодом перед выполнением, позволяющего полностью менять синтаксис и семантику языка. Одним из известных примеров является модуль Lingua::Romana::Perligata, позволяющий писать код Perl на латыни.[1]
  • В Forth программисту предоставляют, встроенные в язык, возможности по изменению своего синтаксиса и семантики. Это достигается определением архитектуры виртуальной машины и полного доступа к возможностям изменения её составляющих.

[править] Самомодифицирующийся код

Возможность изменять или дополнять себя во время выполнения превращает программу в виртуальную машину. Хотя такая возможность существовала уже давно на уровне машинных кодов (и активно использовалась, например, при создании полиморфных вирусов), с метапрограммированием обычно связывают перенос подобных технологий в высокоуровневые языки.

Основные методы реализации:

Позволяет во время выполнения смотреть, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.
  • Пространство имён System.Reflection и тип System.Type в .NET; классы Class, Method, Field в Java; представление пространств имен и определений типов через встроенные типы данных в Python; стандартные встроенные возможности в Forth по доступу к ресурсам виртуальной машины.

Принципиальный недостаток технологий этого направления — неприменимость к компилируемым языкам. Можно ввести в такой язык интерпретатор, как в вышеуказанной библиотеке для С++, но это практически сведет на нет главное преимущество данных языков — производительность. Хороший задел компиляции программы при загрузке, сравнимый с С, демонстрируют удачные реализации Forth языка. Например российский spf4 в тестах сравнения с Си.[2]

[править] Примечания

[править] См. также

[править] Ссылки


Метапрограммирование - Избранная статья

Метапрограммирование - Знаете ли вы, что…

© 2008 Netencyclo - Netencyclo Заглавная страница - Политика конфиденциальности - Отказ от ответственности - Program Policies
Netencyclo, the Wikipedia mirror : the biggest multilingual free-content encyclopedia on the Internet. Содержимое доступно в соответствии с GNU Free Documentation License. All Wikipedia content is licensed under the GNU Free Documentation License (see details). Content on this web site is provided for informational purposes only. We accept no responsibility for any loss, injury or inconvenience sustained by any person resulting from information published on this site. We encourage you to verify any critical information with the relevant authorities.