Apache Groovy

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 22:37, 28 октября 2016.
Groovy
Groovy-logo
подпись
Спроектировано James Strachan
Разработчики Guillaume Laforge (PMC Chair)
Jochen Theodorou (Tech Lead)
Paul King
Cedric Champeau
Первый   появившийся 2003; 16 years ago (2003)
Стабильная версия 2.4.7 / 7 June 2016 года; 3 years ago (2016-06-07)
Платформа Java SE
Лицензия Apache License v2.0
Расширение файла .groovy
Под влиянием
Java, Python, Ruby, Perl, Smalltalk, Objective-C

Groovy — объектно-ориентированный язык программирования, разработанный для платформы Java как дополнение к языку Java с возможностями Python, Ruby и Smalltalk.[1]

Разработчики динамического объектно-ориентированного языка программирования Groovy подали заявку на принятие своего проекта в инкубатор Apache, c перспективой последующего включения в список проектов Apache Software Foundation. Groovy работает внутри виртуальной машины Java, и может использоваться как в Java-проектах, так и в качестве скриптового языка.

Решение о переходе проекта в фонд ASF было принято после прекращения финансирования Pivotal разработчиков Groovy.

История

Джеймс Страчан сначала говорили о развитии Groovy на своем блоге в августе 2003 года. Несколько версий были выпущены в период между 2004 и 2006 годах После процесса Java Community Process (JCP) Процесс стандартизации начался, и версия под названием "1.0" была выпущен 2 января 2007.

  • В 2007 году Groovy выиграл первый приз на JAX 2007 Innovation Award.
  • В 2008 году, Grails, заводной фреймворк, занял второе место на инновационной премии JAX 2008 года. [7]
  • В ноябре 2008 года SpringSource приобрела компанию Groovy и Grails (G2One).
  • В августе 2009 года VMWare приобрела SpringSource.
  • Страчан покинул проект молча за год до Groovy версии 1.0 в 2007 году.
  • В марте 2004 года Groovy был представлен в качестве JCP JSR 241 и принят голосованием.
  • После 8 лет бездействия Spec Свинец изменил свой статус в латентном состоянии в апреле 2012 года.
  • 2 июля 2012 был выпущен Groovy 2.0 , который, наряду с другими новыми функциями, добавил статической компиляции и статической проверки типов на Groovy.
  • Когда Pivotal совместное предприятие выделившихся по EMC и VMware в апреле 2013 года, Groovy и Grails составляли часть своего продуктового "портфеля". Спонсирование Groovy и Grails было прекращено с апреля 2015.
  • В том же месяце, Groovy изменил свою структуру управления из хранилища Codehaus в комитет по управлению проектом (КУП) в Apache Software Foundation через свой инкубатор.

Версии Groovy

Существует несколько версии языка Groovy. В данной статье поговорим лишь о некоторых из них.

Groovy 2.3

  • Groovy 2.3 является новым крупным релизом Groovy, показывая официальную поддержку для запуска Groovy на JDK 8, черты, новые и улучшенные AST преобразования, как TailRecursive, Builder и Sortable, новый модуль NiO 2 с поддержкой Path, молниеносный JSON синтаксического анализа , закрытие типа параметра логического вывода, Groovysh и GroovyConsole простота использования улучшений, новый тест GroovyAssert, возможности более высокого BaseScript класса, и многое другое.
  • Это первая версия Groovy,которая официально совместима с JDK 8.
  • JDK 8 и его методы интерфейса по умолчанию введена некоторая несовместимость с несколькими методами комплекта разработки Groovy, так что пришлось адаптироваться к ситуации, внося незначительные изменения.
  • Обратите внимание, что планируется портировать изменения в старых версиях Groovy, так что если вы хотите запустить Groovy на JDK 8, вам придется перейти на данную версию Groovy!
  • Groovy 2.3 не поддерживает новые синтаксические конструкции, предлагаемые Java 8 (например, ссылки метод, методы по умолчанию в интерфейсов и т.д.), но вы можете очень хорошо уже использовать новые API-интерфейсы, предоставляемые JDK 8, и даже использовать Groovy закрытия вместо Java 8.
  • Для справки, вот несколько примеров, которые используют Java 8 потоков для итерации над потоком Интс, или по линиям файла:
    IntStream.range(1, 100).forEach { println it }
    Files.lines(Paths.get('README.adoc'))
    .map { it.toUpperCase() }
    .forEach { println it }
    

В частности, обратите внимание, что Groovy обеспечивает механизм закрытия принуждения, который преобразует Groovy замыкание в функциональный интерфейс - в отличие от Java.

Основные черты

  • Основным событием для groovy 2.3 - это введение понятие "черты характера".
  • Они представляют собой повторно используемые компоненты поведения, которые классы могут реализовывать, а также являются дополнительным объектно-ориентированными концепциями наряду с классами и интерфейсами.Например :
     
    trait FlyingAbility {
    String fly() { "I'm flying!" 
    }
    }
    class Bird implements FlyingAbility {}
    def b = new Bird()
    assert b.fly() == "I'm flying!"
    trait Named {
    String name
    }
    class Bird implements Named {}
    
  • Мы можем инстанцировать Bird с именем параметра ярлык конструктор, предоставляемый groovy:
    def b = new Bird(name: 'Colibri')
    assert b.name == 'Colibri'
    
  • Черты поддерживают наследование, которое можно расширить или реализовать интерфейс, как показано ниже:
     
    trait Named { String name }
    trait FlyingAbility extends Named {String fly() { "I'm a flying ${name}!" }
    }
    class Bird implements FlyingAbility {}
    def b = new Bird(name: 'Colibri')
    assert b.name == 'Colibri'
    assert b.fly() == "I'm a flying Colibri!"
    
  • Черты совместимы со статической проверкой типов и компиляции, а также обычного динамического поведения. Черты смешанные в методы на самом деле являются "настоящими" методами (то есть. Видимые Java), а не только динамические.
  • Черты также могут быть реализованы во время выполнения с так или withTraits, если вы просто хотите добавить поведение признака к объекту вы инстанцировании, без необходимости создавать промежуточный искусственный класс :
     
    trait named { String name }
    trait Quacks {
    String quack() { 'Quack!' }
    }
    class Animal {}
    def na = new Animal().withTraits Named, Quacks
    na.name = 'Daffy'
    assert na.name == 'Daffy'
    assert na.quack() == 'Quack!'
    

Новые преобразования

  • TailRecursive

добавляется хвостовая рекурсия для методов, которые являются рекурсивными и называются в последней операции способом, который помогает избежать перегрузку стека при рекурсивных вызововах (groovy-6570).

А вот немного переписана реализация факториала:
import groovy.transform.TailRecursive
TailRecursive
def fact(BigInteger n, accu = 1G) {
if (n < 2) accu
else fact(n - 1, n * accu)
}
assert fact(1000) > 10e2566
  • Builder

Преобразование Builder предлагает различные стратегии реализации, которые вы можете выбрать:

  • cтратегия по умолчанию, которая создает вложенный вспомогательный класс для создания экземпляра
  • стратегия инициализатор, которая создает вложенный вспомогательный класс для создания экземпляра, который при использовании с CompileStatic позволяет создавать безопасный объект.
Вот пример со стратегией по умолчанию:
import groovy.transform.builder.Builder
Builder
class Person {
String firstName
String lastName
int age
}
def person = Person.builder()
.firstName("Robert")
.lastName("Lewandowski")
.age(21)
.build()

assert person.firstName == "Robert"
assert person.lastName == "Lewandowski"
assert person.age == 21
  • Sortable

реализует методы сравнения , по заданным данным свойств (groovy-6649).

Для следующего класса человека, его экземпляры будут отсортированы по фамилии, затем по имени, и по возрасту, в следующем порядке:
import groovy.transform.
Sortable
Canonical
class Person {
String last
String first
int age
}
def folks = [
new Person('Simpson', 'Bart', 12),
new Person('Simpson', 'Homer', 40),
new Person('Kent', 'Clark', 36)
]
assert folks.sort()*.first == ['Clark', 'Bart', 'Homer']
  • SourceURI

Вы можете аннотировать java.net.URI или даже переменную сценария или поле класса java.lang.String, так что переменная или поле инжектируются(вводятся) URI в Groovy файла.

Если оценивать компиляции Groovy сценария или класса, переменная или поле будет содержать данные URI, например:
import groovy.transform.SourceURI
SourceURI String src
println src
data:,import%20groovy.transform.SourceURI%0A%0A@SourceURI%20String%20src%0A%0Aprintln%20
file:/tmp/sourceuri.groovy

Новый модуль NIO для Java 7+

  • На JDK 7 и за его пределами, вы можете воспользоваться теми же методами, и теми же файлами, что для нового класса NiO.
  • Вы найдете знакомые методы Groovy ,на файл также доступен на путь:
    path.withReader { Reader r -> ... }
    path.eachLine { String line -> ... }
    path.eachFileRecurse { Path p -> ... }
    path << 'some content'
    path << bytes
    path.readLines()
    

Повышение производительности

  • Различные мелкие улучшения производительности по всем направлениям, для статической компиляции, а также "нормальный" динамический Groovy, были разработаны .
  • Поддержка Groovy в формате JSON был переработан и ориентирована на производительность, что позволяет Groovy 2.3 поддерживать JSON, как правило, быстрее, чем все библиотеки в формате JSON, доступных в экосистеме Java.

Усовершенствования инструментов

  • Groovysh

Наряду со слегка уменьшенным временем запуска, Groovysh предлагает новые улучшения в коде завершения функции:

завершение ключевых слов (groovy-6399)

выполнения свойств (groovy-6395)

команды теперь с префиксом `:" (groovy-6397)

  • GroovyConsole

Теперь можно настроить шрифт, используемый в консоли (Groovy-6303, хотя и без диалогового окна пользовательского интерфейса), а также иметь возможность запускать выбранный фрагмент,при повторном использовании импорта, в определенном сценарии, что позволяет легче просто запустить быстрые фрагменты вашего сценария.

Возможность комментировать или раскомментировать выбранный код, нажав Ctrl + (функция была добавлена ​​с помощью Groovy-6459).

Критические изменения

  • Groovy 2.3.0 вводит ограниченный список изменений.
  • Прежде всего, Groovy 2.3.0 теперь требует JDK 6 в качестве минимального требования JDK. Некоторые части Groovy 2.3.0 по-прежнему могут работать под JDK 5, но тестирование не было сделано на этой платформе, и некоторые части, как известно, могут не работать. Компания призывает всех, чтобы перейти, по крайней мере,на JDK 6.
  • Не смотря на то, что разработчики не встречали, какой-либо конкретной поломкой до сих пор, статический тип проверки может сообщать новые ошибки. Если когда-нибудь вы столкнетесь такими новыми ошибки в этой области, пожалуйста, сообщите о них разработчикам, как только вы столкнетесь с ними.
  • С введением "черт" в Groovy 2.3, признак ключевого слова является дополнением к списку ключевых слов из языков, вследствие чего переменные или поля, которые будут использовать в качестве имени признака с выходом могут создать ошибку компиляции. Так что вам придется изменить имя переменной и перекомпилировать ваш код.
  • Несколько обновления были сделаны для поддержки XML вокруг пробелов обработки и обработки текстового узла:
  • GROOVY-6685
  • GROOVY-6683
  • GROOVY-6682
  • GROOVY-6678
  • GROOVY-6621[2]

Groovy 2.4

Поддержка на Android

  • С помощью Groovy 2.4, вы можете написать Android приложения в Groovy!
  • Быстрое руководство по началу работы можно найти на веб-сайте Groovy.
  • Для того, чтобы построить свое Android приложение с поддержкой Groovy, вы будете иметь возможность использовать плагин Gradle Groovy Android.
  • Библиотека SwissKnife основывается на Groovy , чтобы предложить очень полезные преобразования , которые "убивают" обычный код Android шаблонный, например, для работы с событиями пользовательского интерфейса, с логикой, чтобы работать в фоновых потоках.
  • Для более глубокого понимания новой Android поддержки, вы можете прочитать следующие статьи:

Введение: [1]

Технические детали: [2]

  • Работа над Android поддержке также может привести к различным оптимизациям с точки зрения генерации байт-кода, а также, например, улучшить обработку перегруженных сеттеров (GROOVY-2049, GROOVY-6084, GROOVY-2500), которые часто в используются Android SDK.

Повышение производительности

  • Этот новый крупный релиз Groovy видел различные улучшения по всем направлениям,чтобы снизить потребление памяти внутренних структур данных, точной настройки байт-кода для лучшей производительности.

Вот некоторые из новшества :

  • Дешевле операции сравнения (GROOVY-7194)
  • Снижение потребления памяти (GROOVY-7178)
  • Удаление временной метки в Groovy классов (GROOVY-6308)
  • Оптимизация конверсии примитивного типа с оператором (как Groovy-7140)
  • Вот конкретный пример SelfType в действии((GROOVY-7134).
 
import groovy.transform.*
class Component 
{
 println "Done!"
}
}
SelfType(Component)
TypeChecked
trait ComponentDecorator 
{
void logAndDoSomething()
{
println "Going to do something"
doSomething()
}
}
class ConcreteComponent
extends Component
implements ComponentDecorator {}
def c = new ConcreteComponent()
c.logAndDoSomething()

Улучшения GDK

Используйте :

  • System.currentTimeSeconds (), чтобы получить текущее время в секундах (GROOVY-6294)
  • Список # getIndices (), чтобы получить диапазон, представляющий собой индексы элементов списка (GROOVY-7171)
  • Уточнения для существующих методов сбора, используя Iterable, подходит для потока подобных обходов, последовательности изменений , незначительные оптимизации и т.д. (GROOVY-6945)
  • Новый список # RemoveAt (индекс) и Collection # removeElement (Object) методы (GROOVY-6952)

AST преобразования

  • Преобразование ToString предлагает параметр includeSuperProperties ,поэтому свойства из суперкласса также присутствуют в строковом представлении (GROOVY-7161)
  • Вы можете определить фазу компиляции для ASTTest преобразования для тестирования ваших AST преобразований (GROOVY-6968)
  • Synchronized Поддерживает явные статические замки, которые будут использоваться методы экземпляра при необходимости (GROOVY-7030)
  • Очистка сгенерированного кода для AutoExternalizable (GROOVY-6889) и EqualsAndHashCode (GROOVY-6893) при использовании в @CompileStatic
  • По умолчанию улучшенная интеграция Java (GROOVY-6875)

Groovysh улучшения

  • Groovysh оболочка продолжает видеть некоторые полезные усовершенствования:
  • Groovysh поддерживает пользовательские .rc и .profile скрипты, которые будут загружены при старте (GROOVY-6943)
  • завершение заявлений InstanceOf (GROOVY-7200)
  • завершение статических членов отображается только в статическом контексте (GROOVY-6622)
  • завершения в цвете (GROOVY-6563)
  • команда: нагрузка поддерживает имена файлов, содержащие пробелы (GROOVY-6942)
  • делают аргументы и флаги, совместимые с заводной командой и разрешается запуск скрипта при запуске, переданного в качестве аргумента и продолжается выполнение Groovysh (GROOVY-6754)
  • Теперь о легче создать подкласс Groovysh для повторного использования в качестве встроенной оболочки (GROOVY-6752)
  • NamespaceBuilder позволит автоматически обнаруживать объявления пространств имен (GROOVY-6890)
  • Чтобы осуществить и зарегистрировать расширения проверка типов, подклассы TypeCheckingExtension (GROOVY-6739)
  • Улучшенный тип проверки для некоторых методов GDK (GROOVY-6966)
  • Теперь HTTPS используется для повышения уровня безопасности (GROOVY-7152)
  • Параметры DelegatesTo и ClosureParams лучше выровнены (GROOVY-6956)
  • Множественные этикетки поддерживаются на том же операторе (GROOVY-3298)

Критические изменения

  • Имена Malformed класса для замыканий во внутренних классах (GROOVY-5351)
  • Сокращение потребления памяти для respondsTo () (GROOVY-7178)
  • Создание Groovysh легче сделать расширяемым и встраиваевымым (GROOVY-6752)[3]

Groovy присоединяется к Apache Software Foundation

Интервью InfoQ и представителя Groovy (далее L)

InfoQ: Был ли это предложение для инкубации было подано?

  • L.: Мы действительно представили Groovy для инкубации в Apache Software Foundation. Решение это было сделано и объявлено. В настоящее время мы работаем над предложением, которое будет представлено. Ранний проект можно увидеть на https://wiki.apache.org/incubator/GroovyProposal.

InfoQ : в дискуссии вы упомянули,что есть несколько аспектов которыми вы будете иметь дело с в течение этого инкубационного процесса". С чего вы начнете?

  • L.: Первый аспект - этонаш непрерывный процесс доставки / развертывания, который является легко осуществляется, благодаря Gradle для нашей сборки, JetBrains TeamCity для непрерывной интеграции, и Artifactory JFrog и Bintray для доставки наших бинарных файлов. Это довольно легко сделать в любое время, вам просто нужно заполнить форму с некоторыми метаданными (название версии, следующей версии, и т.д.), и вы нажимаете кнопку, и вуаля, через час, все это доступно в Интернете, артефакты а также онлайн-документация и веб-сайт обновлений!

В Apache, процесс немного отличается, что требует некоторых ручных действий, чтобы дать печать одобрения, если не сказать, что источники действительно соответствуют правилам Apache (относительно IP и т.д.). Это означает, что мы должны адаптироваться к этому процессу, и изменить наши привычки , что сделать этот аспект не менее удобым.

Еще одно беспокойство у нас было о финансировании. С объявлением прекращения финансирования со стороны Pivotal, у нас было несколько компаний и частных лиц, контактирующих с нами, которые были заинтересованы в жертве средства для проекта. Фонд Apache Software не принимает пожертвования для конкретных индивидуальных проектов фонда, но может быть на самом деле пути вокруг этого, в качестве основы экспериментирует в этой области, а так же возможны партнерские отношения с внешними фондами.

Необходимо привыкнуть к этим изменениям, чтобы обновить наш процесс выпуска, чтобы увидеть, как мы можем продолжать, чтобы облегчить вклады от сообщества, а также рассмотреть некоторые перспективные решения для финансирования. Таким образом, мы вполне оптимистично на всех этих фронтах, и наставники здесь, чтобы помочь нам через этот процесс.

InfoQ: У вас есть график, когда вы надеетесь получить выгоду ?

  • L.: Наши обсуждения с различными руководителями Apache, участвующими в обсуждении (в частности, тех, кто будет нашим наставниками) намекают на короткие сроки + - 3 месяца.

Я не думаю, что процесс инкубации может быть полностью предсказуемым, но, поскольку Groovy является довольно популярным проектом, с активным сообществом и экосистемы, я надеюсь, что этот процесс должен быть довольно быстр и прост.

InfoQ: Существуют ли какие-либо конкретные проекты Apache, которые могли бы стать следующим шагом Groovier ?

  • L.: Есть уже некоторые проекты Apache, перечисленные в предложении инкубационного, которые с помощью Groovy, как Apache Camel, в BigTop, OFBiz и другие. Есть много проектов в сферах Hadoop, которые могли бы извлечь выгоду из хорошей и тесной интеграции Groovy.

InfoQ: Какой статус у Grails? Надеетесь ли Вы переместить его в ASF ?

  • L.: Для Grails, ни одно решение не было принято еще; он будет остаться в качестве отдельного проекта. Вслед за тем, насколько успешно будет наша миграция в Apache Foundation, присоединение Grails может быть вариантом для рассмотрения. Но до сих пор, никаких дальнейших шагов миграции или не запланировано.[4]

Установка Groovy

Официальный сайт ASF предлагает установить версию groovy : [3]

Так же скачать версию 2.4.7 вы можете здесь [4]

Примечания

  1. Allied Telesis[Электронный ресурс] : Материал из Википедии — свободной энциклопедии:https://ru.wikipedia.org/wiki/Groovy — Режим доступа :https://ru.wikipedia.org/wiki/Groovy
  2. Apache Groovy [Электронный ресурс]: Материал из :http://groovy-lang.org/releasenotes/groovy-2.3.html — Режим доступа:http://groovy-lang.org/releasenotes/groovy-2.3.html(англ)
  3. Allied Telesis [Электронный ресурс]: Материал из :http://groovy-lang.org/releasenotes/groovy-2.4.html — Режим доступа:http://groovy-lang.org/releasenotes/groovy-2.4.html(англ)
  4. Apache Groovy [Электронный ресурс]: Материал из: https://www.infoq.com/news/2015/03/groovy-moving-to-apache — Режим доступа: https://www.infoq.com/news/2015/03/groovy-moving-to-apache (англ)