Как стать автором
Обновить

Модификация программы и что лучше менять: исполняемый код или AST программы?

Время на прочтение11 мин
Количество просмотров14K
Всего голосов 12: ↑11 и ↓1+10
Комментарии10

Комментарии 10

Элегантно решить не получится, т.к. кодогенерация — это костыль для языка. Различные фреймворки используют кодогенерацию для подмешивания в классы специфической функциональности. Яркий пример — JPA. EclipseLink умеет делать как статичную трансформацию во время компиляции (AST), так и динамическую трансформацию во время выполнения (Agent). Преимущественно должен использоваться второй способ, т.к. иначе генерируемый код является фреймворкозависимым и не может быть использован в другом приложении: например если я хочу сериализовать JPA-объекты и пересылать их клиенту, который знать не знает о JPA. То есть именно в зависимости от рантайма должны делаться те или иные преобразования.
Spoon не компилирует сам, а использует eclipse. Но от этого не легче, потому что в эклипсе тонны багов
Спасибо, интересно) Можно подробнее про тонны багов!?
Из того что я видел — это неоднозначно трактуемые части java lang spec, где то как себя ведет javac считается мейнстримом. Баги есть у любого компилятора. Но при всей открытости OpenJDK, javac нет в виде отдельного артефакта в репозитарии, а ejc — есть
У меня было 2 или 3 случая, когда ошибки возникали на совершенно невинных Java-конструкциях, например assert, помогало только их изменение или удаление. Впрочем, возможно, это были баги интеграции Spoon и eclipse. Плюс к паре паре более идентифицированных случаев, когда они сказали «won't fix» или даже что-то исправили.
А почему ECJ сразу не стали пробовать? Он вроде прост как 5 копеек
В смысле — пробовать ECJ? Напрямую использовать? Ну, наверное с ним нельзя сделать все те трансформации, построение AST и pretty printing, который можно со spoon, иначе зачем этот проект существует. ecj это безальтернативный бекенд в Spoon. В предыдущем комментарии я употребил «eclipse» как синоним ecj.
pretty printing точно не работает, тут вы правы.
AST строится и даже дополнительно может разрешать типы идентификаторов
Там еще есть удобная (для меня) вещь — фильтрация всего дерева одним махом лямбдой.

В целом качество проекта и кода у них могло быть и лучше, но радует что идет живое развитие и оперативно реагируют на баг-репорты. Да и альтернатив особо нет. Раньше пробовал github.com/phax/jcodemodel, даже сделал туда CSE оптимизацию, но это вообще слабый проект
Браво, вспомнил что читал вашу статью Статистика кода JDK 7. Отличный пример использования парсера Soon!
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории