Введение
Парадигма программирования – техника компьютерного программирования.
the computer programming technique
Метапрограммирование – это техника программирования, при которой компьютерные программы способны воспринимать другие программы как свои данные. Это означает, что программа может быть разработана для чтения, генерации, анализа или преобразования других программ, и даже для изменения себя в процессе выполнения. В некоторых случаях это позволяет программистам минимизировать объем кода, необходимого для реализации решения, что, в свою очередь, сокращает время разработки. Это также обеспечивает программам большую гибкость при эффективной обработке новых ситуаций без перекомпиляции. Метапрограммирование может использоваться для переноса вычислений из времени выполнения в время компиляции, для генерации кода на основе вычислений, выполняемых во время компиляции, и для реализации самомодифицирующегося кода. Способность языка программирования быть своим собственным метаязыком называется рефлексией. Рефлексия – ценная характеристика языка, облегчающая метапрограммирование. Метапрограммирование получило распространение в 1970-х и 1980-х годах при использовании языков обработки списков, таких как LISP. Аппаратные машины LISP были популярны в 1980-х годах и позволяли обрабатывать код. Они часто использовались в приложениях искусственного интеллекта.
Подходы
Метапрограммирование позволяет разработчикам писать программы и разрабатывать код, который соответствует парадигме обобщенного программирования. Наличие самого языка программирования в качестве данных первого класса (как в Lisp, Prolog, SNOBOL или Rebol) также очень полезно; это известно как гомоиконичность. Обобщенное программирование использует возможности метапрограммирования в языке, позволяя писать код, не заботясь об указании типов данных, поскольку их можно передавать в качестве параметров при использовании. Метапрограммирование обычно реализуется одним из трех способов. Первый подход заключается в предоставлении доступа к внутренним механизмам среды выполнения через интерфейсы прикладного программирования (API), такие как API для NET IL-генератора. Второй подход – динамическое выполнение выражений, содержащих команды программирования, часто составленных из строк, но также получаемых из других методов с использованием аргументов или контекста, например, в JavaScript. Таким образом, «программы могут писать программы». Хотя оба подхода могут использоваться в одном языке, большинство языков склоняются к одному из них. Третий подход – выход за пределы языка. Системы преобразования программ общего назначения, такие как компиляторы, принимающие описания языков и выполняющие произвольные преобразования над ними, являются прямыми реализациями общего метапрограммирования. Это позволяет применять метапрограммирование практически к любому целевому языку, независимо от того, обладает ли этот язык собственными возможностями метапрограммирования. Это можно увидеть на примере Scheme и того, как он позволяет преодолеть некоторые ограничения C, используя конструкции, являющиеся частью самого языка Scheme, для расширения C.
Lisp, вероятно, является эталонным языком с возможностями метапрограммирования, как благодаря историческому приоритету, так и благодаря простоте и мощности его метапрограммирования. В метапрограммировании Lisp оператор unquote (обычно запятая) вводит код, который вычисляется во время определения программы, а не во время выполнения. Таким образом, язык метапрограммирования идентичен основному языку программирования, и существующие подпрограммы Lisp могут быть непосредственно повторно использованы для метапрограммирования, если это необходимо. Этот подход был реализован в других языках путем включения интерпретатора в программу, который работает непосредственно с данными программы. Существуют реализации такого рода для некоторых распространенных языков высокого уровня, таких как RemObjects Pascal Script для Object Pascal.
Код инструмента
Одно из применений метапрограммирования — инструментирование программ для проведения динамического анализа программ.
Зависимые типы
Использование зависимых типов позволяет доказать, что сгенерированный код всегда корректен. Однако этот подход находится на переднем крае разработки и редко встречается за пределами исследовательских языков программирования.
Реализация
Список заметных систем метапрограммирования поддерживается по адресу Список систем преобразования программ.