Существуют ли реальные приложения, использующие метапрограммирование? - PullRequest
2 голосов
/ 16 декабря 2010

Мы все знаем, что метапрограммирование - это концепция кода == данных (или программ, которые пишут программы).

Но есть ли приложения, которые его используют и каковы преимущества его использования?

Этот вопрос можно закрыть, но я не видел связанных вопросов.

Ответы [ 7 ]

7 голосов
/ 16 декабря 2010

IDE заполнены метапрограммированием:

  • завершение кода
  • генерация кода
  • автоматизированный рефакторинг

Метапрограммирование часто используется для обхода ограничений Java:

  • генерация кода для обхода многословия (например, getter / setter)
  • генерация кода для обхода сложности (например, генерация кода Swing из редактора WYSIWIG)
  • Перезапись времени компиляции времени / загрузки / времени выполнения для обхода отсутствующих функций (AOP, Kilim)
  • генерация кода на основе аннотаций (Hibernate)

Каркасы являются еще одним примером:

  • создание моделей, представлений, контроллеров, хелперов, наборов тестов в Ruby on Rails
  • генерация генераторов в Ruby on Rails (мета-круговое метапрограммирование FTW!)

В Ruby вы почти ничего не можете сделать 1032 * без метапрограммирования. Даже простое определение метода - это запуск кода, генерирующего код.

Даже если у вас есть простой сценарий оболочки, который устанавливает базовую структуру проекта, это метапрограммирование.

4 голосов
/ 16 декабря 2010

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

На по этой ссылке вы можете увидеть статью о реальном приложении, написанную частично на Clojure, диалекте Lisp.

Дело не в том, чтобы писать программы, которые пишут программы, просто потому, что вы можете, а в том, чтобы добавлять новые функции к вашему языку , когда вам это действительно нужно . Подумайте, можете ли вы просто добавить новое ключевое слово в Java или C # ...

2 голосов
/ 20 декабря 2010

Если вы реализуете метапрограммирование независимо от языка, вы получаете систему анализа и преобразования программ.Это именно тот инструмент, который рассматривает (произвольные) программы как данные.Они могут быть использованы для выполнения произвольных преобразований в произвольных программах.

Это также означает, что вы не ограничены конкретными функциями метапрограммирования, которые ребята из компилятора случайно добавили в ваш язык.Например, хотя в C ++ есть шаблоны, в нем нет «отражения».Но система трансформации программы может обеспечить отражение, даже если базовый язык не имеет его.В частности, наличие механизма преобразования программ означает, что вам никогда не придется говорить «Извините, ваш язык не поддерживает метапрограммирование (достаточно хорошо), поэтому я ничего не могу сделать, кроме написания кода вручную» * .

См. Наш инструментарий реинжиниринга программного обеспечения DMS для такой системы преобразования программ.Он использовался для создания инструментов тестирования и профилирования, инструментов генерации кода, инструментов для изменения архитектуры крупномасштабных приложений C ++, инструментов для переноса приложений из одного языка в другой, ... Это все чрезвычайно практично.Большинство задач, выполняемых с помощью DMS, было бы совершенно нецелесообразно выполнять вручную.

2 голосов
/ 16 декабря 2010

Не реальное приложение, а разговор о метапрограммировании в ruby:

Google TechTalks 3 августа 2006 г. Джек Херрингтон, автор книги «Генерация кода в действии» (Мэннинг, июль 2003 г.), расскажет о методах генерации кода с использованием Ruby. Он расскажет о решениях «сделай сам» и о готовых решениях в беседе о том, где Ruby является инструментом и куда он идет.

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

1 голос
/ 18 декабря 2010

Метапрограммирование в C ++ позволяет вам писать код, который преобразуется при компиляции.

Есть несколько замечательных примеров, о которых я знаю (Google для них):

  • Blitz ++,библиотека для написания эффективного кода для работы с массивами
  • Intel Array Building Blocks
  • CGAL
  • Boost :: spirit, Boost :: graph
1 голос
/ 16 декабря 2010

Любой ORM на динамическом языке - это мгновенный пример практического метапрограммирования.Например, посмотрите, как SQLAlchemy или ORM Django создают классы для таблиц, которые он обнаруживает в базе данных, динамически, во время выполнения.

ORM и другие инструменты в мире Java, которые используют @annotations для изменения поведения классов, тоже немного метапрограммируют.

0 голосов
/ 16 декабря 2010

Многие компиляторы и интерпретаторы реализованы с помощью методов метапрограммирования внутренне - как цепочка переписывания кода.

ORM, шаблоны проектов, генерация кода GUI в IDE уже упоминались.

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

Такие вещи, как Autoconf, очевидно, являются случаями метапрограммирования.

На самом деле, вряд ли можно найти область программного обеспечения.развитие, которое не получит выгоду от той или иной формы метапрограммирования.

...