Полная структура метапрограммирования для Java?

Мне интересно метапрограммирование (т.е. программы, которые помогают программистам выполнять утомительные задачи программирования). Я ищу инструмент, который обладает следующими свойствами:

  • можно использовать как во время компиляции, так и во время выполнения;
  • проверяет структуру программы;
  • может добавлять новые классы, методы или поля и делать их видимыми для компилятора Java;
  • может изменять поведение методов;
  • Java-based (ну, Java - самый популярный язык программирования в соответствии с некоторыми рейтингами);
  • хорошая интеграция с IDE и создание таких инструментов, как Ant, Gradle или Maven;
  • активно поддерживаемый проект;
  • проста в использовании и распространяется;

Для этого есть несколько решений, например:

  • отражение
  • AspectJ
  • Инструмент обработки аннотаций
  • манипуляция bytecode (CGLIB, Javassist, java.lang.instrument)
  • Eclipse JDT
  • Проект Ломбок
  • Groovy, JRuby, Scala

Но, к сожалению, ни один из них не отвечает всем вышеперечисленным критериям. Есть ли полное решение метапрограммирования для Java?

Ответ 1

Там JackPot, который основан на Java, но я не думаю, что он уделяет большое внимание. Имеет АСТ и символические таблицы AFAIK. Вы, вероятно, можете расширить его; Я сомневаюсь, что кто-нибудь остановит вас (или поможет).

Здесь есть API-интерфейсы компилятора Java для компилятора Sun, er, Oracle java. Вероятно, они активно поддерживаются, но я не думаю, что вы можете изменить исходный код и восстановить его. Конечно, есть таблицы символов; dunno о деревьях. Вероятно, довольно сложно расширить; вы должны идти в ногу с парнями-компиляторами, а не наоборот.

Существует ANTLR, в котором реализована реализация Java и парсер Java, который будет строить АСТ. Я не думаю, что он имеет полные таблицы символов, поэтому серьезный анализ/пересмотр кода, вероятно, будет сложным. ANTLR, безусловно, активно поддерживается, и никто не будет возражать против вас, улучшая грамматику Java с помощью таблиц символов. Просто знайте, что вам понадобится около 6 месяцев для Java 1.6, если это все, что вы делаете. (Как долго это потребовалось нашему внутреннему [умному] парню, чтобы сделать это для DMS, начиная с поддержки таблицы символов для 1.4).

Не в Java и не легко интегрируется в IDE, но способен проводить массовый анализ и преобразование на Java-коде, это наш DMS Software Reengineering Toolkit с его Java Front End.

DMS - это универсальное компиляторное оборудование: синтаксический анализ, построение АСТ, оборудование таблиц символов, механизм анализа потока, с дополнительными бонусами преобразований источника в исходное состояние и универсальная отпечатка АСТ обратно к юридическому тексту, включая сохранение комментариев. Он предлагает набор API-интерфейсов, поддерживающих эти службы, и дополнительные инструменты для определения грамматик и зависимых от langauge анализаторов потока.

Передняя грань Java предоставляет важную информацию (используя эти API) для DMS, чтобы позволить ей обрабатывать Java: грамматику/парсер, построение полной таблицы символов для Java 1.4-1.6 (с задержкой 1.7 на мгновение), а также некоторый контроль и анализ потока данных (который будет расширяться со временем, потому что этот материал настолько полезен).

Используя сервисы, предоставляемые DMS и интерфейсом Java Front, можно разумно рассмотреть возможность создания произвольных Java-приложений anlaysis и инструментов преобразования. (Это делает инструмент "полным" инструментом метапрограммирования, поскольку он может проверять любую структуру языка или изменять любую языковую структуру, в отличие от метапрограммирования или отражения шаблона). Мы считаем, что это намного эффективнее, чем специальные инструменты, потому что вам не нужно создавать инфраструктуру, предоставляемая инфраструктура является надежной и обрабатывает случаи, когда у вас нет энергии для реализации, и она предназначена для поддержки таких задач. YMMV.

DMS/Java Front end были использованы для построения множества инструментов Java: охват тестирования, профилировщики, устранение мертвого кода, определение клона в масштабе, JavaDoc с гиперссылками исходного кода, быстрый синтаксический анализатор/генераторы XML и т.д.

Да, он активно поддерживается; претерпевает непрерывное совершенствование с первой версии в 1998 году.

Ответ 2

Там есть метапрограммирование Java, которое является частью Tapestry IOC, которое называется Plastic. Он запускает байт-коды класса с использованием пользовательских загрузчиков классов, я еще не пробовал его, но похоже, что он дает простой интерфейс, который все еще позволяет программисту производить мощные изменения метапрограммирования.

Ответ 3

Проверьте систему метапрограмм:

http://www.jetbrains.com/mps/

Он имеет отличную поддержку IDE и используется довольно часто умными людьми на JetBrains.