Pull to refresh

Comments 17

Не устроил для кодогенерации или статического анализа? И какой из (там много всего написано)?
Так а что там про анализ? Там всё про AOP и кодогенерацию. Разве что GroovyCodeVisitor, но про него я написал. Буду рад узнать если что-то упустил из виду!
Я про то что вы используете java код, там где возможно было бы использовать встроенные в язык groovy средства. Интересно чем не устроило то что есть?
Парсинг AST же есть в groovy, как и его трансформация
1. AST дерево я получаю из Groovy (ну, это понятно)
2. трансляции в glsl, Groovy metaprogramming никак не поможет. Мне нужна на выходе вполне конкретно оформленная строчка. Вот это оформление и описано в «перегруженных функциях». Ещё можно было бы использовать Visitor-pattern, но это уже дело вкуса. Кода и так и так не много.
3. анализ кода. Получение данных о том, какой параметр (или его поле) в качестве какого аргумента передаётся. Как используются поля (или уже ИХ поля). И т.п. На эту тему в приведённой вами документации ничего нет.
Спасибо за подробное объяснение! Для меня пункт 1 был не очевиден)
Добрый день!
Спасибо за интересную статью!
Просветите, пожалуйста, по поводу следующих нубовских вопросов:
В шейдерах код же исполняется native? А как решается вопрос с GC, как очищаются объекты? Или их нельзя создать? И можно ли создать свои классы?
Можно ли подобным образом компилировать Java код в C++? Я как-то нашёл проект для компиляции Java в C++ для микроконтроллеров (например, Arduino) — называется HaikuVM. И насколько я понял, там используется похожий принцип по разбору AST, но генерируется C++ который больше похож на байт код — по сути каждая инструкция из байт кода — преобразуется в вызов C функции с таким же названием. А у Вас же, насколько я понял, генерируется исходный код, который практически соответствует исходному Java коду. Или не так?
Отличные вопросы!
1. в System.out можно увидеть какой именно код отдаётся на видеокарту. Он похож на код в Groovy, но исполняется как просто отдельно написанный, и с Groovy или JVM никак не связан. Никакого GC, конечно.
2. свои объекты создать нельзя, хотя у меня есть планы это реализовать (но там магия, и у меня сейчас нет задачи нуждающейся в таком). Сейчас можно использовать только то, для чего есть аналоги в glsl — примитивы, вектора, матрицы, текстуры.
3. например, строчка vector1 = vector2 — в Groovy означает копирование указателя, а в glsl означает копирование значений. Поэтому при исполнении этой строчки в Groovy и в glsl будет разный эффект. Но хочется мочь запускать тесты, поэтому для нахождения таких мест и сообщения об ошибке я использую анализ синтаксического дерева, о котором и есть эта статья.
4. Да, код синтаксически очень похож. Насчёт Java->С++, — чтобы провернуть такую компиляцию, надо либо имплементить GC на таргет платформе, либо в Java в явном виде использовать деструкторы или пулы. Либо использовать какую-то её ограниченную версию, как в моём подходе.
Добрый день!
Я сейчас пробую написать преобразователь Java кода в Arduino код (практически C).
Я так понимаю, это похоже на то что Вы делали. Но Вы используете Groovy, а я на чистой Java решил попробовать. Для анализа кода решил использовать ASTParser от Eclipse. И сразу возникло несколько вопросов. Каким образом Вы с исходниками работали? С помощью средств Groovy или ASTParser (хотя он вроде только для Java кода)? И как генерировали результирующий код из Java кода? Я сначала думал что ASTParser позволит просто изменить исходный код — т.е. по ходу парсинга в ASTVisitor изменяем текущую сущность, если надо, и дальше получаем исходник. Но как я понял, для этого используется другая сущность — ASTWriter, которая работает только для редактирования. А это мне вроде как не подходит. Поэтому возник второй вариант — самому формировать исходный код — например, формировать StringBuilder который при парсинге в ASTVisitor будет дополняться кодом. Вообще, может у вас какие нибудь идеи есть по этому поводу?
Groovy я парсил с помощью org.codehaus.groovy.ast.builder.AstBuilder. Генерировал код простым составлением строчки. Вот здесь есть несколько методов translateExpression(node type) (заметьте, в Groovy перегрузка методов работает в рантайме, а в Java придётся ифами разбирать). Т.е. фактически я просто руками разбирал дерево. «Если это нода бинарного оператора, то вызвать для левой ветви...», в таком стиле. Первый пункт этой статьи именно об этом. Ещё можно использовать Visitor (наверняка рядом с вашим парсером лежит рядом) и формировать, как вы и решили, строчку в StringBuilder.
Именно то что я хотел узнать, спасибо!
Относительно недавно в Groovy смержили мой MacroGroovy, и Cedric там поверх него делал ASTMatcher-ы, советую глянуть:
github.com/apache/incubator-groovy/tree/master/subprojects/groovy-macro
github.com/apache/incubator-groovy/blob/master/subprojects/groovy-macro/src/test/groovy/org/codehaus/groovy/macro/matcher/ASTMatcherTest.groovy

Про сам MacroGroovy можно почитать мою же статью:
habrahabr.ru/post/205084
Интересно, спасибо. Я так понял матчер только отвечает на вопрос о совпадении, и никакой больше инфы не отдаёт?
сейчас вроде как да. Но если тебе интересна тема этого матчера то советую поднять этот вопрос в email листе groovy, Cedric будет рад увидеть заинтересованность
Sign up to leave a comment.

Articles