В этой статье представлена веб-версия инструмента Groovy AST Browser — http://groovyastbrowser.appspot.com/ .
Что такое Groovy AST?
Groovy-компилятор отображает исходный код Groovy в виде дерева, называемого Абстрактным синтаксическим деревом (AST). Компилятор сканирует и преобразует это дерево исходных текстов на разных этапах и, наконец, генерирует байт-код, используя окончательный преобразованный AST. В дополнение к прямому сопоставлению исходного кода с AST, 2 другими основными источниками изменений AST являются:
- Модификации AST, сделанные самим компилятором, чтобы сделать возможными многие функции Groovy, такие как MOP или сокращение кода шаблона и т. Д.
- Функция AST Transformations , которая позволяет начинающим пользователям подключаться к процессу компиляции и манипулировать средним способом AST, чтобы конечный код генерировался по их желанию.
Примером компилятора, вводящего изменения AST, будет генерация геттеров / сеттеров для свойств groovy, как показано ниже:
Код предоставлен пользователем:
class Test {
String name
}
Приведенный выше класс модифицируется компилятором groovy, как показано ниже, где методы getName () и setName () не предоставляются пользователем, а генерируются компилятором groovy, чтобы избавить пользователя от предоставления такого стандартного кода:
class Test {
private String Name
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Примером изменений AST, представленных Groovy AST Transformations, может быть использование аннотации @Delegate, предоставляемой groovy:
Код предоставлен пользователем:
class NewList {
@Delegate List list = new ArrayList()
}
Приведенный выше код преобразуется с помощью groovy, как показано ниже, так что вы можете использовать все вызовы ArrayList, сделанные для экземпляров NewList, которые прозрачно делегируются в закрытое поле «список»:
class NewList implements List, Iterable, Collection {
private List list = new ArrayList();
public boolean add(Object item) {
list.add(item);
}
public int size() {
return list.size();
}
...
...
...// all other members of the ArrayList class
...
}
Изучение AST в различных сценариях на разных этапах компиляции может сильно помочь понять, как работает внутренность.
Готовая к установке Groovy поставляется с двумя инструментами — Groovy Console и Groovy AST Browser — в то время как Groovy Console позволяет быстро экспериментировать с языковыми функциями, AST Browser помогает визуализировать, как Groovy-компилятор полностью обрабатывает ваш исходный код до его окончательной формы — байт-код и как он преобразует его на пути в несколько этапов.
Хотя это прекрасно, если эти инструменты установлены локально, доступность этих инструментов онлайн предоставляет альтернативу тем, кто не хочет иметь локальную установку, но все же хочет экспериментировать с языком, исследовать его различные функции и т. Д. отличная дискуссия с вашим рубином, скалой или другими не-хорошими коллагенами — разве такие онлайн-инструменты не будут там полезны?).
В то время как http://groovyconsole.appspot.com/ сделал Groovy Console доступным в Интернете, отсутствующим элементом был браузер AST Groovy. Теперь AST Groovy-источника можно исследовать онлайн здесь: http://groovyastbrowser.appspot.com/
Как может помочь браузер AST?
Скажем, вы хотели понять, как «println ‘hello world’» работает в Groovy и как он сопоставлен с классом для JVM?
Вот ответ, показанный Groovy AST Browser — он показывает, что ваш 1-строчный скрипт привел к созданию полного класса, сгенерированного groovy — у него есть метод main (args), а код вашего скрипта стал частью метода run () (который внутренне вызывается из main ())
Пример 1: 1-строчный скрипт, преобразованный в полный класс Groovy
Далее следует AST, показанный для примера @Delegate, рассмотренного выше, и он ясно показывает, как методы типа делегата добавляются к типу делегирования, и все эти методы в основном перенаправляют вызовы к объекту делегата:
Пример 2: AST для использования @Delegate AST Transformation
Одна небольшая особенность, которую стоит упомянуть об этом браузере AST, — это опция «Включить синтетических членов». Groovy генерирует много искусственных членов для поддержки своей внутренней работы — например, для поддержки своих функций MOP. Иногда вы можете захотеть исследовать этих искусственных участников, а иногда вы можете пожелать, чтобы они отошли от вашего взгляда. Параметр «Включить синтетических членов» можно использовать для того же. Ниже приведены 2 снимка AST для одного и того же кода — один с внутренне используемыми методами Groovy, а другой без них:
Ex 3: An AST snapshot with synthetic members:
Ex 4: An AST snapshot without synthetic members:
Finally, if you are interested in exploring the AST for a given piece of code across various compilation phases, you can use the «phase» selector on the AST Browser and refresh the AST generated for that phase, as shown below:
Ex 5: Exploring AST across various compilation phases
That’s all there is to this web-based Groovy AST Browser. I hope, the information provided in the article and the web-based version of the Groovy AST Browser, are useful to you.