Я читал статью на TheServerSide о программировании плойглотов на платформе Java . Некоторые комментарии в статье относятся к метапрограммированию как к способности генерировать код (возможно, «на лету»).
Метапрограммирование способности генерировать код на лету или способность внедрять методы и атрибуты в существующие объекты во время выполнения (например, то, что позволяют некоторые динамические языки, такие как Python, Ruby и Groovy).
metaprogramming
Параг
источник
источник
Ответы:
Метапрограммирование относится к множеству способов, которыми программа познает себя или может управлять собой.
В таких языках, как C #, отражение - это форма метапрограммирования, поскольку программа может исследовать информацию о себе. Например, возврат списка всех свойств объекта.
В таких языках, как ActionScript, вы можете оценивать функции во время выполнения для создания новых программ, таких как eval ("x" + i). DoSomething () повлияет на объект с именем x1, когда i равен 1, и x2, когда i равен 2.
Наконец, еще одна распространенная форма метапрограммирования - это когда программа может изменяться нетривиальным образом. LISP хорошо известен этим, и это то, что Пол Грэм защищал около десяти лет назад. Мне придется поискать некоторые из его конкретных эссе. Но идея состоит в том, что программа будет изменять другую часть программы в зависимости от своего состояния. Это обеспечивает уровень гибкости для принятия решений во время выполнения, что очень сложно на большинстве популярных сегодня языков.
Также стоит отметить, что в старые добрые времена программирования на прямом ассемблере программы, которые изменялись во время выполнения, были необходимыми и очень распространенными.
Из эссе Пола Грэма «Что сделало Лисп другим» :
источник
in order to put technical barriers between us and our competitors
и это тамаде правильно.Отличный вопрос. Мне очень жаль, что ни один из ответов в настоящее время не отвечает на ваш вопрос правильно. Возможно, я смогу помочь ...
Определение метапрограммирования действительно довольно просто: оно означает программы, которые манипулируют программами.
Ваш принятый ответ говорит о программах, которые манипулируют собой. Это действительно метапрограммы, но они являются подмножеством всех метапрограмм.
Все:
метапрограммы. Итак, компилятор GCC - это метапрограмма, интерпретатор CPython - это метапрограмма, система компьютерной алгебры Mathematica - это метапрограмма, средство доказательства теорем Coq - это метапрограмма и так далее.
В других ответах утверждалось, что метапрограммы - это программы, которые генерируют другие программы. Это действительно метапрограммы, но, опять же, они являются подмножеством всех метапрограмм. Библиотека самого быстрого преобразования Фурье на Западе (FFTW) является примером такой метапрограммы. Исходный код написан в основном на OCaml и генерирует биты кода C (называемые кодлетами), которые объединяются для создания высокопроизводительных подпрограмм быстрого преобразования Фурье , оптимизированных для конкретных машин. Эта библиотека фактически используется для обеспечения подпрограмм БПФ в Matlab. Люди пишут программы для генерации численных методов на протяжении десятилетий, с первых дней FORTRAN .
Первым языком программирования, который интегрировал поддержку метапрограммирования, был язык LISt Processor (LISP) в конце 1950-х годов. LISP 1.5 включает ряд функций, упрощающих метапрограммирование. Во-первых, основной тип данных LISP - это вложенные списки, т. Е. Подобные деревья
(a (b c) d)
, что означает, что любой код LISP может быть изначально выражен как структура данных. Это известно как гомоиконность. Во-вторых, код LISP можно легко преобразовать в данные с помощью QUOTE. Например,(+ 1 2 3)
складывает 1 + 2 + 3 и(QUOTE (+ 1 2 3))
создает выражение, которое добавляет 1 + 2 + 3 при оценке. В-третьих, LISP предоставил мета-циклический анализатор, который позволяет вам использовать интерпретатор или компилятор хоста для оценки кода LISP во время выполнения, включая код LISP, сгенерированный во время выполнения. Потомки LISP включают Scheme и Clojure, Во всех этих языках метапрограммирование чаще всего встречается в форме программ, которые изменяют себя, обычно с использованием макросов.В 1970-х Робин Милнер разработал MetaLanguage (ML), который превратился в семейство языков программирования ML, которое включает Standard ML и OCaml и сильно повлияло на Haskell и F # . Эти языки позволяют легко выражать другие языки. В этих языках метапрограммы чаще всего встречаются в форме лексеров, синтаксических анализаторов, интерпретаторов и компиляторов.
В 1994 году Эрвин Унру обнаружил, что система шаблонов C ++ завершена по Тьюрингу и может использоваться для выполнения произвольных программ во время компиляции . Метапрограммирование шаблонов C ++ принесло метапрограммирование немытым массам, которые (ab) использовали его для множества разных целей, включая создание численных методов в библиотеке Blitz ++ .
источник
Что ж, метапрограммирование - это просто программирование, но в основном это «написание кода, который пишет код» .
Упомянутая вами способность, когда программа может наблюдать и изменять свою собственную структуру и поведение, называется отражением, и это тип метапрограммирования.
Языки с динамической типизацией обладают мощными функциями отражения во время выполнения, что стало возможным благодаря интерпретируемой природе этих языков ...
В языках со статической типизацией также есть мощные методы метапрограммирования, например метапрограммирование шаблона C ++ ...
источник
Это всего лишь мое личное мнение, которое, вероятно, является наиболее либеральным определением метапрограммирования.
Думаю, сюда входят:
Я думаю, вы можете достичь этого, используя любое из них и в сочетании:
источник
Метапрограммирование - это написание программы, которая выводит другую программу. В этом действительно хороши языки вроде Lisp. Это намного проще сделать на языке, который поддерживает настоящие макросы (не макросы C ++, а скорее те, которые могут манипулировать кодом, который они выводят), например Ruby, Lisp, Scheme и т. Д., Чем на таком языке, как Java.
Одна реализация заключается в создании «предметно-ориентированного языка», который является способом улучшения языка программирования для выполнения конкретной задачи. Если все сделано правильно, это может быть невероятно мощным. Ruby on Rails - хороший пример такого рода программирования.
Если вы заинтересованы в изучении этого метода, посмотрите « Структура и интерпретация компьютерных программ», которая является одной из основополагающих книг по этой теме.
источник
По сути, это написание кода, который выводит больше кода, который запускается для достижения какой-то цели. Обычно это делается либо на том же языке (используя javascript для создания строки javascript, затем
eval
ее), либо для вывода на другом языке (используя .NET для создания командного файла Windows).источник
В Википедии есть хорошая статья по этой теме. Чтобы что-то квалифицировалось как метапрограммирование, не нужно вносить изменения во время выполнения. Например, многие люди используют шаблоны C ++ для метапрограммирования во время компиляции.
источник