Статьи

Groovy AST Browser: теперь в Интернете

В этой статье представлена ​​веб-версия инструмента 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.