Miami-art.ru

Создание и развитие сайта

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

22-10-2023

Метапрограммирование — вид программирования, связанный с созданием программ, которые порождают другие программы как результат своей работы (в частности, на стадии компиляции их исходного кода), либо программ, которые меняют себя во время выполнения (самомодифицирующийся код).[источник не указан 1144 дня] Первое позволяет получать программы при меньших затратах времени и усилий на кодирование, чем если бы программист писал их вручную целиком, второе позволяет улучшить свойства кода (размер и быстродействие).

Содержание

Генерация кода

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

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

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

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

Самомодифицирующийся код

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

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

  • Интроспекция — представление внутренних структур языка в виде переменных встроенных типов с возможностью доступа к ним из программы.
Позволяет во время выполнения просматривать, создавать и изменять определения типов, стек вызовов, обращаться к переменной по имени, получаемому динамически и пр.
  • Пространство имён System.Reflection и тип System.Type в .NET; классы Class, Method, Field в Java; представление пространств имен и определений типов через встроенные типы данных в Python; стандартные встроенные возможности в Forth по доступу к ресурсам виртуальной машины; получение значения и изменение свойств почти любого из объектов в ECMAScript (с оговорками).
  • Интерпретация произвольного кода, представленного в виде строки
    • Существует естественным образом во множестве интерпретируемых языков, например eval() в PHP.
    • Компилятор Tiny C позволяет «на лету» компилировать и исполнять код на языке C, представленный в виде строки символов.
    • Для Forth использования процедуры интерпретации из строки EVALUATE.

Хороший задел компиляции программы при загрузке, сравнимый с С, демонстрируют удачные реализации Forth языка. Например российский spf4 в тестах сравнения с Си.[2]

Примечания

  1. Lingua::Romana::Perligata — search.cpan.org
  2. 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++.
  • Статья об ещё одном подходе к метапрограммированию (англ.)
  • Клаус Крэфт, Анжелика Лангер. Шаблоны выражений (expression templates). Часть 1. Часть 2.


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

© 2018–2023 miami-art.ru, Россия, Смоленск, ул. Загорская 8, офис 99, +7 (4812) 12-23-90