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

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

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

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


person Saif al Harthi    schedule 16.12.2010    source источник


Ответы (7)


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

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

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

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

Другой пример - фреймворки:

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

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

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

person Jörg W Mittag    schedule 16.12.2010
comment
очень хорошо, макросы в Office тоже считаются метапрограммированием? - person Saif al Harthi; 16.12.2010

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

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

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

person Goran Jovic    schedule 16.12.2010
comment
Я понимаю это, но я видел, как рубиновый парень сохранял какой-то рубиновый код в файле журнала, а затем запускал его снова, и он объяснил, что он будет использовать этот метод для создания приложения-генератора музыки или чего-то еще, поэтому я начал задаваться вопросом, где можно использовать метапрограммирование или используются в реальных приложениях - person Saif al Harthi; 16.12.2010
comment
Если вы когда-либо использовали отражение в реальных приложениях, значит, вы занимались метапрограммированием. Вероятно, вы говорите о генерации кода. Это всего лишь один из методов метапрограммирования, и не самый лучший (хотя он может быть идеальным для конкретной задачи музыкального генератора). - person Goran Jovic; 16.12.2010
comment
Лучший? Это просто технологии для манипулирования кодом. Лучшего нет. Используйте правильный инструмент для правильной работы. - person Ira Baxter; 22.12.2010
comment
@Ira: Я исправлюсь. Я должен был написать, не всегда лучший. - person Goran Jovic; 22.12.2010

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

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

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

person Ira Baxter    schedule 20.12.2010

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

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

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

person miku    schedule 16.12.2010
comment
Я знаю, что Ruby имеет возможность метапрограммирования, а также C # Compiler в качестве службы добавит метапрограммирование к языку, но я действительно думаю, что он используется в реальных приложениях - person Saif al Harthi; 16.12.2010

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

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

person 9000    schedule 16.12.2010

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

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

  • Blitz ++, библиотека для написания эффективного кода для управления массивами
  • Строительные блоки Intel Array
  • CGAL
  • Boost :: spirit, Boost :: graph
person Alexandre C.    schedule 18.12.2010

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

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

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

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

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

person SK-logic    schedule 16.12.2010